robocopyコマンドを使えば、上書きコピー先の一部のファイルが開かれていても中断されずにコピー続行

概要

あるフォルダー内のすべてのファイルを別のフォルダーに上書きコピーしたい。はじめは Copy-Item コマンドレットを使ってみたが、このときコピー先にすでに存在するファイルのうちどれかが掴まれていると、Copy-Itemコマンドレットはそこで中断され、それ以降のファイルのコピーが行われない。しかし robocopy コマンドを使ったら、こういう場合でも中断されずに次のファイルからのコピーが続行された。

詳細

困ったこと

あるフォルダー内のすべてのファイルを別のフォルダーに上書きコピーしたい。はじめはPowerShell の Copy-Item コマンドレットを使ってみたが、このときコピー先にすでに存在するファイルのうちどれか1つでも掴まれていると、Copy-Itemコマンドレットはそこで中断し、それ以降のファイルのコピーは行われない。-Force パラメータをつけても外してもだめで、 -ErrorAction Continue パラメータを付けてもだめだった。Get-Childitem からのパイプラインを使っても、同じ個所で中断されてしまう。

PS C:\WINDOWS\system32> Copy-Item -Path C:\temp\source\* -Destination C:\temp\dest -Force -ErrorAction Continue
Copy-Item : 別のプロセスで使用されているため、プロセスはファイル ‘C:\temp\dest\新規 Microsoft Word 文書.pdf’ にアクセスできません。
発生場所 行:1 文字:1
+ Copy-Item -Path C:\temp\source\* -Destination C:\temp\dest -Force -Er …
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [Copy-Item], IOException
+ FullyQualifiedErrorId : System.IO.IOException,Microsoft.PowerShell.Commands.CopyItemCommand

環境

  • OS: Windows 11 Pro 21H2
  • PSVersion: 5.1.22000.613
解決策

Robocopy コマンドを使った。
すると、上書き対象コピー先のファイルのうちどれかが掴まれて(開かれて)いても、robocopy コマンドは中断されずに、次のファイルからコピーは続行された。しかし当然ながら、その掴まれている(開かれている)ファイルは、上書きコピーされずにスキップされる。
なお、今回は /MIR オプションをつけた。

PS C:\WINDOWS\system32> robocopy /mir C:\temp\source C:\temp\dest

——————————————————————————-
ROBOCOPY :: Windows の堅牢性の高いファイル コピー
——————————————————————————-

開始: 2022年5月7日 10:40:01
コピー元 : C:\temp\source\
コピー先 : C:\temp\dest\

ファイル: *.*

オプション: *.* /S /E /DCOPY:DA /COPY:DAT /PURGE /MIR /R:1000000 /W:30

——————————————————————————
(以下略)

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