2010-11-18 17 views
8

Tengo un archivo por lotes que por lo general invoco como esto:cómo ejecutar un archivo por lotes cmd.exe en una cáscara de sub

longjob.cmd >result.txt 2>&1 

Esto funciona bien, pero el guión cambia de directorio durante su ejecución dejando mi concha en ese directorio, lo cual es una molestia.

¿Hay alguna manera de ejecutar el comando dentro de un subconjunto, sin dejar de capturar la salida?

He tratado

cmd longjob.cmd >result.txt 2>&1 

la que sólo se sienta a la espera de un comando de salida.

También probé

start longjob.cmd >result.txt 2>&1 

la que se ejecuta la secuencia de comandos, pero en una nueva ventana y toda la producción se envía a la ventana en lugar del archivo.

+0

La manera más fácil de lidiar con esto es en realidad arreglar el archivo por lotes. 'pushd' /' popd' son de ayuda aquí. A menos que el propósito del archivo por lotes sea cambiar el directorio, nunca escribiría uno que salga en otro directorio que no sea el que comenzó. – Joey

+0

¿Qué tal si cancelas el archivo por lotes con^C, por ejemplo? ¿Hay alguna manera sensata de restaurar el directorio de trabajo original a pesar de que se haya cancelado el archivo por lotes? – bambams

Respuesta

12

Trate

CMD /C longjob.cmd >result.txt 2>&1 

No estoy seguro de cómo va a lidiar con el cambio de dirección, pero CMD/C le deja decir lo CMD para correr y que debe salir cuando haya terminado. (CMD/K le permite decir que ejecute algo, pero quédese cuando termine). Reutilizará la ventana de consola existente si se ejecuta dentro de uno.

+0

"cmd/c" parece hacer el truco. Muchas gracias. – Martin

+0

Exactamente lo opuesto, Leo: '/ c' existe después de ejecutar el comando,'/k' le dará el mensaje después. – Joey

+0

Sí, tengo la C y la K al revés. Editado para corregir –

0

El comando call es lo que usted desea.

decir

call longjob.cmd >result.txt 2>&1 
+1

si longjob.cmd llama a chdir, el shell que realiza la llamada se deja en ese directorio cuando el script finaliza cuando se usa con call. – Martin

+0

La llamada no parece ejecutar el script en un proceso separado (sub-shell). Simplemente ejecuta la secuencia de comandos en el proceso actual dejando efectos secundarios (cambios de directorio, modificación de la variable de entorno, etc.) de la ejecución. – Nathan

Cuestiones relacionadas