Estoy tratando de 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?
windows
command-line
cmd
pipe
ripper234
fuente
fuente
Respuestas:
Usted quiere:
La sintaxis
2>&1
redirigirá2
(stderr) a1
(stdout). También puede ocultar mensajes redirigiendo aNUL
, más explicaciones y ejemplos en MSDN .fuente
net stop w3svc >NUL 2>&1
¡gracias!2> 2.txt
funciona (o2> &1
)2 > 2.txt
no;2 > &1
no.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
2>&1
se especifique DESPUÉS de la1>
redirección, de lo contrario no funcionará.fuente
dir 2>&1 > a.txt
, primero está redirigiendo (>
) la secuencia 2 (stderr) a la secuencia 1 (stdout). Luego, después de que ambos ya estén unidos, está redirigiendo stdout (>
sin especificador) al archivo. Si quieres que stderr vaya a otro lado, no puedes unirlo con stdout primero.Información de antecedentes 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 descubrir qué estaba pasando realmente. Con la esperanza de que esta información sea útil para otros, la publicaré aquí.
Tomado de MS Support KB 110930 .
De MSKB110930
fuente
Para agregar stdout y stderr al archivo de registro general de un script:
fuente
>>
agrega al archivo donde se>
sobrescribe el archivo.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 por2>
.Tenga en cuenta que si los está utilizando para crear archivos de registro, a menos que esté enviando la salida a _uniquely_named_ (por ejemplo, fecha y hora con sello), si ejecuta el mismo proceso dos veces, el redireccionado 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.Rastros felices...
fuente
Sin embargo, no hay garantía de que la salida de
SDTOUT
ySTDERR
se entrelacen línea por línea en el orden oportuno, utilizando laPOSIX
sintaxis de combinación de redireccionamiento.Si una aplicación usa una 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 (es decir,
"StdOut/StdErr Logger"
by'LoRd MuldeR'
) puede ser más confiable para tal tarea.Ver: Proyectos de código abierto de MuldeR
fuente
En un archivo por lotes (Windows 7 y superior) encontré este método más confiable
Obviamente, use los comandos que desee y la salida se dirigirá al archivo de texto. El uso de este método es confiable SIN EMBARGO, NO hay salida en la pantalla.
fuente
>con echo This goes to screen
También es útil para la entrada del usuario>con set /p "var="Input: "
Nota: esas líneas solo aparecerán en la pantalla y no se redirigirán al archivo.