这看起来确实很奇怪,因为人们会认为您尝试使用 /MINAGE 开关来选择 2019 年 1 月 1 日之前的所有内容。然后将其与 /MIR 开关,或更具体地说是 @987654323 结合使用@ 开关,删除 2019 年 1 月 1 日之后 之后的额外文件和目录。
这不起作用的原因是/MINAGE 开关只影响被选择为 复制的文件,即使/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
然后重新运行/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
为了更好地说明发生了什么以及它“跳过”文件的原因,让我们添加另一个参数,包括跳过\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
它复制了 Older 文件,而不是 Newer 文件。这意味着当它遍历源中的文件时,它使用/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
然后使用 Include Skipped /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
我们通过 Include skipped /IS 和 /MINAGE 应用过滤:
C:\Source
File-2018.txt <- 1 files Copied
File-2019.txt <- 1 files Skipped
然后\MIR Mirror 命令执行并从目标中删除所有文件 不包括在源文件中:
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