Ответ 1
Оригинальный ответ
Удалите конечную обратную косую черту с пути исходной папки
C:\Windows\System32\xcopy.exe /Y "C:\Users\Ryan\Desktop\mmars_pub" "C:\Users\Ryan\Desktop\Dropbox\MMARS\mmars_pub\"
отредактировано 2015/10/01
В то время как в исходном вопросе использовался литеральный путь, и указанное решение решит проблему, есть еще один вариант. Для литеральных путей и в тех случаях, когда путь находится внутри переменной и может (или нет) заканчиваться обратным слэшем, достаточно убедиться, что конечная обратная косая черта (если присутствует) отделена от цитаты, включая конечную точку.
xcopy /y "x:\source\." "x:\target"
xcopy /y "%myVariable%." "x:\target"
Эта конечная точка не будет мешать именам файлов/папок. Если есть и заканчивается обратная косая черта, дополнительная точка будет просто ссылаться на одну и ту же папку. Если не заканчивается обратная косая черта, как в файлах Windows, и папки не могут заканчивать свои имена точкой, она будет отброшена.
НО, если вывод команды xcopy
будет обработан, помните, что эта дополнительная точка будет включена в показанные пути.
note: решения находятся над строкой. Продолжайте читать, если вы заинтересованы в том, почему/где есть проблема.
Почему xcopy "c:\source\" "d:\target\"
работает, но xcopy "c:\source" "d:\target\"
работает?
Обе команды, похоже, имеют допустимые ссылки на пути, и... ДА! оба являются допустимыми ссылками на пути, но есть два элемента, которые работают вместе, чтобы сбой команды:
- цитируется ссылка на папку (обратите внимание: она должна быть процитирована, является хорошей привычкой указывать пути, поскольку вы никогда не знаете, когда они будут содержать пробелы или специальные символы)
-
xcopy
не является внутренней командой, обрабатываемойcmd
, но исполняемый файл
Поскольку xcopy
является внешней командой, ее аргументы не обрабатываются в соответствии с логикой командной строки cmd
parser. Они обрабатываются кодом запуска Microsoft C.
Этот парсер следует двум наборам правил, официальным правилам
Аргументы ограничены пробелом, который является либо пространством, либо вкладкой.
Строка, окруженная двойными кавычками, интерпретируется как один аргумент, независимо от пробела, содержащегося внутри. Цитированный строка может быть встроена в аргумент. Обратите внимание, что каретка (
^
) не распознается как escape-символ или разделитель.Двойная кавычка, перед которой обратная косая черта,
\"
, интерпретируется как буквальная двойная кавычка ("
).Обратные косые тракты интерпретируются буквально, если только они не предшествуют двойной кавычки.
Если четное число обратных косых черт сопровождается знаком двойной кавычки, то один обратный слэш (
\
) помещается в массив argv для каждого пара обратных косых черт (\\
), а знак двойной кавычки ("
) равен интерпретируется как разделитель строк.Если за нечетным числом обратных косых черт следует двойная кавычка, тогда одна обратная косая черта (
\
) помещается в массив argv для каждого пара обратных косых черт (\\
), а двойная кавычка интерпретируется как escape-последовательность оставшейся обратной косой чертой, вызывая буквальный двойной кавычек ("
) для размещения в argv.
и недокументированные/не официальные правила (Как параметры командной строки проанализированы)
- За пределами блока с двойными кавычками a
"
запускается блок с двойными кавычками.- Внутри блока с двойными кавычками a
"
, за которым следует другой символ (не другой"
), заканчивается двойной кавычек.- Внутри блока с двойными кавычками a
"
, за которым сразу следует другая"
(т.е.""
), приводит к добавлению единственного"
к выходу, а двойной кавычек продолжается.
Этот анализатор видит последовательность \"
, найденную в конце "первого" аргумента в качестве экранированной цитаты, которая не заканчивает/закрывает аргумент, это рассматривается как часть или аргумент. И "стартовая" цитата "второго" аргумента просто заканчивается двойным кавычком, но не заканчивается аргумент, помните, что аргументы разделены пробелом.
Итак, если кажется, что аргументы командной строки
v v v......argument delimiters
v.........v v..........v ......quoted blocks
xcopy "x:\souce\" "x:\target\"
^.......^ ^........^ ......argument data
arg #1 arg #2
arg #1 = x:\source\
arg #2 = x:\target\
фактический аргумент, обрабатываемый xcopy
, равен
v v .....argument delimiters
v......................v .....quoted block
xcopy "x:\souce\" "x:\target\"
^.....................^ .....argument data
arg #1
arg #1 = x:\source" x:\target"
Когда конечная обратная косая черта удаляется или добавляется дополнительная точка, закрывающая цитата в аргументе не будет экранирована, она закрывает кавычек, а пробел между аргументами будет рассматриваться как разделитель.