Недопустимый параметр в исходном каталоге с использованием robocopy

Я использую robocopy для копирования из одного каталога в другой.

Я тестировал код, используя разные исходные каталоги, но получаю сообщение об ошибке при выполнении одного конкретного каталога:

set "source=C:\Program Files (x86)\Phoresis\Backup"

Я получаю сообщение об ошибке:

Неверный параметр 3 "(x86)\Phoresis\Backup"

Пробовали использовать одинарные кавычки и заключали назначения переменных в «», так как в путях к каталогам есть пробелы.

Код:

set "newDirectory=F:\Cap2 Flex Backup"

REM Timesatmp a new folder
set "DirName=%date:~-4,4%.%date:~-7,2%.%date:~0,2%.%time:~0,2%.%time:~3,2%
MD \%newDirectory%"

set "source=C:\Program Files (x86)\Phoresis\Backup"

robocopy %source% %DirName% /e /z /Mir

Пытаюсь разобраться с пробелами/специальными символами в сценариях/пакетах vb, поэтому любой ввод ценится.

Ваше здоровье


person dancingbush    schedule 02.12.2015    source источник
comment
1. измените robocopy командную строку на robocopy "%source%" "%DirName%" /e /z /Mir; 2. для чего нужна командная строка MD? ; вы создаете каталог, но robocopy его не использует; и есть ведущий \`, который следует заменить на ";   -  person aschipfl    schedule 02.12.2015
comment
Хорошо, попробую, зачем мне кавычки вокруг этих переменных?   -  person dancingbush    schedule 02.12.2015
comment
Поскольку сохраненные пути содержат пробелы, которые интерпретируются как разделители аргументов, если только аргумент не заключен в ""...   -  person aschipfl    schedule 02.12.2015
comment
Обертывание переменной при объявлении не делает этого   -  person dancingbush    schedule 02.12.2015
comment
Нет; set "VAR=a string" присваивает a string переменной VAR без кавычек; кавычки просто избегают проблем со специальными символами, такими как &, ^, (, ), ПРОБЕЛ,...; если такие символы не появляются, это то же самое, что и set VAR=a string; поэтому версия в кавычках безопасна, а версия без кавычек - нет; но при расширении (чтении) переменной вы должны снова позаботиться о таких символах; в вашем случае без окружающих кавычек ПРОБЕЛ интерпретируется как разделитель аргументов, поэтому C:\Program, Files и (x86)\Phoresis\Backup - это три аргумента;   -  person aschipfl    schedule 02.12.2015
comment
Спасибо, очень полезная информация, которую я буду использовать в будущем - изменю код и обновлю вас.   -  person dancingbush    schedule 02.12.2015
comment
Уточните, пожалуйста, что вы хотите сделать с помощью команды MD; должен ли он создать корневой каталог назначения, который содержит папку временных меток DirName? как только у меня появится намерение, я опубликую ответ со всей информацией...   -  person aschipfl    schedule 02.12.2015
comment
Да, это правильно, идея состоит в том, чтобы каждый раз при выполнении кода создавать новый каталог, содержащий папку с отметкой времени (DirName).   -  person dancingbush    schedule 02.12.2015


Ответы (1)


Основная проблема в вашем коде заключается в том, что вокруг исходного и целевого каталогов в командной строке robocopy нет кавычек "". Поскольку они содержат пробелы, они интерпретируются как разделители аргументов; поэтому %source%, который расширяется до значения C:\Program Files (x86)\Phoresis\Backup, будет интерпретироваться как три аргумента C:\Program, Files и (x86)\Phoresis\Backup. Чтобы избежать этого, поместите "" вокруг аргументов пути, таких как "%source%".

Вот фиксированный код:

set "newDirectory=F:\Cap2 Flex Backup"
md "%newDirectory%"

rem Timesatmp a new folder
set "DirName=%newDirectory%\%date:~-4,4%.%date:~-7,2%.%date:~0,2%.%time:~0,2%.%time:~3,2%"

set "source=C:\Program Files (x86)\Phoresis\Backup"

robocopy "%source%" "%DirName%" /e /z /Mir

Дополнительные вопросы/примечания:

  • хотя вы использовали кавычки в командной строке set, что позволяет избежать проблем с некоторыми специальными символами (&, ^, (, ), ПРОБЕЛ и т. д.), "" не являются частью значений, хранящихся в переменные; поэтому при расширении (чтении) переменных вам нужно еще раз позаботиться о таких специальных символах, окружив читаемую переменную "";
  • команда md исправлена ​​(была ведущая \, но не открывалась ") и перемещена вверх;
  • переменная DirName теперь содержит также родительский (корневой) каталог назначения F:\Cap2 Flex Backup, который хранится в переменной newDirectory, чтобы избежать относительных путей для robocopy; поскольку source также содержит абсолютный путь, скрипт может быть расположен и выполнен где угодно;
  • учитывать, что отметка времени, полученная %date% и %time%, зависит от региональных и региональных настроек системы; поэтому этот скрипт не совсем переносим; см. это сообщение, чтобы преодолеть это;
person aschipfl    schedule 02.12.2015
comment
Очень полезно спасибо. Один вопрос (я заметил, что пакет должен быть выполнен в целевом каталоге для правильной работы, так что что-то делать с относительными путями?) - можете ли вы расширить пункт 3? - person dancingbush; 03.12.2015
comment
Пожалуйста! да, я использовал абсолютные пути как для источника, так и для места назначения, поэтому пакетный файл можно найти и выполнить где угодно... - person aschipfl; 03.12.2015