Executando 'Start-Process' remotamente: como exibir a saída padrão?

Executando 'Start-Process' remotamente: como exibir a saída padrão?

Eu tenho um script do PowerShell para instalar software em computadores remotos.

Até o momento tenho usado com sucesso o seguinte código:

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

Agora preciso instalar um MSI, por exemplo. 'msiexec /ic:\arquivo.msi /passivo'.

Não consigo fazer com que o MSIEXEC trate tudo depois de 'MSIEXEC' como parâmetros. Em vez disso, o PowerShell apenas tenta executá-lo como um grande comando. Eu tentei várias coisas, principalmente envolvendo a colocação de aspas literais, mas não consegui fazer isso funcionar.

Agora abandonei o operador de chamada (&) em favor de 'Start-Process', que possui um parâmetro '-ArgumentList'. O MSI agora é executado corretamente. Ótimo!

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

O problema com 'Start-Process' é que ele não produz nenhuma saída de console quando executado remotamente usando 'Invoke-Command'. Tive que recorrer ao redirecionamento da saída para um arquivo e depois à leitura do arquivo. Existe uma maneira melhor?

Responder1

Eu tentaria canalizá-lo para o cmdlet tee-object e, em seguida, salvar seu arquivo lá, se necessário (não sei se enviar a saída do arquivo para $null funcionaria, pena que não é Linux e poderíamos enviá-lo para / dev/null, mas estou divagando)

Este é o cmdlet tee-objecthttp://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

esse é um código não testado, mas geralmente é isso que você deseja.

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

pode funcionar também.

informação relacionada