如何强制Robocopy覆盖文件?

时间:2016-11-22 14:22:42

标签: windows powershell ntfs robocopy

通常,Robocopy会忽略lastwrittendate和filesize相同的文件。我们怎样才能摆脱这种设计?我想用Robocopy强制覆盖。

我预计dst \ sample.txt应该写成test001。 但是这些文件被Robocopy识别为相同的文件而不会被覆盖。在这种情况下,“/ IS”选项无效。

New-Item src -itemType Directory
New-Item dst -itemType Directory
New-Item src\sample.txt -itemType File -Value "test001"
New-Item dst\sample.txt -itemType File -Value "test002"
Set-ItemProperty src\sample.txt -Name LastWriteTime -Value "2016/1/1 15:00:00"
Set-ItemProperty dst\sample.txt -Name LastWriteTime -Value "2016/1/1 15:00:00"

ROBOCOPY.exe src dst /COPYALL /MIR
Get-Content src\sample.txt, dst\sample.txt
> test001
> test002

ROBOCOPY.exe src dst /COPYALL /MIR /IS
Get-Content src\sample.txt, dst\sample.txt
> test001
> test002

3 个答案:

答案 0 :(得分:19)

来自documentation

  

/is包含相同的文件   /it包括"调整"文件。

"相同的文件"表示相同的文件(名称,大小,时间,属性)。 "调整文件"表示具有相同名称,大小和时间但属性不同的文件。

robocopy src dst sample.txt /is      # copy if attributes are equal
robocopy src dst sample.txt /it      # copy if attributes differ
robocopy src dst sample.txt /is /it  # copy irrespective of attributes
SuperUser上的

This answer很好地解释了选择参数匹配的文件类型。

话虽如此,我可以重现您描述的行为,但是根据我对文档的理解以及在我的测试中生成的输出robocopy,我认为这是一个错误。

PS C:\temp> New-Item src -Type Directory >$null
PS C:\temp> New-Item dst -Type Directory >$null
PS C:\temp> New-Item src\sample.txt -Type File -Value "test001" >$null
PS C:\temp> New-Item dst\sample.txt -Type File -Value "test002" >$null
PS C:\temp> Set-ItemProperty src\sample.txt -Name LastWriteTime -Value "2016/1/1 15:00:00"
PS C:\temp> Set-ItemProperty dst\sample.txt -Name LastWriteTime -Value "2016/1/1 15:00:00"
PS C:\temp> robocopy src dst sample.txt /is /it /copyall /mir
...
  Options : /S /E /COPYALL /PURGE /MIR /IS /IT /R:1000000 /W:30

------------------------------------------------------------------------------

                           1    C:\temp\src\
            Modified                   7        sample.txt

------------------------------------------------------------------------------

               Total    Copied   Skipped  Mismatch    FAILED    Extras
    Dirs :         1         0         0         0         0         0
   Files :         1         1         0         0         0         0
   Bytes :         7         7         0         0         0         0
...
PS C:\temp> robocopy src dst sample.txt /is /it /copyall /mir
...
  Options : /S /E /COPYALL /PURGE /MIR /IS /IT /R:1000000 /W:30

------------------------------------------------------------------------------

                           1    C:\temp\src\
            Same                       7        sample.txt

------------------------------------------------------------------------------

               Total    Copied   Skipped  Mismatch    FAILED    Extras
    Dirs :         1         0         0         0         0         0
   Files :         1         1         0         0         0         0
   Bytes :         7         7         0         0         0         0
...
PS C:\temp> Get-Content .\src\sample.txt
test001
PS C:\temp> Get-Content .\dst\sample.txt
test002

该文件被列为已复制,并且由于它在之后成为同一文件,因此第一次robocopy运行至少会同步。{但是,即使已根据输出复制了7个字节,但在两种情况下都没有数据实际写入目标文件,尽管设置了数据标志(通过/copyall)。如果明确设置数据标志(/copy:d),行为也不会改变。

我必须修改上次写入时间才能让robocopy实际同步数据。

PS C:\temp> Set-ItemProperty src\sample.txt -Name LastWriteTime -Value (Get-Date)
PS C:\temp> robocopy src dst sample.txt /is /it /copyall /mir
...
  Options : /S /E /COPYALL /PURGE /MIR /IS /IT /R:1000000 /W:30

------------------------------------------------------------------------------

                           1    C:\temp\src\
100%        Newer                      7        sample.txt

------------------------------------------------------------------------------

               Total    Copied   Skipped  Mismatch    FAILED    Extras
    Dirs :         1         0         0         0         0         0
   Files :         1         1         0         0         0         0
   Bytes :         7         7         0         0         0         0
...
PS C:\temp> Get-Content .\dst\sample.txt
test001

一个公认的丑陋的解决方法是更改​​相同/调整文件的上次写入时间以强制robocopy复制数据:

& robocopy src dst /is /it /l /ndl /njh /njs /ns /nc |
  Where-Object { $_.Trim() } |
  ForEach-Object {
    $f = Get-Item $_
    $f.LastWriteTime = $f.LastWriteTime.AddSeconds(1)
  }
& robocopy src dst /copyall /mir

切换到xcopy可能是您的最佳选择:

& xcopy src dst /k/r/e/i/s/c/h/f/o/x/y

答案 1 :(得分:2)

这真的很奇怪,为什么没人提/ IM开关?!我已经在备份作业中使用了很长时间。但是我刚才尝试使用谷歌搜索功能,即使在MS website上,我也无法登陆任何显示任何相关信息的网页!还发现有很多用户帖子抱怨同样的问题!

无论如何,要使用Robocopy覆盖 EVERYTHING 无论源或方向的大小或时间如何,您都必须在命令(/ IS / IT / IM)中包括这三个开关

/IS :: Include Same files. (Includes same size files)
/IT :: Include Tweaked files. (Includes same files with different Attributes)
/IM :: Include Modified files (Includes same files with different times).

这是我用来传输几兆字节的主要1GB +文件(ISO-磁盘映像-4K视频)的确切命令:

robocopy B:\Source D:\Destination /E /J /COPYALL /MT:1 /DCOPY:DATE /IS /IT /IM /X /V /NP /LOG:A:\ROBOCOPY.LOG

我为您做了一个小测试..结果如下:

               Total    Copied   Skipped  Mismatch    FAILED    Extras
    Dirs :      1028      1028         0         0         0       169
   Files :      8053      8053         0         0         0         1
   Bytes : 649.666 g 649.666 g         0         0         0   1.707 g
   Times :   2:46:53   0:41:43                       0:00:00   0:41:44


   Speed :           278653398 Bytes/sec.
   Speed :           15944.675 MegaBytes/min.
   Ended : Friday, August 21, 2020 7:34:33 AM

目标磁盘:WD Gold 6TB(将写入速度与我的结果进行比较)

即使带有那些“附加”,也仅是由于“ / X”开关而用于报告。如您所见,没有任何内容被跳过,并且所有文件的总数和大小等于“已复制”。有时,当我滥用它并在操作期间多次取消它时,它会显示少量跳过的文件,即使前2列中的值始终相等。我还通过运行PowerShell脚本来确认这一点,该脚本可扫描目的地中的所有文件并生成所有时间戳的报告。

历史记录中的一些性能提示以及许多测试与麻烦!

。尽管大多数在线用户建议使用最大线程数“ / MT:128”,这是获得最佳性能的一般技巧... 请不要使用“ / MT:128”来使用大线程文件 ...这是一个很大的错误,它会在多次运行后大大降低驱动器的性能..它会产生很高的碎片,甚至在某些情况下还会导致文件系统故障,最终导致花宝贵的时间尝试恢复RAW分区以及所有这些废话。最重要的是,它的执行速度会慢4-6倍!

对于超大文件:

  1. 仅使用“一个”线程“ / MT:1” |影响:
  2. 必须使用“ / J”禁用缓冲。 |影响:高
  3. 将“ / NP”与“ / LOG:file”一起使用,并且不要通过“ / TEE”输出到控制台|影响:中等。
  4. 将“ / LOG:file”放置在与源或目标不同的驱动器上|影响:低。

对于常规大文件:

  1. 使用多线程,我不会超过“ / MT:4” |影响:
  2. 如果目标磁盘的缓存规范较低,请使用“ / J”禁用缓冲|影响:高
  3. &4与上述相同。

对于成千上万的小文件:

  1. 发疯了:)多线程,起初我将以16开始,然后乘以2,同时监视磁盘性能。一旦开始下降,我将返回到prevouse值并用它来打击|影响:
  2. 请勿使用“ / J” |影响:高
  3. 将“ / NP”与“ / LOG:file”一起使用,并且不要通过“ / TEE”输出到控制台|影响:高。
  4. 将“ / LOG:file”放置在与源或目标不同的驱动器上|影响:高。

答案 2 :(得分:0)

我这样做是为了一个主文件夹,其中所有文件夹都在相应用户的桌面上,可以通过没有相应权限的快捷方式访问,这样即使在那里,用户也看不到它。所以我使用Robocopy参数来用正确的设置覆盖文件:

FOR /F "tokens=*" %G IN ('dir /b') DO robocopy  "\\server02\Folder with shortcut" "\\server02\home\%G\Desktop" /S /A /V /log+:C:\RobocopyShortcut.txt /XF *.url *.mp3 *.hta *.htm *.mht *.js *.IE5 *.css *.temp *.html *.svg *.ocx *.3gp *.opus *.zzzzz *.avi *.bin *.cab *.mp4 *.mov *.mkv *.flv *.tiff *.tif *.asf *.webm *.exe *.dll *.dl_ *.oc_ *.ex_ *.sy_ *.sys *.msi *.inf *.ini *.bmp *.png *.gif *.jpeg *.jpg *.mpg *.db *.wav *.wma *.wmv *.mpeg *.tmp *.old *.vbs *.log *.bat *.cmd *.zip /SEC /IT /ZB /R:0

如您所见,有许多文件类型我设置为忽略(以防万一),只需根据您的需要或案例场景设置它们。

在服务器2012上测试,每个交换机都记录在Microsoft的站点和其他站点中。