Pregunta

Estoy tratando de 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 redirigir a dos archivos separados?

¿Fue útil?

Solución

Quieres:

dir > a.txt 2>&1

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

Otros consejos

La respuesta de Anders Lindahl es correcta, pero debe tenerse en cuenta que si está redirigiendo stdout a un archivo y desea redirigir también stderr, DEBE asegurarse de que se especifique 2 > & amp; 1 < strong> DESPUÉS la redirección 1 > , 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 > & amp; 1 . Para agregar, use > > .

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 dado que la sintaxis no está clara de inmediato, hice un rápido google para averiguar qué En realidad estaba sucediendo. Con la esperanza de que esta información sea útil para otros, la publicaré aquí.

Tomado de Soporte MS 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 '>' símbolo, todavía se imprimen mensajes de error 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 de consola (Símbolo del sistema) o un comando a menudo se envía a dos secuencias separadas. 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 con " > " símbolo, solo está redirigiendo STDOUT. Para redirigir STDERR, debe especificar '2 >' para el símbolo de redireccionamiento. Esto selecciona la segunda secuencia 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á la parte del mensaje de error 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 solo archivo usando & amp; & amp; 1 " comando 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 puede omitirse, 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 está utilizando para crear archivos de registro, a menos que envíe la salida a archivos de registro _nombremente_nombrados_ (por ejemplo, con fecha y hora), si ejecuta el mismo proceso dos veces, el redireccionamiento sobrescribirá (reemplazará) el archivo de registro anterior.

El > > (para STDOUT o STDERR) APENDERÁ, NO REEMPLAZARÁ el archivo. Entonces obtienes un archivo de registro acumulativo, que muestra los resultados de todas las ejecuciones del proceso, generalmente más útil.

Senderos felices ...

Acabo de cortar la respuesta cuando @Anders la acaba de publicar, 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 sobre > > y | (tubería), también.

Sin embargo, no hay garantía de que la salida de SDTOUT y STDERR se entrelacen línea por línea en el orden oportuno, utilizando la sintaxis de combinación de redireccionamiento POSIX.

Si una aplicación usa resultados almacenados en búfer, puede suceder que el texto de una secuencia se inserte en el otro 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 '' StdOut / StdErr Logger '' de 'LoRd MuldeR') puede ser más confiable para tal tarea. Ver: Proyectos OpenSource de MuldeR

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top