Estoy ejecutando un servidor desde un archivo por lotes y quiero que la salida del servidor se muestre en la pantalla y también se escriba en un archivo de registro. Encontré una manera de hacer esto a partir de esta respuesta :
powershell "startmyserver | tee server.log"
El problema es que la tubería hace que el primer comando se ejecute y se complete por completo antes de que se ejecute el segundo comando. Esto significa que no puedo monitorear la salida estándar de mi servidor mientras se está ejecutando, que es lo que estoy tratando de hacer (no quiero tener que apagar el servidor solo para verificar los mensajes de registro más recientes).
Para un ejemplo más simple lo intenté pause
. Bueno, pause
no existe en Powershell, así que tuve que ejecutarlo dentro de un cmd
shell anidado :
powershell "cmd /c pause | tee test.txt"
Como era de esperar, después de ejecutar este comando me sale un cursor intermitente. Después de un tiempo, presiono una tecla y luego aparece "Presione cualquier tecla para continuar" y se escribe en el archivo casi al mismo tiempo.
Lo que quiero que suceda es la tubería para transmitir el stdout línea por línea al siguiente comando. En otras palabras, cada vez que se encuentra con un carácter EOL, debe enviar algún resultado y esto (en mi caso tee
) debería hacer que el texto aparezca en la pantalla y se escriba simultáneamente en el archivo. (De hecho, incluso no me preocupa si el texto se escribe en el archivo línea por línea, podría escribirse todo al final, aunque eso no sería lo ideal. Solo quiero poder ver las líneas en la pantalla tal como están escritas).
¿Es esto posible en Símbolo del sistema y / o Powershell?
fuente
powershell cmd /c pause | tee "test.txt"
estás corriendo tee en tu contexto actual. Estoy ejecutando esto desde cmd (no ps1), por lo que este comando fallará al igualtee
que un comando Powershell. si este comando funcionó para usted, supongo que (a) tiene otrotee
en su sistema o (b) lo ejecutó desde Powershell. Ninguno de los cuales es mi caso de uso.pause
? Utilicépause
solo por conveniencia porque no quería un comando que terminara de inmediato y, por lo tanto, hiciera imposible saber si las líneas se transmitieron antes de que se completara el comandoRespuestas:
Este problema se explica en Stack Overflow como el hecho de que PowerShell
Tee-Object
no vacía la secuencia de salida, sino que solo espera a que la fuente lo haga, por lo que obtiene la salida al final de la operación. Esto es por diseño.La solución propuesta en la respuesta fue usar este código:
Una formulación alternativa para probar si la anterior no funcionó es:
Entonces el comando se vería así:
En mis modestas pruebas, la salida se generó demasiado rápido para ver si esto funcionó como usted especificó.
fuente
Add-Content
en lugar deSet-Content