PowerShell y Tee

9

Uso este comando para ver la salida tanto en la consola como en un archivo:

powershell -command "my_command_1 | tee ('logs\{0}.log' -f (Get-Date -format 'yyyy.MM.dd-HH.mm'))"  
powershell -command "my_command_2 | tee ('logs\{0}.log' -f (Get-Date -format 'yyyy.MM.dd-HH.mm'))"
# etc

No funciona tan bien como esperaba y tengo algunas preguntas:

  1. ¿Cómo redirecciono stderr también a un archivo?
  2. El resultado funciona muy extraño. Para algunos comandos hay una gran demora entre la impresión del texto y la actualización de la consola / archivo. Para algunos otros comandos, la salida parece actualizada cuando se imprime el texto (ejecuto comandos sin tee y sé lo que debería imprimir). Este retraso hace que esta camiseta sea casi inútil: ¿qué pasa si se imprime un error crítico, por lo que debo detener el comando, pero no veré nada hasta que sea demasiado tarde?

    Para algunos comandos, la salida se imprime solo después de completar el comando completo.

  3. Además, incluso si el comando solicita la entrada del usuario, ¡la salida de la consola / archivo está vacía! Para ese comando, sé lo que espera e imprimo a ciegas el texto necesario y funcionó, pero para otros, sin salida, ¡esperaré que algo suceda infinitamente mientras que el comando esperará mi entrada!

¿Hay soluciones para estos problemas? De lo contrario, esta camiseta en PowerShell es completamente inútil.

carrera1
fuente
Dudo en creer que una herramienta utilizada en miles de scripts es "completamente inútil" simplemente porque puede no cumplir con sus requisitos específicos.
Stephen Jennings
Bien, quiero decir que es inútil en este caso en particular :) Será mejor que deje el tee solo, que tendrá problemas tan graves.
carrera1

Respuestas:

7
  1. My-Command 2>&1 | Tee-Object 'myfile.log'. Ver Get-Help about_Redirection.
  2. Deberías estar atrapando errores, no confiando en Ctrl+ C. Ver Get-Help about_Try_Catch_Finally. ¿El comando que está ejecutando es un programa externo o un script?
  3. Según tengo entendido, generalmente los objetos de cadena no se envían por la tubería hasta que se alcanza un carácter de fin de línea. La razón es bastante simple: si no hiciera esto, las cadenas parciales (léase: incompletas) se irían por la tubería. Teepuede manejar cadenas parciales bien, pero otros cmdlets tienen gusto ForEach-Objecto Select-Objectno. Tenga en cuenta que Get-Contenttiene un interruptor especial -ReadCountque anula un poco este comportamiento, y se equivocará seriamente con un Select-Object -Skip/-First/-Last/-Uniquecomando más adelante.

Es muy posible que los programas externos que esté ejecutando no obedezcan las convenciones que PowerShell espera. Tee, por ejemplo, se llama correctamente Tee-Object, lo que debería indicarle el tipo de cosas con las que es bueno trabajar. En ese caso, puede estar más lejos en la línea para obtener tee.exede GNU Win32 Utils o MSYS que están diseñados para reenviar contenido de inmediato.

Pedacitos de tocino
fuente
1. gracias; 2. Correcto, me refería a algunas situaciones imprevistas críticas; 3. No entiendo qué es culpable de cadenas incompletas :) Finalmente, mis comandos ejecutan scripts Python, son comandos de estructura. Traté de usar tee.exe de las utilidades de Linux compiladas para Windows: el mismo resultado, sin salida en algunos casos. ¿Significa eso que mi configuración concreta y las secuencias de comandos concretas no funcionarán bien con las utilidades tee? Gracias.
carrera1
Eso me parece que el script de Python se está portando mal.
Bacon Bits