¿Cómo ejecuto un archivo bat en segundo plano desde otro archivo bat?

92

Tengo un script de "instalación" que ejecuto por la mañana y que inicia todos los programas que necesito. Ahora, algunos de ellos necesitan una configuración adicional del entorno, por lo que necesito envolverlos en pequeños scripts BAT.

¿Cómo ejecuto un script de este tipo en Windows XP en segundo plano?

CALL env-script.bat lo ejecuta sincrónicamente, es decir, el script de configuración puede continuar sólo después de que el comando en el script env ha terminado.

START/B env-script.bat ejecuta otra instancia de CMD.exe en el mismo símbolo del sistema, dejándolo en un estado realmente desordenado (veo la salida del CMD.exe anidado, el teclado está inactivo por un tiempo, el script no se ejecuta).

START/B CMD env-script.batproduce el mismo resultado. Ninguna de las banderas de CMD parece coincidir con mi factura.

Aaron Digulla
fuente

Respuestas:

72

En realidad, lo siguiente funciona bien para mí y crea nuevas ventanas:

test.cmd:

@echo off
start test2.cmd
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 eso con parámetros startcomo /min, como Moshe señaló si no desea que las nuevas ventanas aparezcan frente a usted.

Joey
fuente
1
Bien, esto funciona pero no es 100% perfecto: después de presionar "RETORNO" en "Prueba 2", esa ventana no se cierra. ¿Algunas ideas?
Aaron Digulla
Puede agregar "salida" a los lotes generados para cerrarlos después nuevamente. Lo siento, no probé tan lejos :)
Joey
de hecho, el start script1.bat \ n start script2.bat \ n start scriptN.bat fue suficiente para mí
andrej
142

Dos años, pero para completar ...

Enfoque estándar, en línea: (es decir, el comportamiento que obtendría al usarlo &en Linux)

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

Notas: 1. CALLestá emparejado con el archivo .bat porque es donde suele ir ... (es decir, esto es solo una extensión del CMD /C CALL "foo.bat"formulario para que sea asincrónico. Por lo general, se requiere para obtener correctamente los códigos de salida, pero eso no es un problema aquí.); 2. Las comillas dobles alrededor del archivo .bat solo son necesarias si el nombre contiene espacios. (El nombre podría ser una ruta, en cuyo caso es más probable que ocurra).

Si no quiere la salida:

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

Si desea que el bat se ejecute en una consola independiente: (es decir, otra ventana)

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

Si desea que la otra ventana permanezca después:

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

Nota: Esta es realmente una forma pobre a menos que tenga usuarios que específicamente quieran usar la ventana abierta como una consola normal. Si solo desea que la ventana se quede para ver el resultado, es mejor poner un PAUSEal final del archivo bat. O incluso aún, agregue ^& PAUSEdespués de la línea de comando:

START CMD /C CALL "foo.bat" [args [...]] ^& PAUSE
antak
fuente
10
&es un operador "y luego" (¿terminología?). (por ejemplo, cmd1 & cmd2significa hacer "cmd1" y luego "cmd2". A diferencia del &&operador, la ejecución de "cmd2" no depende de la salida exitosa de "cmd1"). El ^escape &para entrar en los argumentos de CMD en lugar de ser consumido y ejecutado por la misma consola que ejecutó START.
antak
Esto es muy útil, gracias. Estaba a punto de migrar algunos scripts a Linux, porque otras guías starty cmdno ofrecían la funcionalidad completa que buscaba. Tu respuesta lo clava.
Iterador
3
Si no desea la salida, la redirección debe escaparse para que se pase a CMD. Además, no es necesario LLAMAR:START /B "" CMD /C "foo.bat" [args [...]] ^>nul 2^>^&1
dbenham
1
@dbenham: Aunque lo que está diciendo tiene sentido, START /B "" CMD /C PING 127.0.0.1 >NULparece funcionar independientemente y no se produce nada. (Probablemente porque CMDhereda STARTlos identificadores de E / S). Supongo que la diferencia es si desea mantener STARTintacta la salida (error), lo que probablemente sea una buena idea. CALLestá ahí porque sentí que es una buena práctica para mantener. (es decir, no utilizando CALLpara síncronos llamadas de murciélagos dará lugar a los códigos de salida impredecibles, así que constantemente el par llamadas de murciélagos con CALLincluso cuando no se aplica estrictamente, como en este caso.)
antak
7

Dado que START es la única forma de ejecutar algo en segundo plano desde un script CMD, le recomendaría que lo siga usando. En lugar del modificador / B, intente / MIN para que la ventana recién creada no le moleste. Además, puede establecer la prioridad en algo más bajo con / LOW o / BELOWNORMAL, lo que debería mejorar la capacidad de respuesta de su sistema.

Moshe
fuente
-1 El problema es que START no crea una nueva ventana cuando inicia un archivo BAT; en su lugar, reutiliza la ventana actual y mezcla los dos procesos CMD de E / S.
Aaron Digulla
4
No está creando una nueva ventana porque está usando el indicador / B. Retirarlo.
Moshe
5

Término distinto al de primer plano o de fondo. Otra forma de ocultar la ventana en ejecución es a través de vbscript, si todavía está disponible en su sistema.

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

nombrarlo como sth.vbs y llamarlo desde bat, poner en una tarea programada, etc. Personalmente, deshabilitaré vbs sin prisa en cualquier sistema Windows que administre :)

Mea culpa
fuente
Para mi caso de uso particular, esta fue en realidad la única solución que pude poner a trabajar ...
Ben
0

Cree una nueva aplicación de Windows C # y llame a este método desde 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
fuente
2
Uhm ... esperaba que algo tan simple como eso no necesitara instalar Visual Studio ...
Aaron Digulla
1
Hasta que PowerShell esté disponible al 100%, C # es realmente excesivo.
jim
2
Aaron: El compilador de C # está incluido en .NET Framework 2, por lo que puede editar código en un editor de texto y compilarlo. Aún así, dado que esto es perfectamente posible en un archivo por lotes, también diría que C # es excesivo.
Joey
0

Esto funciona en mi instalación de Windows XP Home, al modo Unix:

call notepad.exe & 
MiiToo
fuente
7
Creo que esto solo funciona por coincidencia, y el & no es necesario.
Sam Watkins
2
Sí, notepad.exe es asincrónico para empezar.
Antak
0

En realidad es bastante fácil con esta opción al final:

c: \ start BATCH.bat -WindowStyle Hidden

usuario8832474
fuente
el comando de Windows startno tiene una -WindowStyleopción.
Stephan
@Stephan Arreed. La ruta extraña ( C:` instead of C: \ Windows`) sugiere que encontró una herramienta en algún lugar de Internet y la copió en su disco duro.
Aaron Digulla