Ejecutar comandos de archivo por lotes de Windows de forma asíncrona


Decir, si tengo

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

¿Cómo puedo ejecutar todos ellos desde un archivo por lotes de forma asíncrona, es decir, sin esperar a que se detenga el programa anterior?

Author: Peter Mortensen, 2009-09-19

6 answers

Usando el START comando para ejecutar cada programa debe obtener lo que necesita:

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

Cada invocación START ejecuta el comando dado en su parámetro y devuelve inmediatamente, a menos que se ejecute con un interruptor /WAIT.

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

 218
Author: macbirdie,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-11-21 16:30:45

Combinando un par de las respuestas anteriores, puedes probar start /b cmd /c foo.exe.

Para un ejemplo trivial, si desea imprimir las versiones de java/groovy/grails/gradle, podría hacer esto 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á algunos cmd secundarios.exe procesa cada uno con un proceso java (según los comandos anteriores). La salida se imprimirá en la pantalla en cualquier orden que termine.

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
 57
Author: djKianoosh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-06-01 16:35:08

Puede usar el comando start para generar procesos en segundo plano sin lanzar nuevas ventanas:

start /b foo.exe

El nuevo proceso no será interrumpible con CTRL-C; solo puede matarlo con CTRL-BREAK (o cerrando la ventana, o a través del Administrador de tareas.)

 32
Author: sproaticus,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-09-21 16:37:20

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

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

El comando start ejecuta su comando en una nueva ventana, por lo que los 3 comandos se ejecutarán de forma asíncrona.

 21
Author: Nikhil,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-09-19 18:44:55

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, añádalos al final (fuera de las comillas del comando)

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

Utilice 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

 13
Author: Pierluigi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-10-02 07:42:12

Hay una tercera opción (y potencialmente mucho más fácil). Si desea activar varias 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 de win32 Xargs llamado PPX2 que hace que esto sea bastante sencillo.

Por ejemplo, si desea transcodificar un directorio de archivos de vídeo, puede ejecutar el comando:

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

Separando esto, dir /b *.mpg agarra un lista de .archivos mpg en mi directorio actual, el operador | canaliza esta lista a ppx2, que luego construye una serie de comandos que se ejecutan en paralelo; 4 a la vez, como se especifica aquí por el operador -P 4. El operador -L 1 le dice a ppx2 que solo envíe una línea de nuestra lista de directorios a ffmpeg a la vez.

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

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

 10
Author: schmod,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-08-23 15:28:16