2009-09-19 12 views

Respuesta

206

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

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

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

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 todas de manera asincrónica, use START.

+0

Bien, gracias. Debería haber leído cada entrada de 'help' cuidadosamente :) – RichN

+7

En realidad tuve problemas con esto el otro día. Tuve que abrir 30 ventanas del explorador para una prueba de rendimiento. No funcionó y no fue lo suficientemente importante como para que lo investigara ... comencé a buscar en esa ventana y varias horas después, cuando la cerré, ¡otra apareció! Y yo estaba como qué demonios, lo cerré ... ¡Otro apretó! ¡Después de 4-5 ventanas y mucho de lo que noté, noté que el archivo por lotes seguía en funcionamiento! –

+2

Self-advertising descarado: una vez creé un lote que puede funcionar como un tipo de grupo de subprocesos, solo para procesos: http://stackoverflow.com/questions/672719/parallel-execution-of-shell-processes/676667 # 676667 – Joey

21

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

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

El start command ejecuta el comando en una nueva ventana, por lo que los 3 comandos funcionarían de forma asíncrona.

26

Se puede utilizar el comando de arranque para desovar procesos en segundo plano sin lanzar nuevas ventanas:

start /b foo.exe

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

+0

Upvote para '' CTRL-BREAK''. –

+1

¿Dónde está 'BREAK' en los teclados en estos días? – user2023370

+0

@ user2023370 Aún en la tecla [Pausa] (https://en.wikipedia.org/wiki/File:ANSI_Keyboard_Layout_Diagram_with_Form_Factor.svg). La mayoría de las computadoras portátiles que carecen de ciertas teclas son compatibles con [combinaciones de teclas ocultas] (https://support.lenovo.com/at/en/documents/ht074004). –

56

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

Para un ejemplo trivial, si desea imprimir las versiones de Java/Groovy/Grails/Gradle, se puede 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 usted tiene algo así como el explorador de procesos (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 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 
+0

Por qué el signo @ antes del inicio comando? – Leonel

+7

evita que el comando se repita en la consola. En los scripts por lotes, a veces verá 'echo off' al principio que, cuando ejecuta el script, evitará que todos los comandos se repitan en la consola. El '@' es similar pero solo para ese solo comando. Entonces, a veces verás '@echo off'. – djKianoosh

9

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 el proceso sea bastante sencillo.

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

Por ejemplo, si desea codificar 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" 

Recogiendo esta diferencia, dir /b *.mpg agarra una lista de.los archivos mpg en mi directorio actual, el operador | canaliza esta lista a ppx2, que luego genera una serie de comandos que se ejecutarán 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 escriba 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 en 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 puede canalizar el contenido de un archivo de texto o cualquier otro programa a la entrada de pxx2.

+1

El último puerto xargs win32 funciona bien hoy en día (el que se incluye con git para windows de todos modos). –

+0

Esto es genial, excepto que falla al tratar con archivos que contienen caracteres Unicode. ¿Algún plan para soportar archivos Unicode? Gracias. –

+0

@ GökhanSever En el pasado, he solucionado este problema utilizando la forma de "nombre corto" de la ruta, que se ve como C: \ PROGRA ~ 1 \ WINDOW ~ 3 \ MYPROG ~ 1.EXE. No es bonita, pero funciona. – jmnben

12

Uso del START command:

start [programPath] 

Si la ruta de acceso al programa contiene espacios recuerde añadir comillas. En este caso también es necesario para proporcionar un título para la ventana de la consola apertura

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

Si es necesario proporcionar argumentos a anexar al final (fuera de las comillas de comando)

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

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

Cuestiones relacionadas