Я не думаю, что этот точный вопрос задали прежде (я смотрел).
Мой сервер резервного копирования выполняет использование сценария 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" или "Локальный" или "Google", поскольку это исключило бы ценные данные. Просто те конкретные подпути.
Я попробовал его и не ведя '\', и без двойных кавычек вокруг путей, с/без '*', и перестановки тех.
Там какой-либо путь состоит в том, чтобы сделать эту работу с Robocopy без жесткого кодирования конкретный путь для каждого пользователя на каждой машине?
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
и удалив файл файл задания. Я бы прокомментировал эти строки во время тестирования и, возможно, добавил бы некоторую проверку уровня ошибок
после завершения robocopy
.
Прошу прощения, но согласно документации на https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/robocopy :
/ xf
[...] Исключает файлы, соответствующие указанным именам или пути. Обратите внимание, что имя файла может содержать подстановочные знаки (* и?).
/ xd[...] Исключает каталоги, соответствующие указанным именам и путям.
Таким образом, это конкретно означает, что подстановочные знаки могут использоваться во флаге / xf, но не во флаге / xd.
Однако в документации Microsoft могут быть ошибки.
И в данном случае, по-видимому, так оно и есть. Мне нравится скрывать папки от копирования RoboCopy, поэтому я добавляю к их именам префикс «_».
Затем я добавляю '_*' (без кавычек) после параметра '/XD' в файл удаленного задания (.rcj).
Это работает! Microsoft, по-видимому, решила, что это подразумевается комментариями к параметру '/XF', и не сочла необходимым повторять его.
Ну, Майкософт, в справочном документе НАДО!