Ejecutar comandos de archivos por lotes de Windows de forma asincrónica

187

Di si tengo

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

¿Cómo ejecuto todos ellos desde un archivo por lotes de forma asincrónica, es decir, sin esperar a que se detenga el programa anterior?

RichN
fuente

Respuestas:

254

El uso del STARTcomando para ejecutar cada programa debería obtener lo que necesita:

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

Cada STARTinvocación ejecuta el comando dado en su parámetro y regresa de inmediato, a menos que se ejecute con un /WAITinterruptor.

Eso se aplica a las aplicaciones de línea de comandos. Las aplicaciones sin línea de comando regresan inmediatamente de todos modos, así que para estar seguro, si desea ejecutar todo de forma asíncrona, úselo START.

Macbirdie
fuente
Bien gracias. Debería haber leído cada entrada helpcuidadosamente. :)
RichN
8
En realidad tuve problemas con esto el otro día. Tuve que lanzar 30 ventanas del explorador para una prueba de rendimiento. No funcionó y no era lo suficientemente importante como para mirarlo ... empecé a buscar en esa ventana y, varias horas después, cuando la cerré, apareció otra. Y yo estaba como qué demonios, lo cerré ... ¡otro golpeó! Después de 4-5 ventanas y mucho de lo que el **** noté que el archivo por lotes todavía se está ejecutando.
Jonas B
3
Auto-publicidad descarada: una vez creé un lote que puede funcionar como una especie de grupo de subprocesos, solo para procesos: stackoverflow.com/questions/672719/…
Joey
44
Si necesita proporcionar argumentos o si la ruta a los comandos contiene espacios, recuerde agregar comillas. En este caso, también debe proporcionar un título para la ventana de apertura de la consola: inicio "" "[ruta al comando]" [comando args]
Pierluigi
¿Hay alguna manera de saber con esta técnica cuándo se hace? Comenzaré ~ 30 copias de FILA DESTA y quiero que sean asíncronas, pero también quiero tener una idea de cuándo están listas.
Doug
68

Combinando un par de respuestas anteriores, podrías intentarlo start /b cmd /c foo.exe.

Para un ejemplo trivial, si desea imprimir las versiones de java / groovy / grails / gradle, puede hacerlo en un archivo por 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

Si tiene algo como Process Explorer (Sysinternals), verá unos pocos procesos cmd.exe secundarios, cada uno con un proceso java (según los comandos anteriores). La salida se imprimirá en la pantalla en el orden en que terminen.

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
fuente
13
evita que el comando se repita en la consola. En las secuencias de comandos por lotes, a veces verá echo offal principio que, cuando ejecute la secuencia de comandos, evitará que todos los comandos se repitan en la consola. El @es similar pero solo para ese comando único. Entonces, a veces lo verás @echo off.
djKianoosh
36

Puede usar el comando de inicio para generar procesos en segundo plano sin iniciar nuevas ventanas:

start /b foo.exe

El nuevo proceso no será interrumpible con CTRL-C; puede matarlo solo con CTRL-BREAK (o cerrando la ventana, o mediante el Administrador de tareas).

sproaticus
fuente
55
¿Dónde está BREAKen los teclados en estos días?
user2023370
1
@ user2023370 Todavía en la tecla Pausa . La mayoría de las computadoras portátiles que carecen de ciertas teclas admiten combinaciones de teclas ocultas .
Gerold Broser
23

Cree un archivo por lotes con las siguientes líneas:

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

El comando de inicio ejecuta su comando en una nueva ventana, por lo que los 3 comandos se ejecutarían de forma asincrónica.

Nikhil
fuente
17

Use el comando START :

start [programPath]

Si la ruta al programa contiene espacios, recuerde agregar comillas. En este caso, también debe proporcionar un título para la ventana de apertura de la consola

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

Si necesita proporcionar argumentos, agréguelos al final (fuera de las comillas)

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

Use la opción / b para evitar abrir una nueva ventana de consola (pero en ese caso no puede interrumpir la aplicación usando CTRL-C

Pierluigi
fuente
10

Hay una tercera opción (y potencialmente mucho más fácil). Si desea activar múltiples instancias de un solo programa, usar un procesador de comandos de estilo Unix como Xargs o GNU Parallel puede hacer que sea un proceso bastante sencillo.

Hay un clon win32 Xargs llamado PPX2 que lo hace bastante sencillo.

Por ejemplo, si desea transcodificar un directorio de archivos de video, puede ejecutar el comando:

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

Seleccionando esto, dir /b *.mpgtoma una lista de archivos .mpg en mi directorio actual, el |operador canaliza esta lista en ppx2, que luego construye una serie de comandos para ejecutar en paralelo; 4 a la vez, según lo especificado aquí por el -P 4operador. El -L 1operador le dice a ppx2 que solo envíe una línea de nuestro directorio a ffmpeg a la vez.

Después de eso, solo escribe su línea de comando ( ffmpeg.exe -i "{}" -quality:v 1 "{}.mp4"), y {}se sustituye automáticamente por cada línea de su listado de directorio.

No es universalmente aplicable a todos los casos, pero es mucho más fácil que usar las soluciones alternativas de archivos por lotes detalladas anteriormente. Por supuesto, si no está lidiando con una lista de archivos, también puede canalizar el contenido de un archivo de texto o cualquier otro programa en la entrada de pxx2.

Schmod
fuente
1
El último puerto xargs win32 funciona bien hoy en día (el incluido con git para windows de todos modos).
Peter M
Esto es genial, excepto que falla al tratar con archivos que contienen caracteres Unicode. ¿Algún plan para admitir archivos Unicode? Gracias.
Gökhan Sever
@ GökhanSever En el pasado, he solucionado este problema utilizando la forma de "nombre corto" de la ruta, que se parece a C: \ PROGRA ~ 1 \ WINDOW ~ 3 \ MYPROG ~ 1.EXE. No es bonita, pero funciona.
fundida
-1

No pude hacer que nada funcionara. Terminé usando Powershell para iniciar scripts de murciélagos. A veces, incluso comenzar cmd / c no funciona, no estoy seguro de por qué. Incluso probé cosas como iniciar el bloc de notas cmd / c y salir

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