Como executo um arquivo bat em segundo plano a partir de outro arquivo bat?

90

Eu tenho um script de "configuração" que executo de manhã que inicia todos os programas de que preciso. Agora, alguns deles precisam de configuração adicional do ambiente, então preciso envolvê-los em pequenos scripts BAT.

Como executo esse script no Windows XP em segundo plano?

CALL env-script.bat executa-o de forma síncrona, ou seja, o script de configuração pode continuar somente depois que o comando no env-script termina.

START/B env-script.bat executa outra instância do CMD.exe no mesmo prompt de comando, deixando-o em um estado realmente confuso (vejo a saída do CMD.exe aninhado, o teclado está morto por um tempo, o script não é executado).

START/B CMD env-script.batproduz o mesmo resultado. Nenhuma das bandeiras no CMD parece corresponder à minha conta.

Aaron Digulla
fonte

Respostas:

71

Na verdade, o seguinte funciona bem para mim e cria novas janelas:

test.cmd:

@echo off
call "cmd /c start test2.cmd"
call "cmd /c start test3.cmd"
echo Foo
pause

test2.cmd

@echo off
echo Test 2
pause
exit

test3.cmd

@echo off
echo Test 3
pause
exit

Combine isso com parâmetros para start, como /min, como Moshe apontou, se você não quiser que as novas janelas apareçam na sua frente.

Joey
fonte
1
Ok, isso funciona, mas não é 100% perfeito: depois que pressiono "RETURN" no "Teste 2", a janela não fecha. Alguma ideia?
Aaron Digulla
Você pode adicionar "saída" aos lotes gerados para fechá-los novamente. Desculpe, não testei tão longe :)
Joey
140

Dois anos, mas para completar ...

Abordagem padrão em linha: (ou seja, o comportamento que você obteria ao usar &no Linux)

START /B CMD /C CALL "foo.bat" [args [...]]

Observações: 1. CALLestá emparelhado com o arquivo .bat porque é para onde ele geralmente vai .. (ou seja, é apenas uma extensão do CMD /C CALL "foo.bat"formulário para torná-lo assíncrono. Normalmente, é necessário obter códigos de saída corretamente, mas isso não é um problema aqui.); 2. Aspas duplas ao redor do arquivo .bat são necessárias apenas se o nome contiver espaços. (O nome pode ser um caminho, caso em que há mais probabilidade disso.).

Se você não quiser a saída:

START /B CMD /C CALL "foo.bat" [args [...]] >NUL 2>&1

Se você quiser que o bat seja executado em um console independente: (ou seja, outra janela)

START CMD /C CALL "foo.bat" [args [...]]

Se você quiser que a outra janela fique por perto depois:

START CMD /K CALL "foo.bat" [args [...]]

Nota: Na verdade, este é um formato ruim, a menos que você tenha usuários que desejem especificamente usar a janela aberta como um console normal. Se você quiser apenas que a janela fique por perto para ver a saída, é melhor colocar um PAUSEno final do arquivo bat. Ou ainda, adicione ^& PAUSEapós a linha de comando:

START CMD /C CALL "foo.bat" [args [...]] ^& PAUSE
Antak
fonte
10
&é um operador "e então" (terminologia?). (por exemplo, cmd1 & cmd2significa "cmd1" e depois "cmd2". Ao contrário do &&operador, a execução de "cmd2" não depende da saída bem-sucedida de "cmd1".) O ^escapa de &para que vá para os argumentos do CMD em vez de ser consumido e executado pelo mesmo console que executou START.
antak
Isso é muito útil, obrigado. Eu estava prestes a porta de alguns scripts para Linux, porque outros guias para starte cmdnão deu a funcionalidade completa que procurava. Sua resposta acerta.
Iterador de
3
Se você não quiser a saída, o redirecionamento deve ser escapado para que seja passado ao CMD. Além disso, o CALL não é necessário:START /B "" CMD /C "foo.bat" [args [...]] ^>nul 2^>^&1
dbenham
1
@dbenham: Embora o que você está dizendo faça sentido, START /B "" CMD /C PING 127.0.0.1 >NULparece funcionar de qualquer maneira e nada é produzido. (Provavelmente porque CMDherda STARTas alças de E / S.) Acho que a diferença é se você deseja manter STARTa saída (de erro) intacta, o que provavelmente é uma boa ideia. CALLestá lá porque achei que é uma boa prática manter. (ou seja, não usar CALLpara chamadas de morcego síncronas resultará em códigos de saída imprevisíveis, por isso emparelhei consistentemente chamadas de morcego, CALLmesmo quando não se aplica estritamente, como neste caso.)
antak
7

Como START é a única maneira de executar algo em segundo plano a partir de um script CMD, recomendo que você continue usando. Em vez do modificador / B, tente / MIN para que a janela recém-criada não o incomode. Além disso, você pode definir a prioridade para algo mais baixo com / LOW ou / BELOWNORMAL, o que deve melhorar a capacidade de resposta do sistema.

Moshe
fonte
-1 O problema é que START não cria uma nova janela quando você inicia um arquivo BAT; em vez disso, ele reutiliza a janela atual e mistura os dois processos CMD de E / S.
Aaron Digulla
4
Não está criando uma nova janela porque você está usando o sinalizador / B. Remova.
Moshe
5

Diferente do termo de primeiro plano / plano de fundo. Outra forma de ocultar a janela em execução é via vbscript, se ainda estiver disponível em seu sistema.

DIM objShell
set objShell=wscript.createObject("wscript.shell")
iReturn=objShell.Run("yourcommand.exe", 0, TRUE)

nomeie-o como sth.vbs e chame-o do bastão, coloque em tarefa planejada, etc. Pessoalmente, irei desativar o vbs sem pressa em qualquer sistema Windows que eu gerenciar :)

MeaCulpa
fonte
Para o meu caso de uso específico, esta foi realmente a única solução que consegui fazer funcionar ...
Ben
0

Crie um novo aplicativo C # do Windows e chame este método de main:

public static void RunBatchFile(string filename)
{
    Process process = new Process();

    process.StartInfo.FileName = filename;

    // suppress output (command window still gets created)
    process.StartInfo.Arguments = "> NULL";

    process.Start();
    process.WaitForExit();
}
LegendLength
fonte
2
Uhm ... Eu esperava que algo tão simples como isso não precisasse instalar o Visual Studio ...
Aaron Digulla
1
Até que o PowerShell esteja 100% disponível - C # é realmente um exagero.
Jim,
2
Aaron: O compilador C # está incluído no .NET Framework 2, portanto, você pode simplesmente editar algum código em um editor de texto e compilá-lo. Ainda assim, como isso é perfeitamente possível em um arquivo em lote, eu também diria que C # é um exagero.
Joey,
0

Isso funciona na minha instalação do Windows XP Home, do jeito Unix:

call notepad.exe & 
MiiToo
fonte
7
Acho que isso só funciona por coincidência, e o & não é necessário.
Sam Watkins
2
Sim, notepad.exe é assíncrono para começar.
antak
0

Na verdade, é bem fácil com esta opção no final:

c: \ start BATCH.bat -WindowStyle Oculto

user8832474
fonte
o comando do Windows startnão tem -WindowStyleopção.
Stephan,
@Stephan Arreed. O caminho estranho ( C:` instead of C: \ Windows`) sugere que ele encontrou uma ferramenta em algum lugar da Internet e copiou em seu disco rígido.
Aaron Digulla