带有通配符和子路径的 Robocopy /xd

带有通配符和子路径的 Robocopy /xd

我认为以前没有人问过这个问题(我查过了)。

我的备份服务器使用 Robocopy 运行脚本,我想排除那些实际上不需要备份的文件,具体来说:

*\AppData\Local\Google 
*\AppData\Local\Microsoft\Windows 
*\AppData\Local\NVIDIA 
*\AppData\Local\Temp 
*\AppData\LocalLow\Google

(所有这些都有数百万个微小的缓存文件,需要花费大量时间来解析,但恢复时不需要;大多数增量备份运行时间都在处理这些文件)

“\AppData...” 之前的路径会有所不同,具体取决于机器名称、用户名(每台机器有多个用户)和该特定机器上的文件夹结构(并非每个人都将所有数据都放在 c: 上)。

为了简单起见,我有一个名为 _exclude 的环境变量,在每次调用 Robocoy 时都会使用它:

SET _exclude= /XD *AppData\Local\Google *AppData\Local\Temp [...etc]

我不想排除每一个包含“AppData”或“Local”或“Google”的目录,因为这样会排除有价值的数据。仅那些特定的子路径。

我尝试过使用和不使用前导 '\'、在路径周围使用和不使用双引号、使用/不使用 '*' 以及这些的排列组合。

有没有任何有没有什么方法可以使它与 Robocopy 一起工作,而不用为每台机器上的每个用户硬编码特定路径?

答案1

Robocopy 绝对不会独自完成您想要完成的任务。

最初,我想过让你编写一个动态生成排除列表的脚本,但你可能会遇到命令行长度限制。

考虑到这一点,我认为您最好编写一个脚本来创建 Robocopy “作业”文件。这是一个根据以下内容动态创建简单作业的脚本C:\Users

@echo off
set DEST=\\SERVER\SHARE
set SRC=C:\Users
set RCJ=%RANDOM%.RCJ

echo /DD:%DEST%>%RCJ%
echo /SD:%SRC%>>%RCJ%
echo /IF>>%RCJ%
echo *>>%RCJ%
echo /S     :: copy Subdirectories, but not empty ones.>>%RCJ%
echo /E     :: copy subdirectories, including Empty ones.>>%RCJ%
echo /COPY:DAT  :: what to COPY for files (default is /COPY:DAT).>>%RCJ%
echo /PURGE     :: delete dest files/dirs that no longer exist in source.>>%RCJ%
echo /MIR       :: MIRror a directory tree (equivalent to /E plus /PURGE).>>%RCJ%
echo /R:1000000 :: number of Retries on failed copies: default 1 million.>>%RCJ%
echo /W:30      :: Wait time between retries: default is 30 seconds.>>%RCJ%
echo /XD        :: eXclude Directories matching these names>>%RCJ%

for /d %%i in (%SRC%\*) do call :_de "%%i">>%RCJ%

robocopy /job:%RCJ%
del %RCJ%
goto :EOF

:_de
echo %~1\AppData\Local\Google
echo %~1\AppData\Local\Microsoft\Windows
echo %~1\AppData\Local\NVIDIA
echo %~1\AppData\Local\Temp
echo %~1\AppData\LocalLow\Google

我在这个脚本中表现得非常随意,继续运行robocopy并删除作业文件。我会在您测试时注释掉这些行,并可能添加一些对errorlevel以下完成情况的检查robocopy

答案2

很抱歉,但根据https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/robocopy

/xf <FileName>[ ...] 排除与指定名称或路径匹配的文件。请注意,FileName 可以包含通配符 (* 和 ?)。/
xd <Directory>[ ...] 排除与指定名称和路径匹配的目录。

所以这具体意味着通配符可以在 /xf 标志中使用,但不能在 /xd 标志中使用。

答案3

然而,微软的文档可能是错误的。

在这种情况下,显然是的。我喜欢隐藏文件夹以防止被 RoboCopy 复制,因此我在其名称前加上了“_”。

然后,我在远程作业 (.rcj) 文件的“/XD”参数后添加“_*”(不带引号)。

成功了!微软显然认为这是由 '/XF' 参数的注释所暗示的,并且认为没有必要重申它。

好吧,微软,在参考文档中,这是必要的!

相关内容