Quais são alguns dos recursos menos conhecidos, mas importantes e úteis, dos arquivos em lotes do Windows?
Diretrizes:
- Um recurso por resposta
- Dê uma breve descrição do recurso e um exemplo , não apenas um link para a documentação
- Limite as respostas à funcionalidade nativa , ou seja, não requer software adicional, como o Windows Resource Kit
Esclarecimento: Nos referimos aqui aos scripts que são processados pelo cmd.exe, que é o padrão nas variantes do WinNT.
(Veja também: Arquivos em lote do Windows: .bat vs .cmd? )
windows
batch-file
hidden-features
Chris Noe
fonte
fonte
call C:\WINDOWS\system32\ntbackup.exe backup /V:yes /R:no /RS:no /HC:off /M normal /L:s @daily.bks /F daily.bkf
. E para entender todos os parâmetros dessa linha, basta executarC:\WINDOWS\system32\ntbackup.exe /?
.Leva você ao diretório especificado pelo caminho .
Leva você de volta ao diretório do qual você "empurrou".
fonte
Não tenho certeza de quão útil isso seria em um arquivo em lotes , mas é um comando muito conveniente para usar no prompt de comando:
Isso abrirá o Windows Explorer na pasta "some_directory".
Eu achei isso uma grande economia de tempo.
fonte
open .
faça o mesmo.start
faz muito mais do que apenas abrir a pasta atual. Você pode transmitir qualquer arquivo e ele será aberto com o visualizador configurado. Dê-lhe um URL e seu navegador padrão é aberto, etc ...Sempre achei difícil ler comentários marcados por uma palavra-chave em cada linha:
Mais fácil de ler:
fonte
rem
é uma palavra-chave documentada, enquanto::
é apenas um detalhe de implementação. Embora seja improvável que::
isso pare de funcionar, geralmente é aconselhável não confiar em comportamentos não documentados.goto :
para pular para o rótulo.:-)
egoto -)
também irá funcionar.Substrações variáveis:
fonte
for %a in ...
), pois elas não exigem o sinal de porcentagem de fechamento, assim como as variáveis de ambiente; você deve primeiro atribuí-los a uma variável de ambiente (usando expansão atrasada!) e depois extrair uma substring.O comando FOR ! Embora eu odeie escrever arquivos em lote, sou grato por isso.
analisaria cada linha em myfile.txt, ignorando as linhas que começassem com ponto e vírgula, passando o segundo e o terceiro token de cada linha para o corpo for, com tokens delimitados por vírgulas e / ou espaços. Observe as instruções do corpo for referência% i para obter o segundo token,% j para obter o terceiro token e% k para obter todos os tokens restantes após o terceiro.
Você também pode usar isso para percorrer diretórios, conteúdo de diretórios, etc.
fonte
Em vez de agrupar um script com REM ou :: lines, faço o seguinte na parte superior de cada script:
Observe como você pode usar os caracteres de canal e redirecionamento sem escapar deles.
fonte
O caminho (com unidade) em que o script está: ~ dp0
fonte
A parte% ~ dp0 já foi mencionada, mas na verdade há mais: os caracteres após o ~ definem as informações que são extraídas.
Nenhuma letra resulta no retorno do nome do arquivo de correção
d - retorna a letra da unidade
p - retorna o caminho
s - retorna o caminho curto
x - retorna a extensão do arquivo
Portanto, se você executar o script test.bat abaixo no arquivo c: \ Temp \ nome do diretório longo \ pasta,
você obtém a seguinte saída
E se um parâmetro for passado para o seu script como em
teste c: \ temp \ mysrc \ test.cpp
as mesmas manipulações podem ser feitas com a variável% 1.
Mas o resultado da expansão de% 0 depende da localização!
No "nível superior" do lote, ele se expande para o nome do arquivo do lote atual.
Em uma função (chamada), ela se expande para o nome da função.
A saída é (o batchfile é iniciado com myBatch.bat)
fonte
Usando CALL, EXIT / B, SETLOCAL & ENDLOCAL, você pode implementar sub-rotinas com variáveis locais.
exemplo:
Isso imprimirá
mesmo que: sub modifique x.
fonte
Truque furtivo para esperar N segundos (não faz parte do cmd.exe, mas não é um software extra, pois vem com o Windows), consulte a linha de ping. Você precisa de pings N + 1, pois o primeiro ping sai sem demora.
fonte
Escapando do "encanamento":
fonte
HEAD^
) é problemática.Ser capaz de executar comandos e processar a saída (como backticks de '$ ()' no bash).
Se houver espaços nos nomes de arquivos, use o seguinte:
fonte
Criando um arquivo vazio:
fonte
type nul > filename.ext
para isso.ren > blah.txt
Para ocultar toda a saída de um comando, redirecione para> nul 2> & 1.
Por exemplo, alguns programas de linha de comando exibem a saída mesmo se você redirecionar para> nul. Mas, se você redirecionar a saída como a linha abaixo, toda a saída será suprimida.
EDIT: Consulte Ignorando a saída de um comando para obter uma explicação de como isso funciona.
fonte
taskkill
.Interrompe a execução e exibe o seguinte prompt:
Útil se você deseja executar um lote clicando duas vezes no Windows Explorer e realmente deseja ver a saída em vez de apenas um flash da janela de comando.
fonte
echo.|batch-with-pause.bat
terá o mesmo efeito que pressionar o 'any-chave' ...O equivalente da festança (e outras conchas)
que gera "
Hello
" sem uma nova linha à direita. Um cmd hack para fazer isso:set /p
é uma maneira de solicitar ao usuário a entrada. Emite a sequência especificada e aguarda (na mesma linha, ou seja, sem CRLF), para o usuário digitar uma resposta.<nul
simplesmente envia uma resposta vazia aoset /p
comando, para que o resultado líquido seja a sequência de prompt emitida. (A variável usada permanece inalterada devido à resposta vazia.)Os problemas são: Não é possível emitir um sinal de igual à esquerda, e no Vista os caracteres em branco em branco são removidos, mas não no XP.
fonte
Procure e substitua ao configurar variáveis de ambiente:
... remove o "/" de uma data para uso em nomes de arquivo com registro de data e hora.
e substrings também ...
fonte
Aritmética de número inteiro:
fonte
Separadores de comando:
Na 2ª linha, o comando após && é executado apenas se o primeiro comando for bem-sucedido.
Na terceira linha, o comando após || só é executado se o primeiro comando falhar.
fonte
Saída de uma linha em branco:
fonte
Você pode encadear instruções if para obter um efeito como um booleano de curto-circuito `e '.
fonte
if foo ( if bar ( baz ) )
(imagine novas linhas após os parênteses.)Para converter rapidamente um arquivo de texto Unicode (16 bits / char) em um arquivo ASCII DOS (8 bits / char).
como bônus, se possível, os caracteres são mapeados corretamente.
fonte
se estrutura de bloco:
fonte
%ERRORLEVEL%
qualquer maneira;if errorlevel <foo>
é para isso que serve. E isso de fato funciona em tais blocos.Expansão atrasada de variáveis (com substrings lançados para uma boa medida):
fonte
Não fornece muita funcionalidade, mas você pode usar o comando title para alguns usos, como fornecer status em um script longo na barra de tarefas ou apenas para aprimorar o feedback do usuário.
fonte
Não tem um editor à mão e precisa criar um arquivo em lotes?
Basta digitar os comandos, pressionar Enter para uma nova linha. Pressione Ctrl-Z e Enter para fechar o arquivo.
fonte
exemplo de subtração de seqüência de caracteres
date
etime
obter o arquivo chamado "AAAA-MM-DD HH: MM: SS.txt"Eu uso
color
para indicar se meu script termina com êxito, falhou ou precisa de alguma entrada alterando a cor do texto e do plano de fundo. Realmente ajuda quando você tem alguma máquina ao alcance da sua vista, mas bem distanteonde X e Y são valor hexadecimal de
0
paraF
, onde X - fundo, Y - texto, quando X = Y cor não será alterada.altera a cor do texto para 'Z' e define o plano de fundo preto; a 'cor 0' não funciona
para nomes de cores ligue
fonte
Controle total sobre a saída com caracteres de espaçamento e escape:
fonte
O SoftwareJedi já mencionou o comando for, mas vou mencioná-lo novamente, pois é muito poderoso.
A seguir, a saída atual da data no formato AAAAMMDD, eu uso isso ao gerar diretórios para backups.
fonte