Ejecutando 'Start-Process' de forma remota: ¿Cómo mostrar la salida estándar?

Ejecutando 'Start-Process' de forma remota: ¿Cómo mostrar la salida estándar?

Tengo un script de PowerShell para instalar software en computadoras remotas.

Hasta la fecha he estado utilizando con éxito el siguiente código:

$prog = "ping"
$arg = "localhost"
$computername = "MACHINE01"
invoke-command -computername $computername {param($p,$a)& $p $a} -ArgumentList $prog,$arg

Ahora necesito instalar un MSI, por ejemplo. 'msiexec /ic:\file.msi /pasivo'.

No puedo hacer que MSIEXEC trate todo lo que sigue a 'MSIEXEC' como parámetros. En cambio, PowerShell simplemente intenta ejecutarlo como un gran comando. He probado numerosas cosas, principalmente relacionadas con la colocación de comillas literales, pero no puedo hacer que esto funcione.

Ahora abandoné el operador de llamada (&) en favor de 'Start-Process' que tiene un parámetro '-ArgumentList'. El MSI ahora se ejecuta correctamente. ¡Excelente!

invoke-command -computername $computername {param($p,$a) start-process $p -argumentlist $a -nonewwindow -wait -redirectstandardoutput c:\output.txt; get-content c:\output.txt} -ArgumentList $prog,$arg

El problema con 'Start-Process' es que no produce ninguna salida de consola cuando se ejecuta de forma remota usando 'Invoke-Command'. Tuve que recurrir a redirigir la salida a un archivo y luego leer el archivo. ¿Existe una mejor manera?

Respuesta1

Intentaría conectarlo al cmdlet tee-object y luego guardar el archivo allí si es necesario (no sé si enviar la salida del archivo a $null funcionaría, lástima que esto no sea Linux y podríamos enviarlo a / dev/null, pero estoy divagando)

Este es el cmdlet tee-objetohttp://technet.microsoft.com/en-us/library/ee177014.aspx

invoke-command -computername $computername {param($p,$a) start-process $p -argumentlist $a -nonewwindow -wait | tee-object -file c:\output.txt} -ArgumentList $prog,$arg

ese es código no probado, pero eso es generalmente lo que querrías.

invoke-command -computername $computername {param($p,$a) start-process $p -argumentlist $a -nonewwindow -wait | tee-object -file $null} -ArgumentList $prog,$arg

podría funcionar también.

información relacionada