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, pauseno existe en Powershell, así que tuve que ejecutarlo dentro de un cmdshell 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 igualteeque un comando Powershell. si este comando funcionó para usted, supongo que (a) tiene otroteeen su sistema o (b) lo ejecutó desde Powershell. Ninguno de los cuales es mi caso de uso.pause? Utilicépausesolo 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-Objectno 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-Contenten lugar deSet-Content