Проблема с командой Forfiles / P (не задокументирована?) - PullRequest
0 голосов
/ 16 января 2019

У меня есть сценарий:

FORFILES /P "C:\users\DominiqueGerry\Work Files\" /S /M *.doc /C "cmd /c echo @fsize"

выдает ошибку:

ОШИБКА: неверный аргумент / опция -'@fsize'.

Тип "FORFILES /?" для использования.

Но когда я удаляю косую черту, она работает:

FORFILES /P "C:\users\DominiqueGerry\Work Files" /S /M *.doc /C "cmd /c echo @fsize"

Я не понимаю, почему это не работает без обратной косой черты, но не работает с ней. Я не могу найти официальную документацию, объясняющую это. и даже не вижу ничего упомянутого при запуске help forfiles /? Буду признателен за любую помощь по этому вопросу.

Лучшая часть. Ошибка даже не связана с рассматриваемой проблемой.

Ответы [ 2 ]

0 голосов
/ 16 января 2019

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

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

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

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

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

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

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

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

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

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

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

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

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

0 голосов
/ 16 января 2019

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

Причина, по которой ошибка не связана, заключается просто в том, что команда 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"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...