Recursos ocultos de arquivos em lotes do Windows

Quais são alguns dos menos conhecidos, mas importantes e úteis resources de 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 documentação
  • Limite as respostas à funtionality nativa , ou seja, não requer software adicional, como o Windows Resource Kit

Esclarecimento: Referimo-nos aqui a scripts que são processados ​​pelo cmd.exe, que é o padrão nas variantes do WinNT.

(Veja também: Arquivos de lote do Windows: .bat vs .cmd? )

Continuação de linha:

call C:\WINDOWS\system32\ntbackup.exe ^ backup ^ /V:yes ^ /R:no ^ /RS:no ^ /HC:off ^ /M normal ^ /L:s ^ @daily.bks ^ /F daily.bkf 
 PUSHD path 

Leva você ao diretório especificado por caminho .

 POPD 

Leva você de volta ao diretório do qual você “empurrou”.

Não tenho certeza de como isso seria útil em um arquivo em lotes , mas é um comando muito conveniente para usar no prompt de comando:

 C:\some_directory> start . 

Isso abrirá o Windows Explorer na pasta “some_directory”.

Eu acho isso uma ótima economia de tempo.

Sempre achei difícil ler comentários marcados por uma palavra-chave em cada linha:

 REM blah blah blah 

Mais fácil de ler:

 :: blah blah blah 

Substrings variables:

 > set str=0123456789 > echo %str:~0,5% 01234 > echo %str:~-5,5% 56789 > echo %str:~3,-3% 3456 

O comando FOR ! Embora eu odeie escrever arquivos em lote, sou grato por isso.

 FOR /F "eol=; tokens=2,3* delims=, " %i in (myfile.txt) do @echo %i %j %k 

iria analisar cada linha em myfile.txt, ignorando as linhas que começam com um 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 para 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 iterar diretórios, diretórios, etc …

Em vez de lixo um script com REM ou :: lines, eu faço o seguinte no topo de cada script:

 @echo OFF goto :START Description of the script. Usage: myscript -parm1|parm2 > result.txt :START 

Observe como você pode usar o pipe e os caracteres de redirecionamento sem escaping deles.

O caminho (com drive) onde o script é: ~ dp0

 set BAT_HOME=%~dp0 echo %BAT_HOME% cd %BAT_HOME% 

A parte% ~ dp0 já foi mencionada, mas na verdade há mais: o caractere após definir as informações que são extraídas.
Nenhuma letra resulta no retorno do nome do arquivo de patch
d – retorna a letra da unidade
p – retorna o caminho
s – retorna o caminho curto
x – retorna a extensão do arquivo
Então, se você executar o script test.bat abaixo da pasta c: \ Temp \ long dir \ folder,

 @echo off echo %0 echo %~d0 echo %~p0 echo %~dp0 echo %~x0 echo %~s0 echo %~sp0 

você obtém a seguinte saída

 test c: \Temp\long dir name\ c:\Temp\long dir name\ .bat c:\Temp\LONGDI~1\test.bat \Temp\LONGDI~1\ 

E se um parâmetro é 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 é expandido para o nome do arquivo em lotes atual.
Em uma function (chamada), ela se expande para o nome da function.

 @echo off echo %0 call :test goto :eof :test echo %0 echo %~0 echo %~n0 

A saída é (o arquivo batch é iniciado com myBatch.bat)

 myBatch.bat :test :test myBatch 

Usando CALL, EXIT / B, SETLOCAL e ENDLOCAL você pode implementar sub-rotinas com variables ​​locais.

exemplo:

 @echo off set x=xxxxx call :sub 10 echo %x% exit /b :sub setlocal set /ax=%1 + 1 echo %x% endlocal exit /b 

Isto irá imprimir

 11 xxxxx 

mesmo assim: sub modifica x.

Truque furtivo para esperar N segundos (não faz parte do cmd.exe, mas não é software extra, já que vem com o Windows), veja a linha de ping. Você precisa de N + 1 pings desde que o primeiro ping saia sem demora.

  echo %time% call :waitfor 5 echo %time% goto :eof :waitfor setlocal set /a "t = %1 + 1" >nul ping 127.0.0.1 -n %t% endlocal goto :eof 

Escapando o “encanamento”:

 echo ^| ^< ^> ^& ^\ ^^ 

Ser capaz de executar comandos e processar a saída (como backticks de ‘$ ()’ no bash).

 for /f %i in ('dir /on /b *.jpg') do echo --^> %i 

Se houver espaços em nomes de arquivos, use isto:

 for /f "tokens=*" %i in ('dir /on /b *.jpg') do echo --^> %i 

Criando um arquivo vazio:

 > copy nul filename.ext 

Para ocultar todas as saídas de um comando redirecionado para> nul 2> & 1.

Por exemplo, alguns programas de linha de comando exibem saída mesmo se você redirect para> nul. Mas, se você redirect a saída como a linha abaixo, toda a saída será suprimida.

 PSKILL NOTEPAD >nul 2>&1 

EDIT: Veja Ignorando a saída de um comando para uma explicação de como isso funciona.

 PAUSE 

Pára a execução e exibe o seguinte prompt:

  Pressione qualquer tecla para continuar .  .  . 

Útil se você deseja executar um lote clicando duas vezes no Windows Explorer e deseja realmente ver a saída, em vez de apenas um flash da janela de comando.

O equivalente do bash (e outros shells)

 echo -n Hello # or echo Hello\\c 

que produz ” Hello ” sem uma nova linha à direita. Um cmd hack para fazer isso:

  

set /p é uma maneira de solicitar a input do usuário. Ele emite a string dada e, em seguida, aguarda (na mesma linha, ou seja, não CRLF), para o usuário digitar uma resposta.

simplesmente canaliza uma resposta vazia para o comando set /p , então o resultado da rede é a string de prompt emitida. (A variável usada permanece inalterada devido à resposta vazia.)

Os problemas são: Não é possível gerar um sinal de igual à esquerda, e os caracteres em branco iniciais do Vista são removidos, mas não no XP.

Pesquise e substitua ao definir variables ​​de ambiente:

 > @set fname=%date:/=% 

… remove o “/” de uma data para uso em nomes de arquivos com timestamp.

e substrings também …

 > @set dayofweek=%fname:~0,3% 

Aritmética Integral:

 > SET /A result=10/3 + 1 4 

Separadores de Comando:

 cls & dir copy ab && echo Success copy ab || echo Failure 

Na segunda linha, o comando após && só será executado se o primeiro comando for bem-sucedido.

Na terceira linha, o comando depois || só é executado se o primeiro comando falhar.

Saída de uma linha em branco:

 echo. 

Você pode encadear instruções if para obter um efeito como um booleano `e ‘de curto-circuito.

 if foo if bar baz 

Para converter rapidamente um arquivo de texto Unicode (16bit / char) em um arquivo ASCII DOS (8bit / char).

 C:\> type unicodeencoded.txt > dosencoded.txt 

como um bônus, se possível, os personagens são mapeados corretamente.

se estrutura de bloco:

 if "%VS90COMNTOOLS%"=="" ( echo: Visual Studio 2008 is not installed exit /b ) 

Expansão atrasada de variables ​​(com substrings lançados em boa medida):

  @echo off setlocal enableextensions enabledelayedexpansion set full=/u01/users/pax :loop1 if not "!full:~-1!" == "/" ( set full2=!full:~-1!!full2! set full=!full:~,-1! goto :loop1 ) echo !full! endlocal 

Não oferece 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 melhorar o feedback do usuário.

 @title Searching for ... :: processing search @title preparing search results :: data processing 

Não tem um editor à mão e precisa criar um arquivo de lote?

 copy con test.bat 

Apenas digite os comandos, pressione enter para uma nova linha. Pressione Ctrl-Z e Enter para fechar o arquivo.

exemplo de subtração de string na date e time para obter o arquivo chamado “AAAA-MM-DD HH: MM: SS.txt”

echo test > "%date:~0,4%-%date:~5,2%-%date:~8,2% %time:~0,2%_%time:~3,2%_%time:~6,2%.txt"

Eu uso color para indicar se meu script acabou com sucesso, falhou ou precisa de alguma input, alterando a cor do texto e do plano de fundo. Isso realmente ajuda quando você tem alguma máquina ao alcance da sua visão, mas muito longe

cor XY

onde X e Y é um valor hexadecimal de 0 a F , onde X – fundo, texto Y, quando a cor X = Y não for alterada.

cor Z

muda a cor do texto para ‘Z’ e define fundo preto, ‘cor 0’ não funciona

para nomes de chamada de colors

cor ?

Controle total sobre a saída com caracteres de espaçamento e escape:

 echo. ^/%basedir%/resources^ 

TheSoftwareJedi já mencionou o comando for, mas vou mencioná-lo novamente, pois é muito poderoso.

O seguinte produz a data atual no formato YYYYMMDD, eu uso isso ao gerar diretórios para backups.

 for /f "tokens=2-4 delims=/- " %a in ('DATE/T') do echo %c%b%a