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コマンドの公式ドキュメント
