Я в основном делаю вариации этого, но, учитывая, как работает компиляция точек доступа, если вы хотите получить точные результаты, вам нужно выбросить первые несколько измерений и убедиться, что вы используете этот метод в реальном мире (прочитайте приложение) заявление.
Если JIT решит скомпилировать его, ваши номера будут сильно различаться. поэтому просто знайте
Честно говоря, я не думаю, что это где-то в официальной справке задокументировано (по крайней мере, не то, что я видел), но на самом деле происходит то, что конечный обратный слеш фактически избегает последней двойной кавычки. На мой взгляд, это на самом деле ошибка.
Причина, по которой ошибка не связана, заключается просто в том, что команда forfiles
обнаруживает ошибку в формате из-за пропущенной двойной кавычки, которую экранировала обратная косая черта.
Вы увидите, что этого не произойдет, если у вас нет двойных кавычек, поэтому давайте предположим, что у вас нет пробела на пути:
FORFILES /P C:\users\DominiqueGerry\WorkFiles\ /S /M *.doc /C "cmd /c echo @fsize"
Не даст вам ошибки, просто потому, что У baskslash нет допустимого символа для выхода, проблема в том, что у вас есть пробел в пути, поэтому вы должны использовать двойные кавычки. Поэтому лучше сохранить двойные кавычки и не добавлять обратную косую черту:
FORFILES /P "C:\users\DominiqueGerry\Work Files" /S /M *.doc /C "cmd /c echo @fsize"
Или, если вы непреклонны в использовании обратной косой черты, просто избегайте ее, удваивая.
FORFILES /P "C:\users\DominiqueGerry\Work Files\\" /S /M *.doc /C "cmd /c echo @fsize"
Отредактируйте, также как упоминалось в комментариях @aschipfl , вы можете использовать .
:
FORFILES /P "C:\users\DominiqueGerry\Work Files\." /S /M *.doc /C "cmd /c echo @fsize"
Исходники C / C ++, скомпилированные в исполняемые файлы, могут следовать Разбор аргументов командной строки C ++
Код запуска Microsoft C / C ++ использует следующие правила при интерпретации аргументов, данных в операционной системная командная строка:
blockquote>
Аргументы ограничиваются пробелом, который является пробелом или табуляцией.
Символ каретки (^) не распознается как escape-символ или разделитель. Этот символ полностью обрабатывается анализатором командной строки в операционной системе перед передачей в массив argv в программе.
Строка, заключенная в двойные кавычки («строка»), интерпретируется как один аргумент, независимо от пробела, содержащегося внутри. Строка в кавычках может быть встроена в аргумент.
Двойная кавычка, которой предшествует обратная косая черта (\ "), интерпретируется как буквальный символ двойной кавычки (").
Обратные слеши интерпретируются буквально, если только они непосредственно не предшествуют двойной кавычке.
Если за четным числом обратных косых черт стоит двойная кавычка, один обратный слеш помещается в массив argv для каждой пары обратных косых черт, а двойная кавычка интерпретируется как разделитель строк.
[ 1112]Если за нечетным числом обратных косых черт следует двойная кавычка, один обратный слеш помещается в массив argv для каждой пары обратных косых черт, а двойная кавычка «экранируется» оставшейся обратной косой чертой, вызывая буквальная двойная кавычка ("), помещаемая в argv.
Довольно часто встречается для программ на C ++. Интерпретатор команд начал свою жизнь до того, как была установлена упомянутая обработка аргументов C ++.
reg.exe
и другие программы, скомпилированные из источников C ++, обычно имеют такую обработку аргументов.
forfiles.exe
не является встроенной командой для интерпретатора команд, поэтому встроенная справкаcmd.exe
не будет информировать вас о том, как внешне исполняемые файлы могут вести себя.Как вы обнаружили, вы можете избежать двойных кавычек с обратной косой чертой, т. е.
\"
. Это позволяет вам иметь двойные кавычки в строке в двойных кавычках, т.е."\"string\""
, так что кавычки сохраняется программой, которой передан аргумент. Чтобы избежать побега, удвойте обратная косая черта, т. е.\\
.Вы получаете ошибку: 1 двойная кавычка удаляемой пары и сохраненная двойная кавычка сохраняется, поэтому оставшаяся двойная кавычка вызывает синтаксическую ошибку.