Várias maneiras de chamar um arquivo de lote do Windows a partir de outro ou do prompt. Qual em qual caso?

92

Um arquivo em lote do Windows ( called.batou called.cmd) pode ser chamado de outro arquivo em lote ( caller.batou caller.cmd) ou prompt cmd.exe interativo de várias maneiras:

  1. chamada direta: called.bat
  2. usando o comando de chamada: call called.bat
  3. usando o comando cmd: cmd /c called.bat
  4. usando o comando start: start called.bat

Estou com problemas para diferenciar o uso pretendido com base no texto de ajuda: quando usar qual? por exemplo, por que eu poderia usar o comando 'call' em vez da chamada direta. O que é diferente?

Estou interessado em algum relatório de resumo que analisa todas as 4 possibilidades (e outras, se houver alguma faltando) de vários pontos de vista: casos de uso recomendados para os quais eles são projetados para se adequar, geração de processo, contexto de execução, ambiente, processamento de código de retorno.

Observação: estou usando o Windows XP SP3.

escuro
fonte

Respostas:

101
  1. O arquivo em lote será executado pela instância cmd.exe atual (ou uma nova instância cmd.exe se, por exemplo, clicar duas vezes no Explorer).

  2. Igual ao # 1, só tem efeito quando usado dentro de um arquivo batch / cmd. Em um arquivo em lote, sem 'chamada', o arquivo em lote pai termina e o controle passa para o arquivo em lote chamado; com 'call' executa o arquivo em lote filho e o arquivo em lote pai continua com as instruções após a chamada.

  3. Executa o arquivo em lote em uma nova instância cmd.exe.

  4. Iniciar executará o arquivo em lote em uma nova instância cmd.exe em uma nova janela e o chamador não esperará pela conclusão.

Kyle Alons
fonte
7
Nota para a opção 4, o comando de início deve ser sempre seguido por um 'título' , então se você não precisa de um título você deve colocar aspas vazias, por exemplostart "" [options] command
Daryn
O link @Daryn simplesmente menciona que você deve sempre ter um, mas ainda diz que a Microsoft descreve o parâmetro como opcional. Eles não me dizem por que deveria ser "exigido". Mesmo vários de seus exemplos na parte inferior omitem o parâmetro de título.
Adam Plocher
5

Uma coisa não está clara nos comentários aqui: quando você chama um arquivo em lote de outro usando apenas seu nome (Caso # 1 na pergunta original), a execução é interrompida no arquivo em lote de chamada. Por exemplo, nestas linhas:

called.bat
echo Hello

A linha 'echo Hello' (e qualquer coisa que vier depois) não será chamada. Se você usar a palavra-chave 'call', a execução continuará após a chamada. Portanto, neste caso:

call called.bat
echo Hello

A linha 'echo Hello' será chamada.

Além disso, todas as variáveis ​​definidas no arquivo called.bat também serão passadas de volta para o processo de chamada.

Imagine um arquivo 'called.bat' que tivesse esta linha:

set MYVAR=hello

Então,% MYVAR% estaria disponível para o arquivo em lote de chamada se usado:

call called.bat

Mas, não estaria usando

REM starts a new cmd.exe process
start called.bat   

REM stops and replaces current cmd.exe process with a new one
called.bat        
ken
fonte