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

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

C:WindowsSystem32xcopy  /Y "C:UsersRyanDesktopmmars_pub" "C:UsersRyanDesktopDropboxMMARSmmars_pub"

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

1 ответов


оригинальный ответ

удалите конечную обратную косую черту из пути к исходной папке

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

редактировать 2015/10/01

в то время как исходный вопрос использовал буквальный путь, и указанное решение решит проблему, есть еще один вариант. Для литеральных путей и в случаях, когда путь находится внутри переменной и может (или нет) заканчиваться обратной косой чертой, достаточно убедиться, что конечная обратная косая черта (если present) отделяется от цитаты, включая конечную точку.

xcopy /y "x:\source\." "x:\target"
xcopy /y "%myVariable%." "x:\target"

эта конечная точка не будет вмешиваться в имена файлов/папок. Если есть и окончание обратной косой черты, дополнительная точка будет просто ссылаться на ту же папку. Если нет окончания обратной косой черты, как в windows, файлы и папки не могут закончить свои имена точкой, она будет отброшена.

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


Примечание: решения находятся выше линии. Продолжайте читать, если вас интересует, почему / где есть .

почему xcopy "c:\source\" "d:\target\" а не xcopy "c:\source" "d:\target\" работает?

обе команды, похоже, имеют допустимые ссылки на пути, и ... Да! оба являются допустимыми ссылками на путь, но есть два элемента, которые работают вместе, чтобы сделать команду неудачной:

  • ссылка на папку цитируется (Примечание: это должны цитировать, хорошая привычка цитировать пути, как вы никогда не знаете, когда они будут содержать пробелы или специальные символы)
  • xcopy не является внутренней командой, обрабатываемой cmd но исполняемый файл

As xcopy является внешней командой, ее аргументы не обрабатываются после cmd логика командной строки парсера. Они обрабатываются код запуска Microsoft C.

этот парсер следует за двумя своды правил, официальные правила

  • Аргументы разделяются пробелом, который является пробелом или знаком табуляции.

  • строка, заключенная в двойные кавычки рассматривается как один аргумент, независимо от пробелов внутри. Двойные кавычки string может быть встроен в аргумент. Обратите внимание, что каретка (^) не распознается как escape-символ или разделитель.

  • A двойные кавычки обратной косой черты, \", интерпретируется как литеральная двойная кавычка (").

  • обратные косые черты интерпретируются буквально, если они непосредственно не предшествуют двойной кавычке.

  • если за четным числом обратных косых черт следует двойная кавычка, то одна обратная косая черта (\) помещается в массив 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 is

     v                        v .....argument delimiters
      v......................v  .....quoted block
xcopy "x:\souce\" "x:\target\"
       ^.....................^  .....argument data
      arg #1    

      arg #1 = x:\source" x:\target"

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