Andy me dio algunos buenos consejos, pero quería hacerlo de una manera aún más limpia. Sin mencionar que con el método 2>&1 >>
PowerShell me reclamó sobre el archivo de registro al que accedía otro proceso, es decir, tanto stderr como stdout intentando bloquear el archivo para acceder, supongo. Así que aquí es cómo lo trabajé.
primer lugar vamos a generar un buen nombre, pero que en realidad es sólo por ser pedante:
$name = "sync_common"
$currdate = get-date -f yyyy-MM-dd
$logfile = "c:\scripts\$name\log\$name-$currdate.txt"
Y aquí es donde empieza el truco:
start-transcript -append -path $logfile
write-output "starting sync"
robocopy /mir /copyall S:\common \\10.0.0.2\common 2>&1 | Write-Output
some_other.exe /exeparams 2>&1 | Write-Output
...
write-output "ending sync"
stop-transcript
Con start-transcript
y stop-transcript
puede redireccionar toda la salida de Comandos de PowerShell a un solo archivo, pero it doesn't work correctly with external commands. Así que simplemente redirijamos todo el resultado de esos a la salida estándar de PS y dejamos que la transcripción haga el resto.
De hecho, no tengo idea de por qué los ingenieros de MS afirman que aún no han resuelto esto "debido al alto costo y la complejidad técnica que conlleva" cuando se puede solucionar de una manera tan simple.
De cualquier manera, ejecutar cada comando con start-process
es un gran desorden en mi humilde opinión, pero con este método, todo lo que tienes que hacer es agregar el código 2>&1 | Write-Output
a cada línea que ejecuta comandos externos.
Gran respuesta. Pero me parece que hay un error en la primera forma. En lugar de -redirecterroroutput, creo que debería ser -RedirectStandardError. – Grigory
¡Buena captura! Reparado :-) –
¿Funciona para Powershell Remoting? Tengo pruebas, creo que solo la segunda forma funciona para PS Remoting. – Kiquenet