来自the 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
超级用户上的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
...
选项:/S /E /COPYALL /PURGE /MIR /IS /IT /R:1000000 /W:30
-------------------------------------------------- ----------------------------
1 C:\temp\src\
修改 7 sample.txt
-------------------------------------------------- ----------------------------
总计 复制 跳过不匹配失败的额外内容
目录: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样例.txt
-------------------------------------------------- ----------------------------
总计 复制 跳过不匹配失败的额外内容
目录:1 0 0 0 0 0
文件:1 1 0 0 0 0
字节:7 7 0 0 0 0
...
PS C:\temp> 获取内容 .\src\sample.txt
测试001
PS C:\temp> 获取内容 .\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 示例.txt
-------------------------------------------------- ----------------------------
总计 复制 跳过不匹配失败的额外内容
目录:1 0 0 0 0 0
文件:1 1 0 0 0 0
字节:7 7 0 0 0 0
...
PS C:\temp> 获取内容 .\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