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:
- ¿Cómo redirecciono stderr también a un archivo?
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.
- 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.
fuente
Respuestas:
My-Command 2>&1 | Tee-Object 'myfile.log'
. VerGet-Help about_Redirection
.Get-Help about_Try_Catch_Finally
. ¿El comando que está ejecutando es un programa externo o un script?Tee
puede manejar cadenas parciales bien, pero otros cmdlets tienen gustoForEach-Object
oSelect-Object
no. Tenga en cuenta queGet-Content
tiene un interruptor especial-ReadCount
que anula un poco este comportamiento, y se equivocará seriamente con unSelect-Object -Skip/-First/-Last/-Unique
comando 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 correctamenteTee-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 obtenertee.exe
de GNU Win32 Utils o MSYS que están diseñados para reenviar contenido de inmediato.fuente