"Неверный путь 0 файлов скопирован" Ошибка при использовании команды xcopy

Привет, у меня есть эта небольшая команда для копирования файлов в пакетном режиме, что поможет, потому что я делаю эту конкретную копию несколько раз в день. Проблема возникает при использовании команды xcopy. Все в порядке, но я получаю эту ошибку: "Неверный путь 0 файлов скопирован". Вот код:

C:\Windows\System32\xcopy  /Y "C:\Users\Ryan\Desktop\mmars_pub\" "C:\Users\Ryan\Desktop\Dropbox\MMARS\mmars_pub\"

Я использую полный путь к исполняемому файлу xcopy, потому что у меня возникла проблема с настройкой переменной среды пути для правильной работы. Я бы предположил, что это не должно повлиять на результат. Я где-то читал о флажке "Предотвращение обнаружения на основе MS-DOS программ", который должен устранить проблему, но я просто не могу ее найти. Любая помощь оценивается.

Ответ 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"

Когда конечная обратная косая черта удаляется или добавляется дополнительная точка, закрывающая цитата в аргументе не будет экранирована, она закрывает кавычек, а пробел между аргументами будет рассматриваться как разделитель.