¿Cómo redirigir Windows cmd stdout y stderr a un solo archivo?

Resuelto ripper234 asked hace 15 años • 7 respuestas

Estoy intentando redirigir toda la salida (stdout + stderr) de un comando de Windows 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 redirigir a dos archivos separados?

ripper234 avatar Sep 14 '09 18:09 ripper234
Aceptado

Quieres:

dir > a.txt 2>&1

La sintaxis 2>&1redirigirá 2(stderr) a 1(stdout). También puedes ocultar mensajes redirigiéndolos a NUL. Encontrará más explicaciones y ejemplos en la página de documentación de Microsoft Redirigir mensajes de error desde el símbolo del sistema: STDERR/STDOUT .

Anders Lindahl avatar Sep 14 '2009 11:09 Anders Lindahl

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

REM *** WARNING: THIS WILL NOT REDIRECT STDERR TO STDOUT ****
dir 2>&1 > a.txt
DelboyJay avatar May 23 '2013 11:05 DelboyJay

Información básica de la documentación de Microsoft

Si bien la respuesta aceptada a esta pregunta es correcta, realmente no explica mucho por qué funciona, y como la sintaxis no es clara de inmediato, hice una búsqueda rápida en www para descubrir qué estaba pasando realmente. Con la esperanza de que esta información sea útil para otros, la publico aquí.

Tomado de la página de documentación de Microsoft:
Redirección de 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 a 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 secuencias separadas. La salida normal se envía a Standard Out (STDOUT) y los mensajes de error se envían a Standard Error (STDERR). Cuando redirige la salida de la consola usando el >símbolo, solo está redirigiendo STDOUT. Para redirigir STDERR, debe especificar 2>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:

El volumen en la unidad F es el número de serie del volumen Candy Cane es 34EC-0876
Archivo no encontrado

Si redirige la salida al dispositivo NUL usando dir file.xxx > nul, seguirá viendo el mensaje de error:

Archivo no encontrado

Para redirigir el mensaje de error a NUL, utilice el siguiente comando:

dir file.xxx 2> nul

O 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 solo archivo usando el &1comando para redirigir la salida de STDERR a STDOUT y luego enviando la salida de STDOUT a un archivo:

dir file.xxx 1> output.msg 2>&1
StormeHawke avatar Oct 18 '2013 18:10 StormeHawke

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

dir >> a.txt 2>&1
Henk Wiersema avatar Jul 24 '2013 10:07 Henk Wiersema

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

Tenga en cuenta que si los utiliza para crear archivos de registro, a menos que envíe la salida a archivos de registro con nombres _únicos_ (por ejemplo, con marca de fecha y hora), si ejecuta el mismo proceso dos veces, el redirigido sobrescribirá ( reemplazar) el archivo de registro anterior.

( >>para STDOUT o STDERR) ANEXARÁ, no REEMPLAZARÁ el archivo. De esta manera, obtiene un archivo de registro acumulativo que muestra los resultados de todas las ejecuciones del proceso, lo que suele ser más útil.

Rastros felices...

Max Vitesse avatar Feb 06 '2014 04:02 Max Vitesse