我试图在从备份中恢复之前从服务器复制一些目录(我的最新备份已损坏,因此我必须使用较旧的备份:()。我在Windows恢复环境中,可以访问服务器的文件系统G:\
和我的备份媒体C:\
。但是,由于我更熟悉Linux,所以我对Windows中的命令行遇到了一些麻烦,具体来说robocopy
。
我想将多个目录(保持相同的目录结构)从 G:\ 复制到 C:\,同时排除其他目录(即 Windows 和 Program Files 文件夹)。我搞不清楚该/XD
选项的语法。我希望做类似的事情:
robocopy G: C:\backup /CREATE /XD "dir1","dir2", ...
笔记:我想澄清一下,我想复制实际文件,同时保留目录结构。我刚刚检查过,/create
只创建了空文件。很奇怪。
答案1
我通过反复试验和/L
(在实际执行之前测试命令)找到了答案。我最终得到的命令是:
robocopy G: C:\backup /MIR /XD G:\dir1 "G:\dir 2" G:\dir3 ...
显然,包含尾随斜杠会导致 robocopy 无法正确解析目录列表,因此请确保不要在目录名称中包含尾随斜杠,并记得在名称中带有空格的目录周围加上引号。
该/MIR
选项在复制文件时保持相同的目录结构。
编辑:经过进一步研究后,我稍微改进了命令:
robocopy G: C:\backup /MIR /Z /LOG:C:\todaysdate-backup.log /XF *.iso *.log *.au /XD G:\dir1 ...
新增内容如下:
/Z
允许重新启动作业/LOG:<logfile path>
是不言自明的。/XF
用于排除某些文件类型,这样就不会花太长时间
答案2
你必须重复这一/XD
部分
C:\>robocopy "C:\Users\weberjn\Google Drive" "u:\Google Drive" /e /dcopy:t /copy:DT /r:0 /XD "C:\Users\weberjn\Google Drive\photos" /XD "C:\Users\weberjn\Google Drive\Google Photos"
答案3
我知道这并没有回答 OP 的问题,但是对于来自谷歌的任何人来说:如果使用引号,XD 将在作业文件中失败。
坏的:
::
:: Exclude These Directories :
::
/XD :: eXclude Directories matching these names
"Temporary Internet Files"
好的:
::
:: Exclude These Directories :
::
/XD :: eXclude Directories matching these names
Temporary Internet Files
逐行放置任意数量的排除项,无需使用引号(无论是否有空格)。
我发现这一点的方法是使用命令行开关 /SAVE:myjobname,它将引号从我引用的目录中删除!
答案4
这是根据Fara Importanta 在 ServerFault 上的回答和Robocopy 终极指南
由此可知Charlie C 的回答使用文件来存储排除项/包含项。然而,我们却利用了开关/JOB
。
让我们以存储在以下文件中的排除列表为例
排除.rcj
/XF
*.pyc
*.pyo
*.pyd
/XD
__pycache__
.pytest_cache
请注意,我们如何能够在文件内部拥有多个开关,并使用新行分隔名称以提高可读性!
我们的批处理脚本可以类似如下内容:
备份程序
SET _backupDir=backup_path\
SET _excl="%_backupDir%exclude.rcj"
robocopy src_path dest_path /JOB:%_excl%