
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.