Я не думаю, что этот точный вопрос задавался раньше (я посмотрел).
Мой сервер резервного копирования запускает скрипт с использованием 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, без жесткого программирования конкретного пути для каждого пользователя на каждой машине?
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 <Directory> [...] Исключает каталоги, соответствующие указанным именам и путям.
Таким образом, это конкретно означает, что подстановочный знак можно использовать во флаге / xf, но не во флаге / xd.