Redirigir Windows cmd stdout y stderr a un solo archivo

Estoy intentando redirigir todos los resultados (stdout + stderr) de un comando DOS a un solo archivo:

C:\>dir 1> a.txt 2> a.txt The process cannot access the file because it is being used by another process. 

¿Es posible, o debería simplemente redireccionar a dos archivos separados?

Usted quiere:

 dir > a.txt 2>&1 

La syntax 2>&1 redireccionará 2 (stderr) a 1 (stdout). También puede ocultar mensajes redireccionando a NUL , más explicaciones y ejemplos en MSDN .

La respuesta de Anders Lindahl es correcta, pero debe tenerse en cuenta que si está redireccionando stdout a un archivo y desea redirigir también stderr, DEBE asegurarse de que 2>&1 estén especificados DESPUÉS del 1> redireccionamiento; de lo contrario, no funcionará.

 REM *** WARNING: THIS WILL NOT REDIRECT STDERR TO STDOUT **** dir 2>&1 > a.txt 

dir > a.txt 2>&1 correcta: dir > a.txt 2>&1 . Para agregar, use >> .

Información de fondo de MSKB

Si bien la respuesta aceptada a esta pregunta es correcta, realmente no sirve de mucho explicar por qué funciona, y como la syntax no está clara de inmediato, hice un rápido búsqueda en Google para descubrir qué estaba sucediendo realmente. Con la esperanza de que esta información sea útil para otros, la publico aquí.

Tomado de MS Support KB 110930 .


De MSKB110930

Redirigir mensajes de error desde el símbolo del sistema: STDERR / STDOUT

Resumen

Al redirigir la salida de una aplicación usando el símbolo ‘>’, los mensajes de error aún se imprimen en la pantalla. Esto se debe a que los mensajes de error a menudo se envían a la secuencia de error estándar en lugar de la secuencia de salida estándar.

La salida de una aplicación o comando de consola (Símbolo del sistema) a menudo se envía a dos flujos separados. La salida regular se envía a Salida estándar (STDOUT) y los mensajes de error se envían a Error estándar (STDERR). Cuando redirige la salida de la consola usando el símbolo “>”, solo está redirigiendo STDOUT. Para redirigir STDERR, debe especificar ‘2>’ para el símbolo de redirección. Esto selecciona el segundo flujo de salida que es STDERR.

Ejemplo

El comando dir file.xxx (donde file.xxx no existe) mostrará el siguiente resultado:

 Volume in drive F is Candy Cane Volume Serial Number is 34EC-0876 File Not Found 

Si redirige la salida al dispositivo NUL usando dir file.xxx > nul , aún verá el mensaje de error como parte de la salida, así:

 File Not Found 

Para redirigir (solo) el mensaje de error a NUL , use el siguiente comando:

 dir file.xxx 2> nul 

O bien, puede redirigir la salida a un lugar y los errores a otro.

 dir file.xxx > output.msg 2> output.err 

Puede imprimir los errores y la salida estándar en un único archivo utilizando el comando “& 1” para redirigir la salida de STDERR a STDOUT y luego enviar la salida de STDOUT a un archivo:

 dir file.xxx 1> output.msg 2>&1 

Para agregar stdout y stderr al archivo de registro general de un script:

 dir >> a.txt 2>&1 

Correcto, el identificador de archivo 1 para el proceso es STDOUT, redirigido por 1> o por > (1 se puede omitir, por convención, el intérprete de comandos [cmd.exe] sabe manejarlo). File handle 2 es STDERR, redirigido por 2> .

Tenga en cuenta que si los usa para crear archivos de registro, a menos que esté enviando el outut a _uniquely_named_ (por ejemplo, archivos de registro con fecha y hora), si ejecuta el mismo proceso dos veces, el redireccionado sobrescribirá ( reemplazar) el archivo de registro anterior.

El >> (ya sea para STDOUT o STDERR) no ADEMÁS REEMPLAZARÁ el archivo. Así que obtienes un archivo de registro acumulativo, que muestra los resultados de todas las ejecuciones del proceso, generalmente más útil.

Rastros felices…

Acabo de cortar la respuesta como @Anders acaba de publicarlo, pero …

Desde mi ayuda de Windows, busqué en la redirección (URL ms-its: C: \ WINDOWS \ Help \ ntcmds.chm :: / redirection.htm ).

Es posible que desee leer acerca de >> y | (tubería), también.

Sin embargo, no hay garantía de que la salida de SDTOUT y STDERR se entrelazan línea por línea en el momento oportuno, utilizando la syntax de combinación de redirección POSIX.

Si una aplicación utiliza salida almacenada en búfer, puede suceder que el texto de una secuencia se inserte en la otra en un límite de búfer, que puede aparecer en el medio de una línea de texto.

Un registrador de salida de consola dedicado (como el “StdOut / StdErr Logger” de “LoRd MuldeR”) puede ser más confiable para tal tarea. Ver: los proyectos OpenSource de MuldeR