我对 robocopy 脚本存在问题,该脚本应该将包含 NTFS ACL 的目录从一台服务器镜像到另一台服务器。
看起来即使没有任何文件发生变化,每次也会复制完整的内容。
这是我正在使用的命令
robocopy \\abc.com\original \\otherserver\mirrordir /XD _MirrorLogs /MIR /COPY:DATS /R:2 /W:2 /LOG+:\abc.com\logfile.LOG /TEE
这是我得到的结果(摘录)
-------------------------------------------------------------------------------
ROBOCOPY :: Robust File Copy for Windows
-------------------------------------------------------------------------------
Started : Wed Jun 12 23:00:19 2013
Source : \\abc.com\original\
Dest : \\otherserver\mirrordir\
Files : *.*
Exc Dirs : _MirrorLogs
Options : *.* /TEE /S /E /DCOPY:DA /COPY:DATS /PURGE /MIR /R:2 /W:2
------------------------------------------------------------------------------
...
2 \\abc.com\original\Best_Practices\
7223 file1.html
194048 file2.doc
3 \\abc.com\original\_history\
155194 file3.xlsm
New File 159091 file4.xlsm
0%
20%
41%
61%
82%
100%
New File 155222 file5.xlsm
0%
21%
42%
63%
84%
100%
...
------------------------------------------------------------------------------
Total Copied Skipped Mismatch FAILED Extras
Dirs : 422 0 422 0 0 0
Files : 3123 3123 0 0 0 0
Bytes : 649.27 m 649.27 m 0 0 0 0
Times : 0:56:17 0:52:18 0:00:00 0:03:58
Speed : 216918 Bytes/sec.
Speed : 12.412 MegaBytes/min.
Ended : Wed Jun 12 23:56:38 2013
我可以理解,当有“新文件”标签时,需要复制该文件。好的。我还理解,根据摘要,没有复制任何目录。这是我所期望的。我不明白的是,似乎所有文件都被再次复制了,即使没有任何变化。大多数文件看起来像file1.html,file2.doc和file3.xlsm,即没有信息说明为什么复制该文件(如新文件或较新的文件)。我使用Beyond Compare检查了文件是否相同,从内容的角度来看,它们是相同的。我考虑过不同的访问权限,但是为什么在目录的情况下不会出现问题(访问权限也被复制了)。
有人可以给我提示吗?
提前致谢!
答案1
简而言之,当robocopy
将这些文件夹从一台服务器复制到另一台服务器时,我怀疑它看到的时间戳与您预期的不同,因此它决定目标上的现有文件比源上的相同文件更旧。这可能是由于两台机器上的时间/时区/DST 设置不同。
robocopy
在复制之前分析文件 时,它会将每个文件归类为以下类别之一:
Lonely files: exist on source but not destination.
Newer files: have Newer timestamp on source, (size and attributes: N/A).
Older files: have Older timestamp on source, (size and attributes: N/A).
Changed files: have same timestamp, but different size (attributes: N/A).
Same files: have same timestamp, size, and attributes.
Tweaked files: have same timestamp and size, but different attributes.
Extra files: exist on destination but not source.
Mismatched: is a file on one, and a directory on the other, in source
and destination.
默认情况下(以及使用您提供的命令行选项),robocopy
将复制Lonely
、Newer
和Changed
文件。其他类别中的文件将不是被复制,并且要么简单地在输出和/或日志中报告,要么完全被忽略。
如果robocopy
正在复制文件并覆盖目标上的现有文件,则robocopy
认为源文件的时间戳早于(Newer
)目标文件的时间戳,或者文件大小不同(Changed
)。
为了准确地了解每个文件发生了什么,您可以robocopy
使用"/L"
和"/V"
命令行选项运行。使用"/L"
选项告诉robocopy
不进行任何实际复制,并且仅列出否则将被复制的内容。使用选项"/V"
告诉robocopy
提供详细细节。
这将显示为什么 robocopy
已决定复制(并跳过)每个文件。因此,例如使用robocopy
复制示例文件集。
以下是文件列表:
Directory of C:\folder1
02/28/2014 12:48 PM 327 File1.txt
02/28/2014 02:03 PM 333 File2.txt
2 File(s) 660 bytes
Directory of C:\folder2
02/28/2014 12:43 PM 327 File1.txt
02/28/2014 02:03 PM 327 File2.txt
2 File(s) 654 bytes
在此示例中,名为 的文件File1.txt
在源文件夹和目标文件夹中大小相同,但Newer
在 中具有时间戳Folder1
。并且,名为 的文件File2.txt
在源文件夹和目标文件夹中具有相同的时间戳,但文件大小不同(Changed
)。
运行robocopy
复制Folder1
到Folder2
,使用"/L"
和"/V"
命令行选项如下所示。
C:\>robocopy "C:folder1" "c:folder2" /E /L /V
-------------------------------------------------------------------------------
ROBOCOPY :: Robust File Copy for Windows
-------------------------------------------------------------------------------
Started : Fri Feb 28 21:07:29 2014
Source : C:\folder1\
Dest : C:\folder2\
Files : *.*
Options : *.* /V /L /S /E /COPY:DAT /R:1000000 /W:30
------------------------------------------------------------------------------
2 C:\folder1\
Newer 327 File1.txt
Changed 333 File2.txt
------------------------------------------------------------------------------
Total Copied Skipped Mismatch FAILED Extras
Dirs : 1 0 1 0 0 0
Files : 2 2 0 0 0 0
Bytes : 660 660 0 0 0 0
Times : 0:00:00 0:00:00 0:00:00 0:00:00
Ended : Fri Feb 28 21:07:29 2014
如果您在文件集上robocopy
使用"/L"
和命令行选项运行,它应该为您提供有关为什么意外复制这些文件"/V"
的信息。robocopy
我怀疑robocopy
看到的时间戳与您预期的不同,并决定源上的文件Newer
与目标上的现有文件相同。这可能是由于两台机器上的时间/时区/DST 设置不同。
答案2
总结尝试/FFT
切换以处理较小的时间戳差异。
我遇到了与您同样的问题:即使文件在源和目标之间没有发生变化,它们也会被 robocopy 复制。
其他发布的答案很有帮助,但即使运行 robocopy 也/L
只是/v
告诉您您已经知道的内容(robocopy 认为源文件与目标文件不同)。
Robocopy 使用时间戳属性和文件大小来确定是否应复制文件。在我的例子中,文件大小相同,但时间戳相差 1 秒。显然,在复制到远程文件系统时这种情况并不罕见,尤其是当它们不是 NTFS 时。
事实证明,robocopy 有一个开关可以处理该问题:/FFT
/FFT 使用 fat 文件计时而不是 NTFS。这意味着粒度不太精确。对于跨网络共享操作,这似乎更可靠 - 只是不要依赖文件计时完全精确到秒。--Robocopy 和一些示例
答案3
在 Google 上找不到有关调整 Robocopy 参数的任何信息,无法用于我的 Robocopy 作业,即重复将文件从 NTFS 网络映射驱动器(SharePoint 文件夹)复制到 USB 驱动器。
将 USB 重新格式化为 NTFS 也没有用。最终能做到的是从 Microsoft 下载 Windows Server 2003 资源工具包,然后从中提取robocopy.exe
(通过在 zip 程序中打开rktools.exe
)并重写从网络驱动器执行 robocopy 作业的两行代码,使用这个旧版本。
需要对参数进行一些调整,因为有些参数在旧版本中不起作用。在我看来,Windows 10 中的新 Robocopy 有一个错误。
不工作:
Robocopy.exe I: D:\Network_Backups\ /MIR /TEE /FFT /DST /TIMFIX /W:5 /R:5 /NP / LOG+:D:\Robocopy\LOG.txt
工作经历:
D:\Robocopy\Robocopy2003.exe I: D:\Network_Backups\ /MIR /XO /TEE /FFT /W:1 /R:2 /NP /LOG+:D:\Robocopy\LOG.txt
答案4
我曾尝试使用仅在线复制到 DropBox 来实现此功能,并尝试过 /XA:O,但没有成功。我尝试了 2003RK 版本的 Robocopy(我多年来一直使用它,因为它可以解决奇怪的问题),果然成功了。谢谢 Chip!我不能点赞,但真的很想点赞。