一般来说,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