【问题标题】:Robocopy Maxage Minage with Mir Parameter使用 Mir 参数的 Robocopy Maxage Minage
【发布时间】:2019-06-03 22:46:30
【问题描述】:

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

以下将移动所有文件。

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

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

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

【问题讨论】:

  • 所以...发生了什么? [grin] ///// 您的选项意味着“排除任何比 MAXAGE 更早的内容并且 排除任何比 MINAGE 更新的内容”。这似乎意味着您将镜像1900-01-01...2019-01-01 范围内的任何文件。你有这样的文件吗?有任何东西被镜像了吗?
  • 是的,我有 2019 年之前和 2019 年之后的文件,但是当我运行第 2 步时,应该删除 2019 年之后的文件
  • 我认为这不是/mir 所做的。第 2 步仅针对 2019 年之前和 1900 年之后的文件......它不会移动它们,只是复制它们。
  • StackOverflow 用于编写if/else/endif 种类的代码问题。这个 Q 更适合 superuser.com 。请在此处发布更多问题之前阅读Help On-topic。祝你好运。

标签: powershell command-line powershell-4.0 robocopy


【解决方案1】:

这看起来确实很奇怪,因为人们会认为您尝试使用 /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

【讨论】:

  • 该死!我希望当我走到这条黄砖路的尽头时,会有一个解决方法或解决方案来解决/purge /e/minage 的组合...最终是一个合理的解决方案,但我个人来到这里是希望如果某些内容尚未从目录中删除并且已经存在 X 天,则将其用作“清理”方法,那么我将帮助他们并根据策略为他们删除它。唉,我仍在寻找解决方案。
  • @ArvoBowen 我在答案中添加了一个额外的 EDIT,以获得更“最佳”的解决方案。我同意,最好使用一行 robocopy 脚本,但将其分成两部分清理,然后复制脚本基本上是使用 robocopy 执行此操作的唯一方法。
猜你喜欢
  • 1970-01-01
  • 2012-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-16
相关资源
最近更新 更多