web-dev-qa-db-ja.com

PowerShellの外部プロセスから変数に出力をキャプチャするにはどうすればよいですか?

外部プロセスを実行し、そのコマンド出力をPowerShellの変数にキャプチャしたいと思います。私は現在これを使用しています:

$params = "/verify $pc /domain:hosp.uhhg.org"
start-process "netdom.exe" $params -WindowStyle Hidden -Wait

コマンドが実行されていることを確認しましたが、出力を変数にキャプチャする必要があります。これは、ファイルへのリダイレクトのみを行うため、-RedirectOutputを使用できないことを意味します。

127
Adam Bertram

やってみました:

$OutputVariable = (Shell command) | Out-String

128
JNK

エラー出力もリダイレクトしたい場合は、以下を実行する必要があります。

$cmdOutput = command 2>&1

または、プログラム名にスペースが含まれている場合:

$cmdOutput = & "command with spaces" 2>&1
19
manojlds

またはこれを試してください。出力を変数$ scriptOutputにキャプチャします。

& "netdom.exe" $params | Tee-Object -Variable scriptOutput | Out-Null

$scriptOutput
9
Finzzownt

別の実際の例:

$result = & "$env:cust_tls_store\Tools\WDK\x64\devcon.exe" enable $strHwid 2>&1 | Out-String

この例にはパス(環境変数で始まる)が含まれていることに注意してください。引用符はパスとEXEファイルを囲む必要がありますが、パラメーターは囲まないことに注意してください!

注:コマンドの前ではなく引用符の外側にある&文字を忘れないでください。

エラー出力も収集されます。

この組み合わせを機能させるのに時間がかかったので、私はそれを共有すると思った。

9
Davidiam

答えを試してみましたが、私の場合、生の出力は得られませんでした。代わりに、PowerShell例外に変換されました。

私が得た生の結果:

$rawOutput = (cmd /c <command> 2`>`&1)
2
sevenforce

あなたがやろうとしているのがコマンドからの出力をキャプチャするだけなら、これはうまくいくでしょう。

[timezoneinfo]::localは常にafterでもシステムに変更を加えたとしても同じ情報を生成するため、システム時間の変更に使用します。これは、タイムゾーンの変更を検証して記録できる唯一の方法です。

$NewTime = (powershell.exe -command [timezoneinfo]::local)
$NewTime | Tee-Object -FilePath $strLFpath\$strLFName -Append

つまり、システム変数を再ロードするには、新しいPowerShellセッションを開く必要があります。

0
Kelly Davis