¿Cómo puedo ejecutar una aplicación de línea de comandos en el símbolo del sistema de Windows y hacer que la salida se muestre y se redirija a un archivo al mismo tiempo?
Si, por ejemplo, ejecutara el comando dir > test.txt
, esto redirigiría la salida a un archivo llamado test.txt
sin mostrar los resultados.
¿Cómo podría escribir un comando para mostrar la salida y redirigir la salida a un archivo en el símbolo del sistema de Windows, similar al tee
comando en Unix?
batch-file
cmd
stdout
tee
Edward Thomson
fuente
fuente
Respuestas:
Para ampliar la respuesta de davor , puede usar PowerShell de esta manera:
Si está intentando redirigir la salida de un exe en el directorio actual, debe usar
.\
el nombre del archivo, por ejemplo:fuente
dir
en cuenta que en powershell hay un aliasGet-ChildItem
que no es como eldir
comando interno de cmd . Necesitaspowershell "cmd /c dir | tee test.txt"
si quieres la versión interna de cmd2>&1
, por ejemplonode 2>&1 | tee debug_log.txt
Pude encontrar una solución / solución alternativa para redirigir la salida a un archivo y luego a la consola:
donde dir es el comando cuya salida necesita ser redirigida, a.txt un archivo donde almacenar la salida.
fuente
&
lugar de a|
para la salida de algunos comandos, comoping
o7z.exe
dir
. Ejemplo:chkdsk /f c: > c:\Temp.txt | c:\Temp.txt
. El archivo de informe del sistema está bloqueado por otro proceso.handle output to stderr
- Agregue la2>&1
redirección para que sea así:dir 2>&1 > a.txt & type a.txt
y debería haber mezclado stderr con stdout.Hay un puerto Win32 del
tee
comando Unix , que hace exactamente eso. Ver http://unxutils.sourceforge.net/ o http://getgnuwin32.sourceforge.net/fuente
tee
paquete de GnuWin32 , lo encontrará en gnuwin32.sourceforge.net/packages/coreutils.htm .Mira esto: invierno
No hay necesidad de cygwin.
Sin embargo, encontré e informé algunos problemas.
También puede verificar unxutils porque contiene tee (y no necesita cygwin), pero tenga en cuenta que los EOL de salida son como UNIX aquí.
Por último, pero no menos importante, si tiene PowerShell, puede probar Tee-Object. Escriba
get-help tee-object
en la consola de PowerShell para obtener más información.fuente
tee
genera en tiempo real.wtee
Tiene la misma funcionalidad. Si no te importan los errores, te irá bien.@ tori3852
encontre eso
no funcionó (solo las primeras líneas de la lista de directorios: sospecha algún tipo de bifurcación de proceso y la segunda parte, ¿el comando 'tipo' terminó antes de que se completara la lista de direcciones?), así que en su lugar utilicé:
que hizo - comandos secuenciales, uno completa antes de que comience el segundo.
fuente
&
lugar de&&
si desea asegurarse de que eltype
comando se ejecute incluso si eldir
comando falla. Esto es útil cuando hubo algún tipo de error en su comando y aún desea ver el archivo de registro en la consola. Vea el artículo de Microsoft sobre esto . Sin embargo, esto tiene el problema de%errorlevel%
establecerse en el nivel de error detype
(que sería 0).Lamentablemente no existe tal cosa.
Las aplicaciones de consola de Windows solo tienen un único controlador de salida. (Bueno, hay dos
STDOUT
,STDERR
pero no importa aquí)>
Redirige la salida que normalmente se escribe en el controlador de la consola a un controlador de archivo.Si desea tener algún tipo de multiplexación, debe usar una aplicación externa a la que pueda desviar la salida. Esta aplicación puede volver a escribir en un archivo y en la consola.
fuente
tee
on * nix también es una aplicación separada, no una redirección en el shellUna simple aplicación de consola C # haría el truco:
Para usar esto, simplemente canalice el comando de origen en el programa y proporcione la ruta de los archivos a los que desea duplicar la salida. Por ejemplo:
Mostrará los resultados de dir y almacenará los resultados tanto en files1.txt como en files2.txt.
Tenga en cuenta que no hay mucho (¡nada!) En la forma de manejo de errores anterior, y es posible que no sea necesario admitir múltiples archivos.
fuente
Esto funciona, aunque es un poco feo:
Es un poco más flexible que algunas de las otras soluciones, ya que funciona declaración por declaración, por lo que también puede usarlo para agregar. Lo uso bastante en los archivos por lotes para registrar y mostrar mensajes:
Sí, podría repetir la declaración de ECHO (una vez para la pantalla y la segunda redirigiendo al archivo de registro), pero eso parece igual de malo y es un problema de mantenimiento. Al menos de esta manera, no tiene que realizar cambios en los mensajes en dos lugares.
Tenga en cuenta que _ es solo un nombre de archivo corto, por lo que deberá asegurarse de eliminarlo al final de su archivo por lotes (si está utilizando un archivo por lotes).
fuente
type
embargo, poner los comandos en líneas separadas (en una subrutina) solucionó eso.mtee es una pequeña utilidad que funciona muy bien para este propósito. Es gratis, la fuente está abierta y simplemente funciona.
Puede encontrarlo en http://www.commandline.co.uk .
Utilizado en un archivo por lotes para mostrar la salida Y crear un archivo de registro simultáneamente, la sintaxis se ve así:
Donde / + significa agregar salida.
Esto supone que ha copiado mtee en una carpeta que está en la RUTA, por supuesto.
fuente
Me gustaría ampliar un poco la excelente respuesta de Saxon Druce .
Como se indicó, puede redirigir la salida de un ejecutable en el directorio actual de esta manera:
Sin embargo, esto sólo se registra
stdout
atest.txt
. Tampoco registrastderr
.La solución obvia sería usar algo como esto:
Sin embargo, esto no funcionará para todos los
something.exe
s. Algunossomething.exe
s interpretarán el2>&1
argumento como un argumento y fallarán. La solución correcta es, en cambio, solo tener apóstrofos alrededor desomething.exe
y sus interruptores y argumentos, así:fuente
'tee' is not recognized as an internal or external command
por razones obvias. Con la2>&1
línea interior de cmd, cualquier salida a stderr causa errores de powershell.Estoy de acuerdo con Brian Rasmussen, el puerto unxutils es la forma más fácil de hacer esto. En la sección de Batch Files de sus páginas de scripting, Rob van der Woude proporciona una gran cantidad de información sobre el uso de comandos MS-DOS y CMD. Pensé que podría tener una solución nativa a su problema y después de cavar por allí encontré TEE.BAT , que parece ser solo eso, una implementación de tee en lenguaje MS-DOS. Es un archivo por lotes de aspecto bastante complejo y mi inclinación sería seguir utilizando el puerto unxutils.
fuente
Si tiene cygwin en la ruta del entorno de Windows, puede usar:
fuente
dir 1>a.txt 2>&1 | type a.txt
Esto ayudará a redirigir tanto STDOUT como STDERR
fuente
Sé que este es un tema muy antiguo, pero en respuestas anteriores no hay una implementación completa de un Tee en tiempo real escrito en Batch. Mi solución a continuación es un script híbrido Batch-JScript que usa la sección JScript solo para obtener la salida del comando canalizado, pero el procesamiento de los datos se realiza en la sección Batch. Este enfoque tiene la ventaja de que cualquier programador de Batch puede modificar este programa para satisfacer necesidades específicas. Este programa también procesa correctamente la salida del comando CLS producido por otros archivos Batch, es decir, borra la pantalla cuando se detecta la salida del comando CLS.
fuente
file.exe 2>output.txt
file.exe 2>&1|tee.bat
como se encuentra aquí: superuser.com/questions/452763/…También estaba buscando la misma solución, después de un pequeño intento, pude lograrlo con éxito en el Símbolo del sistema. Aquí está mi solución:
Incluso captura cualquier comando PAUSA también.
fuente
Aquí hay una muestra de lo que he usado basado en una de las otras respuestas
fuente
¿Algo como esto debería hacer lo que necesitas?
fuente
enviar salida a la consola, agregar al registro de la consola, eliminar la salida del comando actual
fuente
Esta es una variación de una respuesta anterior de MTS, sin embargo, agrega algunas funcionalidades que podrían ser útiles para otros. Aquí está el método que utilicé:
set _Temp_Msg_Cmd=
^
carácter de zanahoria para que los comandos no se evalúen inicialmente%~n0_temp.txt
que utiliza la sintaxis de extensión de parámetro de línea de comando%~n0
para obtener el nombre del archivo por lotes.%~n0_log.txt
Aquí está la secuencia de comandos:
^> %~n0_temp.txt 2^>^&1
^& type %~n0_temp.txt ^>^> %~n0_log.txt
^& type %~n0_temp.txt
^& del /Q /F %~n0_temp.txt
Aquí está el ejemplo:
set _Temp_Msg_Cmd= ^> %~n0_temp.txt 2^>^&1 ^& type %~n0_temp.txt ^>^> %~n0_log.txt ^& type %~n0_temp.txt ^& del /Q /F %~n0_temp.txt
De esta manera, el comando simplemente se puede agregar después de comandos posteriores en un archivo por lotes que se ve mucho más limpio:
echo test message %_Temp_Msg_Cmd%
Esto se puede agregar al final de otros comandos también. Por lo que puedo decir, funcionará cuando los mensajes tengan varias líneas. Por ejemplo, el siguiente comando genera dos líneas si hay un mensaje de error:
net use M: /D /Y %_Temp_Msg_Cmd%
fuente
Esto creará un archivo de registro con la fecha y hora actual y podrá ver las líneas de la consola durante el proceso.
fuente
Utilizo una subrutina por lotes con una declaración "for" para obtener el comando de salida de una línea a la vez y ambos escriben esa línea en un archivo y la envían a la consola.
fuente
Si estás en la CLI, ¿por qué no usar un bucle FOR para "HACER" lo que quieras?
Gran recurso en Windows CMD para bucles: https://ss64.com/nt/for_cmd.html La clave aquí es establecer los delimitadores (delimitaciones), que romperían cada línea de salida, a nada. De esta manera, no se romperá con el espacio en blanco predeterminado. El% a es una letra arbitraria, pero se usa en la sección "hacer" para, bueno ... hacer algo con los caracteres que se analizaron en cada línea. En este caso, podemos usar los símbolos de unión (&&) para ejecutar el segundo comando echo para crear o agregar (>>) a un archivo de nuestra elección. Es más seguro mantener este orden de comandos de OD en caso de que haya un problema al escribir el archivo, al menos primero conseguiremos el eco en la consola. El signo at (@) delante del primer eco evita que la consola muestre el comando echo en sí, y en su lugar solo muestra el resultado del comando que es mostrar los caracteres en% a. De lo contrario, verías:
ACTUALIZACIÓN: / F omite las líneas en blanco y la única solución es prefiltrar la salida agregando un carácter a cada línea (tal vez con números de línea a través del comando find). Resolver esto en CLI no es rápido ni bonito. Además, no incluí STDERR, así que aquí también estoy capturando errores:
Redirigir mensajes de error
Los puntos (^) están ahí para escapar de los símbolos que están detrás de ellos, porque el comando es una cadena que se está interpretando, en lugar de decir, ingresándola directamente en la línea de comandos.
fuente
Justo como Unix.
dir | tee a.txt
Funciona en Windows XP, requiere
mksnt
instalación.Se muestra en la solicitud y se agrega al archivo.
fuente
Lo siguiente ayuda si desea ver realmente algo en la pantalla, incluso si el archivo por lotes se redirigió a un archivo. El dispositivo CON también puede usarse si se redirige a un archivo
Ejemplo:
Ver también una buena descripción de redirección: http://www.p-dd.com/chapter7-page14.html
fuente
Puede encontrar estos comandos en biterscripting ( http://www.biterscripting.com ) útiles.
fuente
Esto funciona en tiempo real, pero también es un poco feo y el rendimiento es lento. Tampoco bien probado:
fuente
%MYCOMMAND%
que termine y falla en muchos casos. Se salta las líneas vacías, las líneas que comienzan con;
falla con contenidos como<space>/<TAB>
,ON
,OFF
o/?
. Pero el resto a veces podría funcionar :-)Una alternativa es tee stdout to stderr dentro de su programa:
en java:
Luego, en su dos batchfile:
java program > log.txt
El stdout irá al archivo de registro y el stderr (los mismos datos) se mostrarán en la consola.
fuente
Instalo perl en la mayoría de mis máquinas, así que una respuesta usando perl: tee.pl
dir | perl tee.pl o dir | perl tee.pl dir.bat
crudo y no probado.
fuente
Otra variación es dividir la tubería y luego redirigir la salida como desee.
Guarde lo anterior en un archivo .bat. Divide la salida de texto en filestream 1 a filestream 3 también, que puede redirigir según sea necesario. En mis ejemplos a continuación, llamé al script anterior splitPipe.bat ...
fuente
c:\cygwin64\bin\script.exe
y entracmd
y entraexit
e ingrese (sale del cmd.exe de Cygwin)exit
e ingrese (sale de Cygwin's script.exe)fuente