Windows PowerShellで外部コマンドを実行する(標準出力・標準エラー出力先の指定と終了コード)
2024年8月9日
Windows PowerShell で、外部コマンド実行時の標準出力や標準エラー出力をファイルに書く方法をメモ。
例えば、バッチファイルでこんな風に書けるコードは、
cd /d %~dp0 robocopy .\dir1 .\dir2 /S /E /COPY:DATSOU /PURGE /R:5 /W:30 /MT:1 > .\robocopy.log 2> .\robocopy_err.log
Widnows PowerShell ではこう書けばよいです。
$proc = Start-Process –FilePath “robocopy.exe” –ArgumentList “.\dir1 .\dir2 /S /E /COPY:DATSOU /PURGE /R:5 /W:30 /MT:1” -Wait -PassThru -WorkingDirectory $PSScriptRoot –RedirectStandardOutput “.\robocopy.log” –RedirectStandardError “.\robocopy_err.log”
ファイルを介さずに PowerShell 側で標準出力系を取得するのは少し面倒だけど、実行した外部コマンドの標準出力・標準エラー出力を単純にファイルへリダイレクトするだけなら、コレが便利。
ちなみにバッチファイルの %ERRORLEVEL% で取得できる「外部コマンドの戻り値」は、PowerShell の場合、
$proc.ExitCode
で取得できる。こんな感じでコードを書ける。
switch($proc.ExitCode) { 0 { "差異なし。同期不要。" } 1 { "同期成功" } default { "同期失敗" } }
参考までに、PowerShell のストリーム周りはこちらのサイトが分かりやすく書かれています。