Как правильно экранировать командную строку Windows, даже звездочку?

Как правильно экранировать командную строку Windows, даже звездочку?

Следуя хорошим (хотя иногда и противоречивым) советам, таким как Кавычки, экранированные символы, разделители - Windows CMD - SS64.comили Escape-символ – Википедия, раздел 2.6 Windows_Command_Promptили даже Командная оболочка Windows NT, я решил проблему экранирования примерно до 99%, но я все еще борюсь с последним битом. Мой вариант использования — указание аргументов пароля для расшифровки или шифрования файлов PDF в качестве параметров командной строки для qpdf.exe, поэтому специальные символы должны быть ожидаемы и приветствуются. Если возможно, я хотел бы иметь возможность использовать более или менеевсепечатные символы, причем ПРОБЕЛ (U+0020) является единственным пробельным символом.

Нет никакого дополнительного уровня косвенности, такого как передача аргументов между командами или вызов пакетного файла; все, что мне нужно создать, — это «прямую» команду для командной строки Windows.

Вот чего я добился на данный момент:

  • Вопреки тому, что упомянуто в ссылке SS64.com выше, COMMA(U+002C), SEMICOLON(U+003B) и EQUAL SIGN(U+003D) не представляют проблемы (по крайней мере, для моего варианта использования)
  • Простое помещение всего в QUOTATION MARKS(U+0022) с одновременным дублированием уже существующего QUOTATION MARKS(U+0022) не будет работать должным образом, поскольку это оставит проблемы, по крайней мере, с PERCENT SIGN(U+0025).
  • Также экранирование каретки само по себе не охватывает все. Нужно смешивать методы

Итак, вот как я действую на данный момент:

  1. Двойные кавычки QUOTATION MARKтолько «локально», т.е. замените любой U+0022 на U+0022 U+0022 U+0022 U+0022
  2. Кавычки SPACEтолько «локальные», т.е. замените U+0020 на U+0022 U+0020 U+0022
  3. Экранирование самой каретки, т.е. замена U+005E на U+005E U+005E
  4. Экранируйте оставшиеся специальные символы (перечисленные в связанных статьях), например, xв LESS-THAN SIGN(U+003C), GREATER-THAN SIGN(U+003E), AMPERSAND(U+0026), VERTICAL LINE(U+007C), LEFT PARENTHESIS(U+0028), RIGHT PARENTHESIS(U+0029) замените все вхождения на xU+005E x.
  5. Кроме того, по-видимому, необходимо экранировать PERCENT SIGN, т.е. заменить каждый U+0025 на U+005E U+0025

Таким образом, чтобы указать пароль, такой какHello %TEMP%>"&abc, я бы закончил с

C:\path\to\qpdf.exe --encrypt Привет" "^%TEMP^%^>""""^&abc someownerpassword 256 -- input.pdf output.pdf

Это работает нормально, т.е. пароль, который мне нужно ввести в диалоговом окне пароля при открытии output.pdf, действительноHello %TEMP%>"&abc

Есть только один (пока) злой символ, который бросает вызов всем моим попыткам избежать его: ASTERISK(U+0042)! Никакие кавычки, удвоения, экранирование кареткой (или другие экранирующие символы, которые я пробовал наугад) не работают для него — он всегда будет пытаться "глобировать". В некоторых случаях может повезти, если ни один файл не соответствует глобированию, но мне определенно нужно спросить ...

Вопрос.Как бы мне избежать желаемого пароля, например*.*(U+0042 U+002E U+0042) и предотвратить его подстановку?

Связанный контент