Executando comandos de arquivo em lote do Windows de forma assíncrona

187

Diga, se eu tiver

  • foo.exe
  • bar.exe
  • baz.exe

Como executo todos eles a partir de um arquivo em lotes de forma assíncrona, ou seja, sem esperar a interrupção do programa anterior?

RichN
fonte

Respostas:

254

O uso do STARTcomando para executar cada programa deve fornecer o que você precisa:

START "title" [/D path] [options] "command" [parameters]

Toda STARTchamada executa o comando fornecido em seu parâmetro e retorna imediatamente, a menos que seja executado com um /WAITcomutador.

Isso se aplica aos aplicativos de linha de comando. Os aplicativos sem linha de comando retornam imediatamente de qualquer maneira; portanto, se você deseja executar todos de forma assíncrona, use START.

macbirdie
fonte
Ok obrigado. Eu deveria ter lido cada entrada helpcuidadosamente. :)
RichN
8
Na verdade, eu tive problemas com isso outro dia. Eu tive que iniciar 30 janelas do explorer para um teste de desempenho. Não funcionou e não era importante o suficiente para eu olhar para ele .. comecei a navegar pela janela e várias horas depois quando a fechei, outra apareceu! E eu era como o que diabos, fechou .. outro apareceu! Depois de 4-5 janelas e muito do que diabos eu notei o arquivo de lote ainda em execução!
Jonas B
3
Auto-publicidade Shameless: Eu uma vez criado um lote que é capaz de funcionar como uma espécie de pool de threads, apenas para processos: stackoverflow.com/questions/672719/...
Joey
4
Se você precisar fornecer argumentos ou se o caminho para os comandos contiver espaços, lembre-se de adicionar aspas. Neste caso, você também precisará fornecer um título para a janela do console de abertura: Iniciar "" "[caminho para o comando]" [comando args]
Pierluigi
Existe alguma maneira de contar com essa técnica quando estiver pronta? Estou lançando ~ 30 cópias do FILA DESTA e quero que sejam assíncronas, mas também quero ter uma idéia de quando tudo estiver pronto.
Doug
68

Combinando algumas das respostas anteriores, você pode tentar start /b cmd /c foo.exe.

Para um exemplo trivial, se você quiser imprimir as versões de java / groovy / grails / gradle, poderá fazer isso em um arquivo em lotes:

@start /b cmd /c java -version
@start /b cmd /c gradle -version
@start /b cmd /c groovy -version
@start /b cmd /c grails -version

Se você tiver algo como o Process Explorer (Sysinternals), verá alguns processos filho cmd.exe, cada um com um processo java (conforme os comandos acima). A saída será impressa na tela em qualquer ordem em que forem concluídas.

start /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

cmd /c : Carries out the command specified by string and then terminates
djKianoosh
fonte
13
impede que o comando seja ecoado no console. Em scripts em lote, às vezes você verá echo offno início que, quando você executa o script, impede que todos os comandos sejam ecoados no console. O @é semelhante, mas apenas para esse único comando. Então, às vezes você verá @echo off.
djKianoosh
36

Você pode usar o comando start para gerar processos em segundo plano sem iniciar novas janelas:

start /b foo.exe

O novo processo não será interrompível com o CTRL-C; você pode matá-lo apenas com CTRL-BREAK (ou fechando a janela ou através do Gerenciador de tarefas).

sproaticus
fonte
5
Onde está o BREAKteclado hoje em dia?
precisa saber é o seguinte
1
@ user2023370 Ainda está na tecla Pausa . A maioria dos laptops que não possuem determinadas teclas suporta combinações de teclas ocultas .
Gerold Broser 8/16
23

Crie um arquivo em lotes com as seguintes linhas:

start foo.exe
start bar.exe
start baz.exe 

O comando start executa seu comando em uma nova janela, para que todos os 3 comandos sejam executados de forma assíncrona.

Nikhil
fonte
17

Use o comando START :

start [programPath]

Se o caminho para o programa contiver espaços, lembre-se de adicionar aspas. Nesse caso, você também precisa fornecer um título para a janela do console de abertura

start "[title]" "[program path]"

Se você precisar fornecer argumentos, anexe-os no final (fora das aspas de comando)

start "[title]" "[program path]" [list of command args]

Use a opção / b para evitar abrir uma nova janela do console (mas, nesse caso, você não pode interromper o aplicativo usando CTRL-C

Pierluigi
fonte
10

Existe uma terceira opção (e potencialmente muito mais fácil). Se você deseja ativar várias instâncias de um único programa, o uso de um processador de comandos no estilo Unix, como o Xargs ou o GNU Parallel, pode tornar isso um processo bastante simples.

Há um clone Xargs win32 chamado PPX2 que torna isso bastante simples.

Por exemplo, se você quiser transcodificar um diretório de arquivos de vídeo, poderá executar o comando:

dir /b *.mpg |ppx2 -P 4 -I {} -L 1 ffmpeg.exe -i "{}" -quality:v 1 "{}.mp4"

Separando isso, dir /b *.mpgpega uma lista de arquivos .mpg no meu diretório atual, o |operador canaliza essa lista para o ppx2, que cria uma série de comandos a serem executados em paralelo; 4 de cada vez, conforme especificado aqui pelo -P 4operador. O -L 1operador diz ao ppx2 para enviar apenas uma linha da nossa lista de diretórios para ffmpeg por vez.

Depois disso, basta escrever sua linha de comando ( ffmpeg.exe -i "{}" -quality:v 1 "{}.mp4") e {}será automaticamente substituída por cada linha da sua listagem de diretórios.

Não é universalmente aplicável a todos os casos, mas é muito mais fácil do que usar as soluções alternativas de arquivos em lote detalhadas acima. Obviamente, se você não está lidando com uma lista de arquivos, também pode canalizar o conteúdo de um arquivo de texto ou qualquer outro programa na entrada do pxx2.

schmod
fonte
1
A última porta xargs win32 funciona bem hoje em dia (de qualquer maneira, a que acompanha o git for windows).
11786 Peter M em
Isso é ótimo, exceto que falha ao lidar com arquivos contendo caracteres unicode. Algum plano para suportar arquivos unicode? Obrigado.
Gökhan Sever
@ GökhanSever No passado, eu resolvi esse problema usando o formulário "nome abreviado" do caminho, que se parece com C: \ PROGRA ~ 1 \ WINDOW ~ 3 \ MYPROG ~ 1.EXE. Não é bonito, mas funciona.
moltenform
-1

Eu não consegui fazer nada funcionar. Acabei usando o powershell para iniciar scripts bat .. às vezes até o cmd / c não funciona, não sei por quê .. Eu até tentei coisas como start cmd / c notepad & exit

start-Process "c:\BACKUP\PRIVATE\MobaXterm_Portable\MobaXterm_Portable.bat" -WindowStyle Hidden
RmccurdyDOTcom
fonte