1. ホーム
  2. powershell

[解決済み】ロボコピーのMaxage MinageとMir Parameterの関係

2022-03-17 23:03:03

質問

コピー元からコピー先へのロボコピーを使用しています。

以下のようにすると、すべてのファイルが移動します。

Step 1: robocopy c:\Source C:\Destination /MIR

現在、ステップの2番目のコマンドを実行すると、2019年1月1日以前のものは/MIRパラメータで宛先から削除されるはずですが、これは発生しません(2019年1月以降のファイルは、/MIRコマンドで削除されず、まだフォルダに残っています)。この問題を解決するにはどうしたらよいでしょうか。20190101より前のものを削除しますか?

Step 2: robocopy c:\Source C:\Destination /MIR /maxage:19000101 /minage:20190101" 

解決方法は?

を使おうとしているのだと思うので、これは奇妙な動作に見えます。 /MINAGE スイッチで、2019年1月1日より若いものをすべて選択します。そして、それを /MIR スイッチ、より具体的には /PURGE /E スイッチで、余分なファイルやディレクトリを削除することができます。 2019年1月1日です。

これがうまくいかないのは /MINAGE スイッチは に選択されています。 コピー の場合であっても /MIR コマンドは期待通りに動作します。

2019年1月1日より古いファイル1つと、新しいファイル1つの計2つのファイルがあるとします。

C:\Source         C:\Destination
 File-2018.txt     
 File-2019.txt     

標準の \MIR コマンドを使用します。

Robocopy.exe C:\Source C:\Destination /MIR 

両方のファイルが期待通りにコピーされます。

2 files Copied

C:\Source         C:\Destination
 File-2018.txt      File-2018.txt
 File-2019.txt      File-2019.txt

保存先に余分なファイルを追加すると

C:\Source         C:\Destination
 File-2018.txt      File-2018.txt
 File-2019.txt      File-2019.txt
                    File-2020.txt

そして、再実行する /MIR コマンドを実行します。

Robocopy.exe C:\Source C:\Destination /MIR 

予想通り、余分なファイルが削除されていることがわかります。

2 files Skipped
1 files Extras

C:\Source         C:\Destination
 File-2018.txt      File-2018.txt
 File-2019.txt      File-2019.txt

には \MIR コマンドを追加した場合、その後に /MINAGE パラメータで、2019年1月1日以降のものを残し、それ以外を削除するよう求めていると考えています。

Robocopy.exe C:\Source C:\Destination /MIR /MINAGE:20190101

思いがけないものを手に入れる。

2 files Skipped

C:\Source         C:\Destination
 File-2018.txt      File-2018.txt
 File-2019.txt      File-2019.txt

何が起こっているのか、なぜファイルをスキップするのか、よりよく説明するために、別のパラメータ、Include Skippedを追加してみましょう。 \IS :

Robocopy.exe C:\Source C:\Destination /MIR /IS /MINAGE:20190101

得ることができます。

1 files Copied
1 files Skipped

C:\Source         C:\Destination
 File-2018.txt      File-2018.txt
 File-2019.txt      File-2019.txt

つまり \MINAGE パラメータのみ フィルタリング にしたいものを コピー . ディレクトリをリセットしてクリアし、再実行すると、何が起こったのかがよくわかります。

Remove-Item C:\Destination -Force

C:\Source         C:\Destination
 File-2018.txt      
 File-2019.txt      

Robocopy.exe C:\Source C:\Destination /MIR /MINAGE:20190101

得ることができます。

1 files Copied
1 files Skipped

C:\Source         C:\Destination
 File-2018.txt      File-2018.txt
 File-2019.txt      

を上書きコピーしたのです。 古い ファイルではなく 新しい ファイルです。つまり、ソース内のファイルを反復処理する際に /MINAGE パラメータを使用して に必要なファイル コピー でなく、どのファイルを 削除する .

このような動作になる理由は /MINAGE と対応する /MAXAGE パラメータは、非常に大きなディレクトリで、ネットワークが遅い場合や、コピー先のコンピュータが小さい場合、特定のファイルだけをコピーしたい場合(例えば、昨日からの新しいファイルだけ)、また、必ずしも すべて を使用します。このような場合、ファイルのセットは通常 "Deltas" であるため、ミラーリングは通常実行されないか、または希望されないことがほとんどです。

削除よりコピーを強調するために、ディレクトリをミラーリングした後、古いファイルと新しいファイルの2つの余分なファイルを デスティネーション :

C:\Source         C:\Destination
                    File-2017.txt
 File-2018.txt      File-2018.txt
 File-2019.txt      File-2019.txt
                    File-2020.txt

そして、インクルードをスキップして再実行します。 /IS 何がコピーされているかがわかるように。

Robocopy.exe C:\Source C:\Destination /MIR /IS /MINAGE:20190101

やや意外なものを手に入れた。

1 files Copied
1 files Skipped
2 files Extras

C:\Source         C:\Destination

 File-2018.txt      File-2018.txt
 File-2019.txt      File-2019.txt

これは、以下のことを強調しています。 /MIR は、その...その...のためのものです。 ミラーリング . 他のパラメータは から コピー .

まずはコピーに関わるソースファイルから。

C:\Source
 File-2018.txt
 File-2019.txt

フィルタリングを適用するために、スキップされたインクルード /IS/MINAGE :

C:\Source
 File-2018.txt    <- 1 files Copied
 File-2019.txt    <- 1 files Skipped

次に \MIR ミラーコマンドが実行され のファイルをすべて削除します。 ソースファイルに含まれていない :

C:\Destination
 File-2017.txt    <- 2 files Extra
 File-2020.txt  

Extraファイルの古さに関係なく

簡単な解決策は、最初からすべてをコピーオーバーしないことです。空のディレクトリから始めて、2019年1月1日より若いファイルだけをコピーします。

Remove-Item C:\Destination -Force
Robocopy.exe C:\Source C:\Destination /E /MINAGE:20190101


編集

改良された方法(最初にディレクトリ全体を削除するのではなく、保存先でクリーンアップスクリプトを実行して、保存先から2019年1月1日より若いアイテムを最初に削除するだけです。

#Cleanup younger files
Get-ChildItem C:\Destination -Recurse | Where { $_.LastWriteTime -gt (Get-Date '2019-01-01')} | Remove-Item -Force -Recurse -ErrorAction SilentlyContinue

#Mirror over new files
Robocopy.exe C:\Source C:\Destination /MIR /MINAGE:20190101