Vários comandos em uma única linha em um arquivo de lote do Windows

111

No Unix, podemos colocar vários comandos em uma única linha, como este:

$ date ; ls -l ; date

Tentei algo semelhante no Windows:

 > echo %TIME% ; dir ; echo %TIME

Mas imprimiu a hora e não executa o comando dir.

Como posso conseguir isso?

Raghuram
fonte

Respostas:

181

Usar:

echo %time% & dir & echo %time%

Isso é, de memória, equivalente ao separador de ponto e vírgula em bashe outros shells UNIXy.

Há também &&(or ||) que só executa o segundo comando se o primeiro for bem-sucedido (ou falhar), mas o único e comercial &é o que você está procurando aqui.


Provavelmente, você terá o mesmo tempo, pois as variáveis ​​de ambiente tendem a ser avaliadas na leitura, em vez de na execução.

Você pode contornar isso ativando a expansão atrasada:

pax> cmd /v:on /c "echo !time! & ping 127.0.0.1 >nul: & echo !time!"
15:23:36.77
15:23:39.85

Isso é necessário na linha de comando. Se estiver fazendo isso dentro de um script, você pode apenas usar setlocal:

@setlocal enableextensions enabledelayedexpansion
@echo off
echo !time! & ping 127.0.0.1 >nul: & echo !time!
endlocal
paxdiablo
fonte
Obrigado pela resposta. O problema é que funciona parcialmente. o primeiro e o último% time% imprime ao mesmo tempo, mesmo quando o comando (no meio) leva pelo menos 40 segundos para ser concluído. (Eu executo meu script em vez do comando dir)
Raghuram
1
Isso ocorre porque as variáveis ​​de ambiente são avaliadas quando o comando é lido e não executado. Vou atualizar a resposta.
paxdiablo
Ainda assim, o problema persiste. O script está saindo com o código 1. Mas ainda assim o segundo eco é impresso ao mesmo tempo Veja isto op 12: 57: 56.93 Um encadeamento saiu enquanto 3 encadeamentos estavam em execução. 12: 57: 56.93
Raghuram
3
Eu tendia a usar time /t(ou echo.|time) em vez de echo %time%contornar o problema.
Joey
1
Alguma ideia de como fazer com que% errorlevel% esteja correto nas chamadas seguintes?
BradLaney,