Comando CALL vs. INICIAR com a opção / WAIT

149

Como é o comando START com uma opção WAIT

START /wait notepad.exe 
START /wait  notepad.exe 

... diferente de usar um comando CALL?

CALL notepad.exe 
CALL notepad.exe 

Existe uma situação em que um pode se comportar de maneira diferente que o outro depende do que está sendo executado?

Chade
fonte

Respostas:

183

Para arquivos exe , suponho que as diferenças sejam quase sem importância.
Mas para iniciar um exe você nem precisa CALL.

Ao iniciar outro lote, é uma grande diferença,
pois ele CALLserá iniciado na mesma janela e o lote chamado terá acesso ao mesmo contexto de variável.
Por isso, também pode alterar variáveis ​​que afetam o chamador.

STARTcriará um novo cmd.exe para o lote chamado e sem / b abrirá uma nova janela.
Como é um novo contexto, as variáveis ​​não podem ser compartilhadas.

Diferenças

Usandostart /wait <prog>
- Alterações nas variáveis ​​de ambiente são perdidas quando o <prog>término
- O chamador espera até que o<prog> término seja concluído

Usandocall <prog>
- Para exe , pode ser omitido, porque é igual a apenas iniciar <prog>
- Para um exe-prog, o lote do chamador aguarda ou inicia o exe assíncrono, mas o comportamento depende do próprio exe .
- Para arquivos em lote , o lote do chamador continua quando a chamada<batch-file> terminar, SEM chamar o controle, não retornará ao lote do chamador.

Termo aditivo:

O uso CALLpode alterar os parâmetros (para arquivos em lote e exe), mas somente quando eles contêm sinais de intercalação ou sinais de porcentagem.

call myProg param1 param^^2 "param^3" %%path%%

Será expandido para (de dentro de um arquivo em lotes)

myProg param1 param2 param^^3 <content of path>
jeb
fonte
25
Ao executar um file.bat usando START / WAIT, você precisa especificar START / WAIT cmd / c "file.bat" em vez de apenas START / WAIT "file.bat"; caso contrário, a janela do cmd criada para file.bat permanecerá aberta
FrinkTheBrave
5
Você pode encontrar a comparação entre CALL e START em: ss64.com/nt/start.html (atualizada hoje com as seções "Start / Wait" e "START vs CALL")
Alfredo Capobianchi
O meu favorito é start /wait /b cmd /c <batchfile.bat>porque os arquivos em lote executar um após o outro na mesma janela de comando
linux64kb
@ linux64kb, mas para arquivos em lote não é necessário, você só precisacall batchfile.bat
jeb
@jeb True. Eu prefiro este porque cada arquivo em lote será executado em um ambiente de shell de comando diferente, herdando variáveis ​​do shell de chamada e as alterações nos valores iniciais serão perdidas após a conclusão do lote -> nenhum lixo será deixado após cada execução consecutiva. Outra vitória é que você não precisa lidar com a redefinição de variáveis ​​em seus scripts.
Linux64kb
17

Eu acho que eles devem executar geralmente o mesmo, mas existem algumas diferenças. STARTgeralmente é usado para iniciar aplicativos ou para iniciar o aplicativo padrão para um determinado tipo de arquivo. Dessa forma, se você START http://mywebsite.comnão fizer START iexplore.exe http://mywebsite.com.

START myworddoc.docxiniciaria o Microsoft Word e abriria myworddoc.docx. CALL myworddoc.docxfaz a mesma coisa ... no entanto, STARTfornece mais opções para o estado da janela e coisas dessa natureza. Também permite que a prioridade e a afinidade do processo sejam definidas.

Em resumo, dadas as opções adicionais fornecidas pelo início, essa deve ser a sua ferramenta de escolha.

START ["title"] [/D path] [/I] [/MIN] [/MAX] [/SEPARATE | /SHARED]
  [/LOW | /NORMAL | /HIGH | /REALTIME | /ABOVENORMAL | /BELOWNORMAL]
  [/NODE <NUMA node>] [/AFFINITY <hex affinity mask>] [/WAIT] [/B]
  [command/program] [parameters]

"title"     Title to display in window title bar.
path        Starting directory.
B           Start application without creating a new window. The
            application has ^C handling ignored. Unless the application
            enables ^C processing, ^Break is the only way to interrupt
            the application.
I           The new environment will be the original environment passed
            to the cmd.exe and not the current environment.
MIN         Start window minimized.
MAX         Start window maximized.
SEPARATE    Start 16-bit Windows program in separate memory space.
SHARED      Start 16-bit Windows program in shared memory space.
LOW         Start application in the IDLE priority class.
NORMAL      Start application in the NORMAL priority class.
HIGH        Start application in the HIGH priority class.
REALTIME    Start application in the REALTIME priority class.
ABOVENORMAL Start application in the ABOVENORMAL priority class.
BELOWNORMAL Start application in the BELOWNORMAL priority class.
NODE        Specifies the preferred Non-Uniform Memory Architecture (NUMA)
            node as a decimal integer.
AFFINITY    Specifies the processor affinity mask as a hexadecimal number.
            The process is restricted to running on these processors.

            The affinity mask is interpreted differently when /AFFINITY and
            /NODE are combined.  Specify the affinity mask as if the NUMA
            node's processor mask is right shifted to begin at bit zero.
            The process is restricted to running on those processors in
            common between the specified affinity mask and the NUMA node.
            If no processors are in common, the process is restricted to
            running on the specified NUMA node.
WAIT        Start application and wait for it to terminate.
mckeejm
fonte
8

Foi o que descobri ao executar arquivos em lote em paralelo (várias instâncias do mesmo arquivo bat ao mesmo tempo com diferentes parâmetros de entrada):

Vamos dizer que você tem um arquivo exe que executa uma tarefa longa chamada LongRunningTask.exe

Se você chamar o exe diretamente do arquivo bat, apenas a primeira chamada para o LongRunningTask será bem-sucedida, enquanto o restante receberá um erro do SO "O arquivo já está sendo usado pelo processo"

Se você usar este comando:

start / B / WAIT "" "LongRunningTask.exe" "" parâmetros "

Você poderá executar várias instâncias do bastão e exe, enquanto aguarda a conclusão da tarefa antes que o bastão continue executando os comandos restantes. A opção / B é para evitar a criação de outra janela; as aspas vazias são necessárias para que o comando funcione, consulte a referência abaixo.

Observe que, se você não usar o / WAIT no início, o LongRunningTask será executado ao mesmo tempo que os comandos restantes no arquivo em lotes, portanto, poderá criar problemas se um desses comandos exigir a saída do LongRunningTask

Retomar :

Isso não pode ser executado em paralelo:

  • chame LongRunningTask.exe

Isso será executado em paralelo e ficará ok, desde que não haja dependências de dados entre a saída do comando e o restante do arquivo bat:

  • start / B "" "LongRunningTask.exe" "parâmetros"

Isso será executado em paralelo e aguardará a conclusão da tarefa, para que você possa usar a saída:

  • start / B / WAIT "" "LongRunningTask.exe" "" parâmetros "

Referência para o comando start: Como executar um programa a partir de um arquivo em lotes sem deixar o console aberto após o início do programa?

Cherno
fonte
6

Ligar

Chama um programa em lote de outro sem interromper o programa em lote pai. O comando call aceita rótulos como o destino da chamada. A chamada não tem efeito na linha de comando quando usada fora de um script ou arquivo em lotes. https://technet.microsoft.com/en-us/library/bb490873.aspx

Começar

Inicia uma janela separada do prompt de comando para executar um programa ou comando especificado. Usado sem parâmetros, o start abre uma segunda janela do prompt de comando. https://technet.microsoft.com/en-us/library/bb491005.aspx

Desenvolvedor
fonte
-1

Este é um tópico antigo, mas acabei de encontrar essa situação e descobri uma maneira elegante de contorná-la. Eu estava tentando executar um setup.exe, mas o foco estava voltando para a próxima linha do script sem esperar pela conclusão do setup.exe. Eu tentei as soluções acima sem sorte.

No final, canalizar o comando através de mais funcionou.

setup.exe {argumentos} | Mais

Steven Sheldon
fonte