2009-03-16 154 views
77

Tengo un script de "configuración" que ejecuto en la mañana que inicia todos los programas que necesito. Ahora, algunos de ellos necesitan configuración adicional del entorno, por lo que debo envolverlos en pequeños scripts BAT.¿Cómo ejecuto un archivo bat en el fondo de otro archivo bat?

¿Cómo ejecuto una secuencia de comandos de este tipo en Windows XP en segundo plano?

CALL env-script.bat lo ejecuta de forma síncrona, es decir, el script de instalación solo puede continuar después de que el comando en el env-script ha finalizado.

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 el resultado del CMD.exe anidado, el teclado está muerto por un tiempo, el script no se ejecuta).

START/B CMD env-script.bat produce el mismo resultado. Ninguno de los indicadores en CMD parece coincidir con mi factura.

Respuesta

62

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

test.cmd:

@echo off 
call "cmd /c start test2.cmd" 
call "cmd /c start test3.cmd" 
echo Foo 
pause 

test2.cmd

@echo off 
echo Test 2 
pause 
exit 

test3.cmd

@echo off 
echo Test 3 
pause 
exit 

se combinan con los parámetros de start, como /min, como Moshe señaló si no desea que las nuevas ventanas para desovar en frente de usted.

+1

Bien, esto funciona pero no es 100% perfecto: después de presionar "RETORNO" en "Prueba 2", esa ventana no se cierra. ¿Algunas ideas? –

+0

Puede agregar "salida" a los lotes generados para volver a cerrarlos. Lo siento, no he probado tan lejos :) – Joey

5

Dado que START es la única forma de ejecutar algo en segundo plano a partir de un script CMD, le recomendaría que siga usándolo. En lugar del modificador/B, pruebe/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.

+0

-1 el problema es que el START no crea una nueva ventana cuando se inicia un archivo BAT; en su lugar, reutiliza la ventana actual y mezcla los dos procesos CMD de E/S. –

+4

No está creando una nueva ventana porque está usando el indicador/B. Eliminarlo – Moshe

0

Crear una nueva aplicación de C# Windows y llamar a este método de la principal:

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(); 
} 
+1

Uhm ... Esperaba que algo tan simple como eso no necesitara instalar Visual Studio ... –

+1

Hasta que PowerShell esté disponible 100% - C# es realmente exagerado. – jim

+2

Aaron: El compilador C# está incluido en .NET Framework 2, por lo que puede simplemente editar algunos códigos en un editor de texto y compilarlos. 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 Windows XP Home   instalación, la forma en Unix:

call notepad.exe & 
+6

Creo que esto solo funciona por coincidencia, y el & no es necesario. –

+2

Sí, notepad.exe es asíncrono para empezar. – antak

+3

¡Esto fue bueno para reír! –

119

dos años, pero para redondear ...

estándar, el enfoque en línea: (es decir, que el comportamiento 'd conseguir al utilizar & en Linux)

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

Notas: 1. CALL es emparejado con el archivo .bat porque allí donde suele ir ... (es decir Esto es solo una extensión del formulario CMD /C CALL "foo.bat" para hacerlo asíncrono. Por lo general, se requiere 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 hay más probabilidad de eso).

Si no desea que la salida:

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

Si desea que el bate para ejecutar 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: En realidad, esta es una forma deficiente a menos que haya usuarios que deseen específicamente usar la ventana abierta como una consola normal. Si solo quiere que la ventana se quede para ver el resultado, es mejor que ponga un PAUSE al final del archivo bat. O incluso sin embargo, añadir ^& PAUSE después de la línea de comandos:

START CMD /C CALL "foo.bat" [args [...]] ^& PAUSE 
+0

¿Qué hace '^ &'? –

+10

'&' es un operador "y luego" (¿terminología?). (ej. 'cmd1 & cmd2' significa" cmd1 "y luego" cmd2 ". A diferencia del operador' && ', la ejecución de" cmd2 "no depende de la salida exitosa de" cmd1 ".) El'^'escapa del '&' para que vaya a los argumentos de CMD en lugar de ser consumido y ejecutado por la misma consola que ejecutó START. – antak

+0

Esto es muy útil, gracias. Estaba a punto de portar algunas secuencias de comandos a Linux, porque otras guías para 'start' y' cmd' no daban la funcionalidad completa que buscaba. Tu respuesta lo clava. – Iterator

2

Aparte de término de primer plano/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) 

el nombre como sth.vbs y llamarlo desde el bate, se puso en la tarea sheduled, etc. PersonallyI'll desactivar vbs sin prisas en cualquier sistema de Windows Me las arreglo :)

+0

aunque no Me gusta VBScript, hace el trabajo bien. ¡Bonito! – MateusBR

+0

Para mi caso de uso particular, esta fue en realidad la única solución que pude obtener para trabajar ... – Ben

0

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

c: \ comenzar Batch.bat -WindowStyle Ocultos

+0

el comando de Windows 'start' no tiene una opción' -WindowStyle'. – Stephan

+0

@Stephan Arreed. La ruta impar ('C: \' en lugar de 'C: \ Windows \') sugiere que encontró una herramienta en algún lugar de Internet y la copió en su disco duro. –

Cuestiones relacionadas