redireccionamiento ejemplos windows command-line cmd pipe

ejemplos - Redirigir Windows cmd stdout y stderr a un solo archivo



redireccionamiento linux ejemplos (7)

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


Información de fondo de MSKB

Si bien la respuesta aceptada a esta pregunta es correcta, en realidad no sirve mucho para explicar por qué funciona, y como la sintaxis no está clara de inmediato, hice un Google rápido para averiguar qué sucedía realmente. Con la esperanza de que esta información sea útil para otros, la estoy publicando aquí.

Tomado de MS Support KB 110930 .

De MSKB110930

Redireccionando 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 al flujo de error estándar en lugar del flujo 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 flujos separados. La salida regular 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á redireccionando 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 redirecciona la salida al dispositivo NUL utilizando dir file.xxx > nul , seguirá viendo la parte del mensaje de error de la salida, como esto:

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



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 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 esté enviando la salida a los archivos de registro _uniquely_named_ (por ejemplo, con fecha y hora), entonces si ejecuta el mismo proceso dos veces, el redireccionado se sobrescribirá ( reemplazar) el archivo de registro anterior.

La >> (ya sea para STDOUT o STDERR) APÉNDICE NO REEMPLAZA el archivo. Así que obtiene un archivo de registro acumulativo, mostrando los resultados de todas las ejecuciones del proceso, generalmente más útil.

Rastros felices...


La respuesta de Anders Lindahl es correcta, pero se debe tener en cuenta que si está redireccionando la salida estándar a un archivo y desea redireccionar también la red, entonces DEBE asegurarse de que se especifique 2>&1 DESPUÉS de la redirección 1> , de lo contrario no funcionará.

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

Manera correcta: dir > a.txt 2>&1 . Para anexar, utilice >> .


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

dir >> a.txt 2>&1


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

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

Un registrador de salida de consola dedicado (como "StdOut / StdErr Logger" por ''LoRd MuldeR'') puede ser más confiable para esa tarea. Ver: Proyectos OpenSource de MuldeR