'Start-Process' をリモートで実行: 標準出力を表示するにはどうすればいいですか?

'Start-Process' をリモートで実行: 標準出力を表示するにはどうすればいいですか?

リモート コンピューターにソフトウェアをインストールするための PowerShell スクリプトがあります。

これまで、私は次のコードを正常に使用してきました。

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

ここで、MSI をインストールする必要があります。例: 'msiexec /ic:\file.msi /passive'。

MSIEXEC で 'MSIEXEC' の後のすべてをパラメータとして扱うことができません。代わりに、PowerShell はそれを 1 つの大きなコマンドとして実行しようとします。主にリテラル引用符の配置を含むさまざまなことを試しましたが、うまくいきません。

呼び出し演算子 (&) を廃止し、代わりに '-ArgumentList' パラメータを持つ 'Start-Process' を使用するようになりました。これで MSI は正しく実行されるようになりました。すばらしい!

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

「Start-Process」の問題は、「Invoke-Command」を使用してリモートで実行したときにコンソール出力が生成されないことです。出力をファイルにリダイレクトしてからファイルを読み取るしかありませんでした。もっと良い方法はありますか?

答え1

それを tee-object コマンドレットにパイプして、必要に応じてそこにファイルを保存してみてください (ファイル出力を $null に送信しても機能するかどうかはわかりません。残念ながらこれは Linux ではないので、/dev/null に送信できますが、余談です)

これはtee-objectコマンドレットですhttp://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

それはテストされていないコードですですが、一般的にはそれが望ましいでしょう。

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

同様に機能するかもしれません。

関連情報