如何强制robocopy覆盖文件

一般来说,robocopy会忽略lastwrittend和filesize相同的文件。 我们如何逃避这个devise? 我想用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 

从文档 :

/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上的这个答案对选择参数匹配什么样的文件有很好的解释。

有了这个说法,我可以重现你描述的行为,但是从我对文档的理解以及在测试中生成的输出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  - 类型文件-Value“test001”> $ null
 PS C:\ temp> New-Item dst \ sample.txt  - 类型文件-Value“test002”> $ null
 PS C:\ temp> Set-ItemProperty src \ sample.txt  -  LastWriteTime -Value“2016/1/1 15:00:00”
 PS C:\ temp> Set-ItemProperty dst \ sample.txt  -  LastWriteTime -Value“2016/1/1 15:00:00”
 PS C:\ temp> robocopy src dst sample.txt / is / it / copyall / mir
 ...
  选项:/ S / E / COPYALL / PURGE / MIR / IS / IT / R:1000000 / W:30

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

                            1 C:\ temp \ src \
             修改了7个sample.txt

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

               总复制跳过不匹配失败的附加
     Dirs:1 0 0 0 0 0
   文件:1 1 0 0 0 0
   字节:7 7 0 0 0 0
 ...
 PS C:\ temp> robocopy src dst sample.txt / is / it / copyall / mir
 ...
  选项:/ S / E / COPYALL / PURGE / MIR / IS / IT / R:1000000 / W:30

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

                            1 C:\ temp \ src \
             相同的7 sample.txt

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

               总复制跳过不匹配失败的附加
     Dirs:1 0 0 0 0 0
   文件:1 1 0 0 0 0
   字节: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
 ...
  选项:/ S / E / COPYALL / PURGE / MIR / IS / IT / R:1000000 / W:30

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

                            1 C:\ temp \ src \
 100%较新的7 sample.txt

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

               总复制跳过不匹配失败的附加
     Dirs:1 0 0 0 0 0
   文件:1 1 0 0 0 0
   字节:7 7 0 0 0 0
 ...
 PS C:\ temp> Get-Content。\ dst \ sample.txt
 test001 

一个公认的丑陋的解决方法是改变相同/ tweaked文件的最后写入时间,以强制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