Redirigir Windows cmd stdout y stderr a un solo archivo

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

preguntado el 14 de septiembre de 09 a las 08:09

TechNet: Usar operadores de redirección de comandos (responde esto mejor que cualquiera de las respuestas aquí). -

2> & 1 ya que no puede volver a abrir el mismo archivo -

7 Respuestas

Usted quiere:

dir > a.txt 2>&1

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

Respondido el 19 de enero de 17 a las 10:01

gracias por esto, ¡no sabía que esta sintaxis de shell de Unix también funciona para DOS! - conductor de cadena

esto es genial para ocultar toda la salida. net stop w3svc >NUL 2>&1.. ¡Gracias! - kodybrown

@wasatchwizard Creo que tuve problemas con eso, pero> NUL 2> NUL funcionó bien - FrinkTheBrave

Si hay un identificador, no puede haber un espacio entre el identificador (es decir, 2) y el operador de redireccionamiento (es decir,>). Por lo tanto 2> 2.txt trabaja (o 2> &1) 2 > 2.txt no es; 2 > &1 no es. - El guisante rojo

Amo tanto. "Uf, este pequeño problema único va a tomar como una hora". Me tomó más tiempo escribir este comentario que encontrar esta respuesta. - Brandon

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

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

Respondido 23 ago 19, 00:08

¡DESPUÉS es lo que me costó horas descubrir qué pasa con DelboyJay! ¡Gracias! - Nam G VU

¿Se explica en alguna parte por qué poner 2> & 1 antes de 1> no logrará el efecto deseado? Sospecho fuertemente que esto tiene que ver con la forma en que "cmd" analiza los comandos que dan dos significados diferentes dependiendo del orden en el que especifiques la redirección. Pero las reglas semánticas están documentadas en alguna parte porque creo que vale la pena aprender esto, ya que podría perder horas. - igbgotiz

@igbgotiz 2> & 1 significa 'redirigir el flujo 2 al flujo 1'. Por lo tanto, primero debe configurar la transmisión 1: FrinkTheBrave

@FrinkTheBrave pero el flujo 1 es una salida estándar (por ejemplo, consola) si no se especifica explícitamente. Eso todavía no lo explica en mi humilde opinión. - mariods

@MDeSchaepmeester, si es así dir 2>&1 > a.txt, primero está redirigiendo (>) flujo 2 (stderr) al flujo 1 (stdout). Luego, después de que ambos ya estén unidos, está redirigiendo stdout (> sin especificador) al archivo. Si desea que stderr vaya a otro lugar, no puede unirse a stdout primero. - cp.engr

Información de antecedentes de MSKB

Si bien la respuesta aceptada a esta pregunta es correcta, realmente no explica mucho el porqué Funciona, y dado que la sintaxis no es clara de inmediato, hice una búsqueda rápida en Google para averiguar qué estaba pasando realmente. Con la esperanza de que esta información sea útil para otros, la estoy publicando aquí.

Tomado de Soporte de 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 el símbolo '>', los mensajes de error aún se imprimen en la pantalla. Esto se debe a que los mensajes de error se envían a menudo al flujo de error estándar en lugar del flujo 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 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>' 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á la siguiente salida:

Volume in drive F is Candy Cane Volume Serial Number is 34EC-0876

File Not Found

Si redirige la salida a la NUL dispositivo usando dir file.xxx > nul, seguirá viendo 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 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

Respondido el 21 de diciembre de 17 a las 13:12

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

dir >> a.txt 2>&1

Respondido 22 Jul 18, 15:07

La >> se agrega al archivo donde el > sobrescribe el archivo. - Delliottg

Correcto, el identificador de archivo 1 para el proceso es STDOUT, redirigido por el 1> o por > (1 se puede omitir, 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 _uniquely_named_ (por ejemplo, con fecha y hora), si ejecuta el mismo proceso dos veces, el redireccionamiento sobrescribirá reemplazar) el archivo de registro anterior.

La >> (para STDOUT o STDERR) APPEND no REPLACE el archivo. Entonces, obtiene un archivo de registro acumulativo, que muestra los resultados de todas las ejecuciones del proceso, generalmente más útil.

Rastros felices...

Respondido 06 Feb 14, 04:02

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

Si una aplicación usa salida 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 (es decir, el "StdOut/StdErr Logger" by 'LoRd MuldeR') puede ser más confiable para tal tarea.

Ver: Proyectos de código abierto de MuldeR

Respondido 27 ago 19, 11:08

En un archivo por lotes (Windows 7 y superior) encontré este método más confiable

Call :logging >"C:\Temp\NAME_Your_Log_File.txt" 2>&1
:logging
TITLE "Logging Commands"
ECHO "Read this output in your log file"
ECHO ..
Prompt $_
COLOR 0F

Obviamente, use los comandos que desee y la salida se dirigirá al archivo de texto. Usando este método is confiable SIN EMBARGO no hay salida en la pantalla.

Respondido el 12 de Septiembre de 19 a las 21:09

(Básicamente, la misma respuesta que se dio hace algunos años). Puede forzar la salida a la pantalla con >con echo This goes to screen También es útil para la entrada del usuario >con set /p "var="Input: " Nota: esas líneas , solamente aparecen en la pantalla y no ser redirigido al archivo. - Stephan

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.