Вопрос или проблема
Я использую команду robocopy
на Windows для создания резервных копий. Я пытаюсь исключить директорию из резервного копирования, но никак не получается — эта директория всегда копируется.
Код находится в скрипте PowerShell.
Команда robocopy выглядит следующим образом:
robocopy $srcPath $staging * /nfl /ndl /r:10 /A-:SHR /mt /njs /mir /xf $omitF /XD $omitD
Вывод robocopy выглядит так. Вы можете видеть, что директория, которую я пытаюсь исключить, указана в Exc Dirs
. Обратите внимание, что параметры, показанные на изображении, немного отличаются от приведенной выше команды — это делается самой robocopy:
Я пробовал следующие форматы для параметра директории:
- Foo
- Foo\
- “Foo”
- “Foo\”
- K:\workspace\Notes\Foo
- K:\workspace\Notes\Foo\
- “K:\workspace\Notes\Foo”
- “K:\workspace\Notes\Foo\”
Директория Foo находится на уровне корня директории-источника.
У меня закончились идеи. Почему robocopy настаивает на копировании директории Foo?
Опция /xd ищет только папки в папке назначения, так как в папке назначения нет “K:\workspace\Notes\Foo”, она ничего не блокирует. Вам нужно использовать что-то вроде:
/xd Foo
/xd workspace\Notes\Foo
Ответ или решение
Теория (Theory):
Robocopy, или "Robust File Copy," является мощным инструментом командной строки в Windows для копирования файлов и папок. Он предназначен для выполнения надёжного и эффективного копирования, синхронизации и резервного копирования данных между каталогами. Одной из его ключевых функций является возможность исключения определённых файлов или директорий из процесса копирования с помощью параметров /XD
и /XF
. Тем не менее, эти параметры могут быть неочевидными, особенно для пользователя, не знакомого с их специфическим использованием.
Параметр /XD
(ExclDirs
) предназначен для исключения директорий из копирования. Однако важно отметить, что путь, указанный в этом параметре, должен совпадать с именем или путём директории в источнике, которые вы хотите исключить. Поскольку Robocopy может обрабатывать сложные деревья директорий, даже небольшая ошибка в указании пути может привести к тому, что директория всё равно будет скопирована.
Пример (Example):
Проблема, с которой вы сталкиваетесь, заключается в том, что директория "Foo" копируется, несмотря на вашу попытку исключить её через /XD
. Синтаксис, который применяется для исключения, может быть неправильно интерпретирован. Например, если вы используете полный путь "K:\workspace\Notes\Foo", а Robocopy ожидает относительный путь относительно указанного корневого источника, он может не распознать, что вы пытаетесь исключить.
Вы также упомянули, что перепробовали различные форматы наименования директорий, но данные варианты не привели к успеху. Это может быть вызвано тем, как интерпретируется путь между однострочными (inline) командами и Powershell. Дополнительно, в Powershell переменные, такие как $omitD
, должны быть установлены корректно и содержать правильные пути.
Применение (Application):
Чтобы разрешить данную проблему, рекомендуется выполнить несколько шагов. Во-первых, уточните, как именно записан путь источника ($srcPath
) и как задаётся путь исключаемой директории ($omitD
). Важно, чтобы путь исключения был относительно указанного источника. Если Foo
находится на корневом уровне директории источника, то использование просто Foo
или \Foo
(если это поддерживается в контексте) должно быть достаточным.
Также, когда вы запускаете Robocopy через Powershell скрипт, учтите возможное интерпретирование специальных символов в строке. Например, конструкция \"
в Powershell может функционировать иначе по сравнению с командной строкой Windows. Убедитесь, что ваша строка подтверждена правильным синтаксисом Powershell.
Подсказка для успешного исключения:
- Проверьте значение переменной
$omitD
перед вызовом команды Robocopy, чтобы убедиться в корректности пути. - Убедитесь, что путь учтён в регистре, так как, несмотря на то, что NTFS по своей природе регистробезразлична, в некоторых случаях неверный регистр может вызвать ошибку.
- Проверьте лог Robocopy, чтобы убедиться, что исключения применяются в соответствии с ожиданиями.
В следующем примере, если Foo
действительно находится прямо под корнем $srcPath
, применение команды может выглядеть следующим образом:
$srcPath = "K:\workspace\Notes"
$omitD = "Foo"
robocopy $srcPath $staging * /nfl /ndl /r:10 /a-:SHR /mt /njs /mir /XD $omitD
Если это не даст ожидаемого результата, рассмотрите добавление дополнительной отладки, например, вывода содержимого $srcPath
и $omitD
непосредственно перед вызовом команды, чтобы убедиться, что они соответствуют вашему намерению.
Таким образом, решая задачи с Robocopy и Powershell, задавайте полные, но точные пути и регулярно проверяйте вывод и логиции, чтобы гарантировать, что ваши команды интерпретируются и выполняются корректно в контексте вашего скрипта.