带有 Mir 参数的 Robocopy Maxage Minage

Robocopy Maxage Minage with Mir Parameter

我正在使用从源到目标的 Robocopy。

以下将移动所有文件。

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

现在,当我在步骤中执行第二个命令时,2019 年 1 月 1 日之前的任何内容都应该使用 /MIR 参数从目标中删除,但是这并没有发生(2019 年 1 月之后的文件仍然保留在文件夹中,而不是被删除/MIR 命令)。我将如何解决这个问题?删除 20190101 之前的任何内容?

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

这看起来确实很奇怪,因为人们会认为您正在尝试使用 /MINAGE 切换到 select 2019 年 1 月 1 日之前的所有内容。然后将其与 /MIR 开关,或更具体地说 /PURGE /E 开关,以删除 2019 年 1 月 1 日之后的额外文件和目录。

这不起作用的原因是 /MINAGE 开关仅影响 select 编辑为 [=112= 的文件]已复制,即使 /MIR 命令按预期工作。

假设我们有 2 个文件,其中 1 个早于 2019 年 1 月 1 日,一个较新。

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

和re-run/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

为了更好地说明发生了什么,以及为什么它“跳过”文件,让我们添加另一个参数,包括 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参数只过滤我们想要的复制.如果我们重置并清除目录,然后 re-run 它,我们可以更好地看到发生了什么:

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      

它复制了 Older 文件,而不是 Newer 文件。这意味着当它遍历源中的文件时,它使用 /MINAGE 参数仅找出 哪些 个文件我需要 copy 完了,不是我需要什么文件删除.

此行为的原因是因为 /MINAGE 和相应的 /MAXAGE 参数适用于具有慢速网络链接的非常大的目录或较小的目标计算机,我们通常只对复制感兴趣某些文件集(例如,只有昨天的新文件),并且不一定需要复制 所有 文件。大多数情况下,在这些情况下,通常不会执行或不需要镜像,因为文件集通常是“Delta”。

为了突出复制删除,如果镜像目录然后我们添加 2 个额外的文件,一个旧的和一个新的到 Destination:

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

和 re-run 包含已跳过 /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 是为了......好吧......镜像。其他参数只是告诉它 whatCopy.

我们从复制涉及的源文件开始:

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

我们通过 Include skipped /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