あるフォルダー内のすべてのファイルを別のフォルダーに上書きコピーしたい。はじめは 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
——————————————————————————
(以下略)