¿Cómo redirigir Windows cmd stdout y stderr a un solo archivo?
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?
Quieres:
dir > a.txt 2>&1
La sintaxis 2>&1
redirigirá 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 .
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>&1
especifique 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
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 especificar2>
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 encontradoSi 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
&1
comando 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
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 >
(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...