Windows PowerShellで外部コマンドを実行する(標準出力・標準エラー出力先の指定と終了コード)

 2024年8月9日

vector-wrench-and-screwdriver-xxl-icon_sizeXS.jpg

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 のストリーム周りはこちらのサイトが分かりやすく書かれています。

Hatena Pocket Line

コメントを記入