Robocopy всегда копирует каталог, даже если указано не делать этого.

Вопрос или проблема

Я использую команду robocopy на Windows для создания резервных копий. Я пытаюсь исключить директорию из резервного копирования, но никак не получается — эта директория всегда копируется.

Код находится в скрипте PowerShell.
Команда robocopy выглядит следующим образом:

robocopy $srcPath $staging * /nfl /ndl /r:10 /A-:SHR /mt /njs /mir /xf $omitF /XD $omitD

Вывод robocopy выглядит так. Вы можете видеть, что директория, которую я пытаюсь исключить, указана в Exc Dirs. Обратите внимание, что параметры, показанные на изображении, немного отличаются от приведенной выше команды — это делается самой robocopy:

enter image description here

Я пробовал следующие форматы для параметра директории:

  • 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.

Подсказка для успешного исключения:

  1. Проверьте значение переменной $omitD перед вызовом команды Robocopy, чтобы убедиться в корректности пути.
  2. Убедитесь, что путь учтён в регистре, так как, несмотря на то, что NTFS по своей природе регистробезразлична, в некоторых случаях неверный регистр может вызвать ошибку.
  3. Проверьте лог 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, задавайте полные, но точные пути и регулярно проверяйте вывод и логиции, чтобы гарантировать, что ваши команды интерпретируются и выполняются корректно в контексте вашего скрипта.

Оцените материал
Добавить комментарий

Капча загружается...