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, без жесткого программирования конкретного пути для каждого пользователя на каждой машине?

3 ответа

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,

Извините, но в соответствии с документацией на https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/robocopy:

/ xf [...] Исключает файлы, которые соответствуют указанным именам или путям. Обратите внимание, что FileName может содержать символы подстановки (* и?).
/ xd [...] Исключает каталоги, которые соответствуют указанным именам и путям.

Так что это, в частности, означает, что подстановочный знак может использоваться во флаге / xf, но не во флаге / xd.

Однако документация Microsoft может быть неверной.

И в данном случае, видимо, так оно и есть. Мне нравится скрывать папки от копирования с помощью RoboCopy, поэтому я добавляю к их именам префикс «_».

Затем я добавляю «_*» (без кавычек) после параметра «/XD» в файл удаленного задания (.rcj).

Это работает! Microsoft, очевидно, решила, что это подразумевается в комментариях к параметру '/XF', и не сочла необходимым повторять это.

Ну, Майкософт, в справочном документе, это НАДО!

Другие вопросы по тегам