PowerShellでrobocopyの終了コードを確認する方法|成功・警告・エラーの見分け方

PowerShell

robocopyでファイルやフォルダをバックアップするとき、「コピー処理が正常に終わったか」「エラーが発生していないか」を確認したいことはありませんか?

PowerShellからrobocopyを実行した場合は、$LASTEXITCODE という変数を使うことで、終了コードを取得できます。

ただし、robocopyは一般的なコマンドとは異なり、終了コードが0以外でも、必ずしもエラーとは限りません。

この記事では、PowerShellでrobocopyの終了コードを確認する方法から、終了コードの意味、エラー判定、ログ保存、タスクスケジューラでの注意点まで解説します。

 robocopyの終了コードとは?

終了コードとは、コマンドの処理結果を数値で表したものです。
robocopyでは、コピーしたファイルの有無やコピー先の状態、コピー失敗の有無などに応じて終了コードが返されます。
例えば、次のようなケースがあります。

  • ファイルをコピーする必要がなかった
  • ファイルを正常にコピーした
  • コピー先に余分なファイルが存在した
  • コピーできなかったファイルがあった

これらの結果を確認することで、バックアップ処理が正常に完了したかを判断できます。

PowerShellでrobocopyの終了コードを取得する方法

PowerShellで外部コマンドのrobocopyを実行すると、終了コードは $LASTEXITCODE に格納されます。

基本的な使用例

次の例では、CドライブのSourceフォルダをDドライブのBackupフォルダへコピーし、終了コードを表示します。

robocopy "C:\Source" "D:\Backup" /E

$exitCode = $LASTEXITCODE

Write-Output "robocopyの終了コード:$exitCode"

実行する前に、コピー元の C:\Source フォルダを用意してください。
/E は、空のフォルダを含めてサブフォルダをコピーするオプションです。
実行すると、robocopyの処理が終了した後に、終了コードが表示されます。
例えば、すべての対象ファイルを正常にコピーした場合は、終了コードが 1 になることがあります。
ポイントは、robocopyの実行直後に $LASTEXITCODE を取得することです。
別の外部コマンドを実行すると値が変わる可能性があるため、必要な終了コードはすぐに変数へ保存しましょう。

robocopyの終了コード一覧

robocopyの終了コードは、次のように解釈します。

終了コード 意味
0 コピー対象がなく、失敗や不一致もなかった
1 ファイルを正常にコピーした
2 コピー先に余分なファイルが存在した
3 ファイルをコピーし、コピー先に余分なファイルも存在した
4 ファイルの不一致があった
5 コピーと不一致があった
6 余分なファイルと不一致があった
7 コピー・不一致・余分なファイルがあった
8以上 少なくとも1件のコピー失敗があった

※上記は終了コードの基本的な解釈です。終了コード2~7は、複数の状態を組み合わせた結果を表します。

詳細はMicrosoft Learnのrobocopyの公式ドキュメントを参照してください。

特に重要なのは、次の2点です。

  • 終了コードが 0 なら、コピー対象がなく、失敗もなかったことを示します。
  • 終了コードが 8 以上なら、コピー処理で少なくとも1件の失敗が発生したことを示します。

そのため、robocopyでは「0以外はすべてエラー」という判定をしないようにしましょう。
なお、終了コードが0~7でも、バックアップが期待どおりに完了したかは、ログやコピー先のファイルも確認すると安心です。

PowerShellで成功・エラーを判定する方法

終了コードを取得するだけでなく、数値に応じて処理を分岐させることもできます。
次の例では、終了コードが8未満なら「コピー処理で失敗は検出されませんでした」、8以上なら「コピー失敗あり」と表示します。

robocopy "C:\Source" "D:\Backup" /E

$exitCode = $LASTEXITCODE

if ($exitCode -lt 8) {
Write-Output "コピー処理で失敗は検出されませんでした。終了コード:$exitCode"
}
else {
Write-Output "コピー失敗が発生しました。終了コード:$exitCode"
}

このように $LASTEXITCODE を使えば、robocopyの処理結果に応じてメッセージを変えられます。
ただし、終了コードが8未満でも、ファイルの不一致やコピー先に余分なファイルが存在する場合があります。厳密な運用では、ログも確認してください。

robocopyの終了コードをログに保存する方法

バックアップを定期実行する場合は、終了コードをログに記録しておくと、後から処理結果を確認できます。
次の例では、robocopyの実行結果をログに保存し、終了コードも追記します。

$source = "C:\Source"
$destination = "D:\Backup"
$logFile = "C:\Logs\backup.log"

# ログ保存先のフォルダを作成
New-Item -ItemType Directory -Path "C:\Logs" -Force |
Out-Null

# robocopyを実行
robocopy $source $destination /E /R:2 /W:5 "/LOG+:$logFile"

# 終了コードを直ちに保存
$exitCode = $LASTEXITCODE

# 終了コードをログに追記
"$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss') 終了コード:$exitCode" |
Add-Content -Path $logFile -Encoding utf8

# 結果を表示
if ($exitCode -lt 8) {
Write-Output "コピー処理で失敗は検出されませんでした。"
}
else {
Write-Output "コピー失敗が発生しました。ログを確認してください。"
}

この例では、次の処理を行っています。

  • New-Item:ログ保存先のフォルダを作成する
  • /LOG+:robocopyの実行結果を既存ログに追記する
  • /R:2:コピー失敗時の再試行回数を2回にする
  • /W:5:再試行の間隔を5秒にする
  • Add-Content:終了コードをログに追記する

事前にコピー元のフォルダを用意してください。また、コピー先とログ保存先に書き込み権限があることも確認しましょう。
/LOG+ は既存ログに追記するオプションです。毎回ログを新しく作成したい場合は、/LOG を使用します。

タスクスケジューラで実行するときの注意点

robocopyをタスクスケジューラから実行する場合は、終了コードの扱いに注意が必要です。robocopyは、ファイルを正常にコピーした場合でも終了コード1を返すことがあります。そのため、タスクスケジューラの「前回の実行結果」に 0x1 と表示されても、それだけでコピー失敗とは判断できません。
終了コードを確認し、8以上の場合にスクリプトを失敗として終了させたい場合は、次のように記述できます。

robocopy "C:\Source" "D:\Backup" /E /R:2 /W:5

$exitCode = $LASTEXITCODE

if ($exitCode -ge 8) {
Write-Error "robocopyでコピー失敗が発生しました。終了コード:$exitCode"
exit 1
}
else {
Write-Output "robocopyの処理が終了しました。終了コード:$exitCode"
exit 0
}

このコードでは、終了コードが8以上の場合にPowerShellスクリプトを終了コード1で終了し、それ以外の場合は0で終了します。
タスクスケジューラから実行する場合は、PowerShellスクリプトの実行が終了するまで待機する設定にし、実際のログも確認してください。
また、終了コードが0~7でも、余分なファイルや不一致がある場合は、運用上の要件に応じて追加のチェックを行いましょう。

robocopyの終了コードが想定と違う場合

終了コードを確認しても、期待した結果にならない場合は、次の点を確認してください。

コピー元・コピー先のパスが正しいか

指定したフォルダが存在するか、ドライブやネットワーク共有にアクセスできるかを確認します。

コピー先に余分なファイルがないか

終了コード2、3、6、7では、コピー先に余分なファイルが存在する場合があります。コピー元とコピー先の内容を確認してください。

コピー失敗が発生していないか

終了コードが8以上の場合は、ログに記録されたエラーやアクセス権限、ファイルの使用状況などを確認します。

$LASTEXITCODE を取得するタイミングが正しいか

robocopyの後に別の外部コマンドを実行すると、終了コードが変わることがあります。robocopyの直後に変数へ保存しましょう。

まとめ

PowerShellでrobocopyの終了コードを確認するには、$LASTEXITCODE を使用します。

重要なポイントは次の3つです。

  • robocopyの実行直後に $LASTEXITCODE を取得する
  • 終了コード0~7と8以上の違いを理解する
  • 定期バックアップではログも保存し、処理結果を確認する

終了コードを正しく判定すれば、バックアップ処理の失敗を検出しやすくなり、タスクスケジューラによる自動実行にも役立ちます。

関連記事:
【PowerShell】robocopyコマンドを使う方法
PowerShellでフォルダをバックアップする方法|robocopyで自動バックアップ
PowerShellでrobocopyのログを保存する方法|/LOG・/LOG+の使い方
参考資料:
Microsoft Learn:robocopyコマンドの公式ドキュメント

 

タイトルとURLをコピーしました