Tengo un script por lotes que ejecuta una tarea y envía la salida a un archivo de texto. ¿Hay alguna manera de que la salida se muestre también en la ventana de la consola?
Por ejemplo:
c:\Windows>dir > windows-dir.txt
¿Hay alguna manera de tener la salida de dir
visualización en la ventana de la consola y ponerla en el archivo de texto?
windows
batch-file
cmd
JamesEggers
fuente
fuente
Respuestas:
No, no puedes con la redirección pura.
Pero con algunos trucos (como tee.bat ) puedes.
Intento explicar un poco la redirección.
Redirige una de las diez secuencias con > archivo o <archivo
No es importante, si la redirección es anterior o posterior al comando, por lo que estas dos líneas son casi iguales.
La redirección en este ejemplo es solo un acceso directo para 1> , esto significa que la secuencia 1 (STDOUT) será redirigida.
Por lo tanto, puede redirigir cualquier secuencia con anteponer el número como 2> err.txt y también se le permite redirigir múltiples secuencias en una línea.
En este ejemplo, la "salida estándar" irá a files.txt, todos los errores estarán en err.txt y el stream3 irá a nothing.txt (DIR no usa el stream 3).
Stream0 es STDIN
Stream1 es STDOUT
Stream2 es STDERR
Stream3-9 no se utilizan
Pero, ¿qué sucede si intentas redirigir la misma secuencia varias veces?
"Solo puede haber uno", ¡y siempre es el último!
Entonces es igual a dir> two.txt
Ok, hay una posibilidad adicional, redirigir una transmisión a otra transmisión.
2> & 1 redirige stream2 a stream1 y 1> files.txt redirige todo a files.txt .
¡El orden es importante aquí!
son diferentes. El primero redirige todo (STDOUT y STDERR) a NUL,
pero la segunda línea redirige el STDOUT a NUL y STDERR al STDOUT "vacío".
Como conclusión, es obvio por qué los ejemplos de Otávio Décio y andynormancx no pueden funcionar.
Ambos intentan redirigir stream1 dos veces, pero "Solo puede haber uno", y siempre es el último.
Entonces obtienes
Y en la primera muestra, la redirección de stream1 a stream1 no está permitida (y no es muy útil).
Espero eso ayude.
fuente
3<&2
(tenga en cuenta el LT en lugar de GT), y luego3>errors.txt
. Pero esto terminó mal: toda la salida posterior de stderr se capturó enerrors.txt
(es decir, ¡desde otros comandos también!).for /f "delims=" %%v in ('dir') do echo %%v>>file.txt
Aunque podrías usarlo .Simplemente use la versión de Windows del comando tee de UNIX (que se encuentra en http://unxutils.sourceforge.net ) de esta manera:
Si también necesita la salida STDERR, utilice lo siguiente.
El
2>&1
combina la salida STDERR en STDOUT (la corriente primaria).fuente
1>tee a.txt
redirigirá stdout a un archivo llamado entee
lugar de llamar altee
comando. ¿Alguien puede confirmar que esta respuesta les funciona?Si no necesita la salida en tiempo real (es decir, como el programa lo está escribiendo), puede agregar
despues de esa linea.
fuente
dir > windows-dir.txt & type windows-dir.txt
. Esto también se aplica a los bloques:( echo %date% <NL> echo %username% <NL> echo %time% <NL> pause>CON )>test.txt & type test.txt
. Sin embargo, si se requiere que la salida en tiempo real, se puede utilizar por ejemplo un puerto de las ventanas de la camiseta herramienta para eso ...La solución que funcionó para mí fue: dir> a.txt | escriba a.txt .
fuente
Sí, hay una manera de mostrar una salida de comando único en la consola (pantalla) y en un archivo. Usando su ejemplo, use ...
Explicación detallada:
El
FOR
comando analiza la salida de un comando o texto en una variable, a la que se puede hacer referencia varias veces.Para un comando, como
DIR /B
, encerrar entre comillas simples como se muestra en el ejemplo a continuación. Reemplace elDIR /B
texto con su comando deseado.Para mostrar texto, encierre el texto entre comillas dobles como se muestra en el ejemplo a continuación.
... Y con envoltura de línea ...
Si tiene momentos en los que desea la salida solo en la consola (pantalla), y otros tiempos enviados solo al archivo, y otros tiempos enviados a ambos, especifique la cláusula "DO" del bucle FOR utilizando una variable, como se muestra a continuación con
%TOECHOWHERE%
.fuente
delims=
en su lugar.fuente
Si desea agregar en lugar de reemplazar el archivo de salida, puede usar
o
fuente
Mi opción fue esta:
Cree una subrutina que tome el mensaje y automatice el proceso de enviarlo a la consola y al archivo de registro.
Si agrega una variable al mensaje, asegúrese de eliminar las comillas antes de enviarlo a la subrutina o puede arruinar su lote. Por supuesto, esto solo funciona para hacer eco.
fuente
setlocal enabledelayedexpansion
lugar de solosetlocal
2) Utilizo la expansión retrasada para la variable del archivo de registro, por lo que en>> !logfile!
lugar de>> %logfile%
dentro de la subrutina. De esta manera, funciona cuando se llama desde un bloque de código (como dentro de una instrucción if). 3) Eliminé la línea "establecer mensaje" porque no hay necesidad de la variable adicional. Ya lo tenemos,$~1
así que tengoecho $~1
para ambos comandos echo.Hice una consola C # simple que puede manejar la salida en tiempo real a la pantalla cmd y al registro
El uso del archivo por lotes es el mismo que el de Unix.
tee
Y aquí está el repositorio que incluye Tee.exe en caso de que no tenga una herramienta para compilar https://github.com/iamshiao/Tee
fuente
Me gusta la respuesta de atn, pero no fue tan trivial para mí descargar como wintee , que también es de código abierto y solo ofrece la funcionalidad tee (útil si solo quieres tee y no todo el conjunto de utilidades de Unix). Me enteré de esto por la respuesta de Davor a la visualización de la salida del símbolo del sistema de Windows y redirigirla a un archivo , donde también encontrará referencias a las utilidades de Unix.
fuente
La solución proporcionada por "Tomas R" funciona perfectamente para la pregunta del OP y está disponible de forma nativa.
Pruebe: chkdsk c:> output.txt | escriba output.txt
El resultado de este comando implica un porcentaje de finalización que se genera en serie en el archivo, por lo que se verá un poco desordenado (es decir, el texto se agregará a medida que avance). Esto no sucede con los bits que salen a STDOUT (la pantalla). Es lo que sería si solo hicieras el mismo comando sin redireccionar.
fuente
Creo que quieres algo en este sentido:
O si quieres una nueva línea:
Estos comandos son excelentes para los registros.
Nota: Esto algunas veces fallará y reemplazará el archivo de texto completo en mi computadora.
Otra nota: si el archivo no existe, creará el archivo.
fuente
>
está diseñado para sobrescribir el archivo. Úselo>>
para agregar )