Linha única com vários comandos usando o arquivo em lotes do Windows

Eu tento entender como funcionam vários comandos em uma única linha de comando em um arquivo em lotes.

dir & md folder1 & rename folder1 mainfolder 

E outro caso com comandos semelhantes, mas & substituído com && .

 dir && md folder1 && rename folder1 mainfolder 

1. Qual é a diferença entre esses dois casos?


Outra coisa que quero perguntar:

One-liner batch.bat :

 dir & md folder1 & rename folder1 mainfolder 

Multi-liner batch.bat :

 dir md folder1 rename folder1 mainfolder 

2. Esse one-liner e multi-liner é igual em termos de procedimento de arquivo em lote?


E mais uma coisa que eu gostaria de saber:

3. Se eu chamar outros arquivos em lote de um arquivo main.bat, eles serão executados de maneira independente e simultânea? Arquivo de lote principal não espera para finalizar procedimentos em outros arquivos em lotes? Como fazer isso?

& entre dois comandos simplesmente resulta na execução de ambos os comandos independentes no resultado do primeiro comando. O comando à direita de & é executado após o comando deixado & finalizado independente do sucesso ou erro do comando anterior, ou seja, independente do valor de saída / retorno do comando anterior.

&& resulta em uma execução condicional de segundo comando. O segundo comando é executado apenas se o primeiro comando for bem-sucedido, o que significa que saiu com o código de retorno 0.

Para uma explicação alternativa, consulte Execução condicional .

 dir & md folder1 & rename folder1 mainfolder 

é, portanto, igual

 dir md folder1 rename folder1 mainfolder 

Um substituto multilinha para

 dir && md folder1 && rename folder1 mainfolder 

seria

 dir if not errorlevel 1 ( md folder1 if not errorlevel 1 ( rename folder1 mainfolder ) ) 

if not errorlevel 1 significa que o comando antes não terminou com um código de saída maior 0 . Como os comandos dir e md nunca saem com um valor negativo, apenas com 0 ou maior (como quase todos os comandos e aplicativos de console) e valor 0 é o código de saída para sucesso, este é um método correto para testar a execução bem sucedida de dir e md . Consulte o artigo de suporte da Microsoft Testando um nível de erro específico em arquivos em lote .

Outros tópicos úteis sobre estouro de pilha sobre errorlevel:

  • Quais comandos internos do cmd.exe limpam o ERRORLEVEL para 0 após o sucesso?
  • Quais são os valores ERRORLEVEL definidos pelos comandos internos cmd.exe?

Cuidado deve ser tomado na mistura de operador incondicional & com operadores condicionais como && e || por causa da ordem de execução não é necessariamente a ordem dos comandos na linha de comando.

Exemplo:

 dir "C:\Users\%UserName%" /AD 2>nul || dir "%UserProfile%" /AD & echo User profile path: "%UserProfile%" 

Esta linha de comando é executada como:

 dir "C:\Users\%UserName%" /AD 2>nul if errorlevel 1 dir "%UserProfile%" /AD echo User profile path: "%UserProfile%" 

O comando ECHO é sempre executado independentemente do resultado da execução da primeira DIR, enquanto a segunda DIR é executada apenas se a primeira DIR falhar como no Windows XP ou a pasta de perfil do usuário não estiver na unidade C: ou não em uma pasta Users .

É necessário usar ( e ) ao executar o ECHO somente se o primeiro DIR falhar após o segundo DIR ser independente do resultado do segundo DIR .

 dir "C:\Users\%UserName%" /AD 2>nul || ( dir "%UserProfile%" /AD & echo User profile path: "%UserProfile%" ) 

Esta linha de comando é executada como:

 dir "C:\Users\%UserName%" /AD 2>nul if errorlevel 1 ( dir "%UserProfile%" /AD echo User profile path: "%UserProfile%" ) 

Para a resposta na terceira pergunta, veja a minha resposta sobre Como chamar um arquivo de lote na pasta pai do arquivo de lote atual? onde eu expliquei as diferenças na execução de um arquivo de lote com call comando ou com start ou com nenhum desses dois comandos de dentro de um arquivo de lote.