Pregunta Redirigir Windows cmd stdout y stderr a un solo archivo


Estoy intentando redirigir todos los resultados (stdout + stderr) de un DOS comando 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?


538
2017-09-14 11:20


origen


Respuestas:


Usted quiere:

dir > a.txt 2>&1

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


855
2017-09-14 11:23



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

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

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


166
2018-05-23 11:59



Información de fondo de MSKB

Si bien la respuesta aceptada a esta pregunta es correcta, realmente no hace mucho para explicar por qué funciona, y como la sintaxis no está clara de inmediato, hice una búsqueda rápida 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 (dónde 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 a la NUL dispositivo que usa 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, usa 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

69
2017-10-18 18:57



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

dir >> a.txt 2>&1

18
2017-07-24 10:16



Correcto, el identificador de archivo 1 para el proceso es STDOUT, redirigido por el 1> o por > (Se puede omitir 1, por convención, el intérprete de comandos [cmd.exe] sabe manejar eso). El identificador de archivo 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.

los >> (ya sea para STDOUT o STDERR), APPEND no 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...


12
2018-02-06 04:28



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

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

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


4
2017-09-14 11:27



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 sintaxis 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


0
2018-02-27 13:30