Проблема с командой Forfiles / P (не задокументирована?)

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

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

3
задан Gerry 16 January 2019 в 08:57
поделиться

2 ответа

Честно говоря, я не думаю, что это где-то в официальной справке задокументировано (по крайней мере, не то, что я видел), но на самом деле происходит то, что конечный обратный слеш фактически избегает последней двойной кавычки. На мой взгляд, это на самом деле ошибка.

Причина, по которой ошибка не связана, заключается просто в том, что команда 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"
0
ответ дан aschipfl 16 January 2019 в 08:57
поделиться

Исходники C / C ++, скомпилированные в исполняемые файлы, могут следовать Разбор аргументов командной строки C ++

Код запуска Microsoft C / C ++ использует следующие правила при интерпретации аргументов, данных в операционной системная командная строка:

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

  • Символ каретки (^) не распознается как escape-символ или разделитель. Этот символ полностью обрабатывается анализатором командной строки в операционной системе перед передачей в массив argv в программе.

  • Строка, заключенная в двойные кавычки («строка»), интерпретируется как один аргумент, независимо от пробела, содержащегося внутри. Строка в кавычках может быть встроена в аргумент.

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

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

  • Если за четным числом обратных косых черт стоит двойная кавычка, один обратный слеш помещается в массив argv для каждой пары обратных косых черт, а двойная кавычка интерпретируется как разделитель строк.

    [ 1112]
  • Если за нечетным числом обратных косых черт следует двойная кавычка, один обратный слеш помещается в массив argv для каждой пары обратных косых черт, а двойная кавычка «экранируется» оставшейся обратной косой чертой, вызывая буквальная двойная кавычка ("), помещаемая в argv.

Довольно часто встречается для программ на C ++. Интерпретатор команд начал свою жизнь до того, как была установлена ​​упомянутая обработка аргументов C ++. reg.exe и другие программы, скомпилированные из источников C ++, обычно имеют такую ​​обработку аргументов.

forfiles.exe не является встроенной командой для интерпретатора команд, поэтому встроенная справка cmd.exe не будет информировать вас о том, как внешне исполняемые файлы могут вести себя.

Как вы обнаружили, вы можете избежать двойных кавычек с обратной косой чертой, т. е. \". Это позволяет вам иметь двойные кавычки в строке в двойных кавычках, т.е. "\"string\"", так что кавычки сохраняется программой, которой передан аргумент. Чтобы избежать побега, удвойте обратная косая черта, т. е. \\.

Вы получаете ошибку: 1 двойная кавычка удаляемой пары и сохраненная двойная кавычка сохраняется, поэтому оставшаяся двойная кавычка вызывает синтаксическую ошибку.

0
ответ дан michael_heath 16 January 2019 в 08:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: