具有 Mir 参数的 Robocopy Maxage Minage

1 powershell command-line robocopy powershell-4.0

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

以下将移动所有文件。

Step 1: robocopy c:\Source C:\Destination /MIR
Run Code Online (Sandbox Code Playgroud)

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

Step 2: robocopy c:\Source C:\Destination /MIR /maxage:19000101 /minage:20190101" 
Run Code Online (Sandbox Code Playgroud)

HAL*_*256 5

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

这不起作用的原因是该/MINAGE开关仅影响选择 复制的文件,即使该/MIR命令按预期工作。

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

C:\Source         C:\Destination
 File-2018.txt     
 File-2019.txt     
Run Code Online (Sandbox Code Playgroud)

当我们运行标准\MIR命令时:

Robocopy.exe C:\Source C:\Destination /MIR 
Run Code Online (Sandbox Code Playgroud)

这两个文件都按预期复制。

2 files Copied

C:\Source         C:\Destination
 File-2018.txt      File-2018.txt
 File-2019.txt      File-2019.txt
Run Code Online (Sandbox Code Playgroud)

如果我们向目的地添加一个额外的文件:

C:\Source         C:\Destination
 File-2018.txt      File-2018.txt
 File-2019.txt      File-2019.txt
                    File-2020.txt
Run Code Online (Sandbox Code Playgroud)

并重新运行/MIR命令:

Robocopy.exe C:\Source C:\Destination /MIR 
Run Code Online (Sandbox Code Playgroud)

我们得到了,正如预期的那样,额外的文件被删除了:

2 files Skipped
1 files Extras

C:\Source         C:\Destination
 File-2018.txt      File-2018.txt
 File-2019.txt      File-2019.txt
Run Code Online (Sandbox Code Playgroud)

\MIR命令中,当我们添加一个/MINAGE参数时,我们认为我们要求 2019 年 1 月 1 日及之前的所有内容保留,其余部分保留:

Robocopy.exe C:\Source C:\Destination /MIR /MINAGE:20190101
Run Code Online (Sandbox Code Playgroud)

我们得到了意想不到的:

2 files Skipped

C:\Source         C:\Destination
 File-2018.txt      File-2018.txt
 File-2019.txt      File-2019.txt
Run Code Online (Sandbox Code Playgroud)

为了更好地说明发生了什么,以及为什么它“跳过”了文件,让我们添加另一个参数,包括跳过\IS

Robocopy.exe C:\Source C:\Destination /MIR /IS /MINAGE:20190101
Run Code Online (Sandbox Code Playgroud)

我们得到:

1 files Copied
1 files Skipped

C:\Source         C:\Destination
 File-2018.txt      File-2018.txt
 File-2019.txt      File-2019.txt
Run Code Online (Sandbox Code Playgroud)

这意味着\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
Run Code Online (Sandbox Code Playgroud)

我们得到:

1 files Copied
1 files Skipped

C:\Source         C:\Destination
 File-2018.txt      File-2018.txt
 File-2019.txt      
Run Code Online (Sandbox Code Playgroud)

它复制了文件,而不是文件。当它通过文件源迭代,这意味着,它使用的/MINAGE参数找出只有哪些文件,我需要复制过来,没有什么文件,我需要删除

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

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

C:\Source         C:\Destination
                    File-2017.txt
 File-2018.txt      File-2018.txt
 File-2019.txt      File-2019.txt
                    File-2020.txt
Run Code Online (Sandbox Code Playgroud)

并使用 Include Skipped 重新运行,/IS以便我们可以看到正在复制的内容:

Robocopy.exe C:\Source C:\Destination /MIR /IS /MINAGE:20190101
Run Code Online (Sandbox Code Playgroud)

我们得到了一些令人惊讶的:

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
Run Code Online (Sandbox Code Playgroud)

这个突出显示/MIR是为了......好吧......镜像。其他参数是那里才告诉它什么复制

我们从副本中涉及的源文件开始:

C:\Source
 File-2018.txt
 File-2019.txt
Run Code Online (Sandbox Code Playgroud)

我们通过 Include skipped/IS和应用过滤/MINAGE

C:\Source
 File-2018.txt    <- 1 files Copied
 File-2019.txt    <- 1 files Skipped
Run Code Online (Sandbox Code Playgroud)

然后\MIRMirror 命令执行并从 Destination 中删除所有 未包含在 Source Files 中的文件

C:\Destination
 File-2017.txt    <- 2 files Extra
 File-2020.txt  
Run Code Online (Sandbox Code Playgroud)

无论额外文件的年龄

简单的解决方案是从一开始就不要复制所有内容。从一个空目录开始,只复制 2019 年 1 月 1 日之前的文件:

Remove-Item C:\Destination -Force
Robocopy.exe C:\Source C:\Destination /E /MINAGE:20190101
Run Code Online (Sandbox Code Playgroud)

编辑

改进的方法(而不是先删除整个目录),您只需在目标上运行清理脚本,首先从目标中删除早于 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
Run Code Online (Sandbox Code Playgroud)