Следуя хорошим (хотя иногда и противоречивым) советам, таким как
Кавычки, экранированные символы, разделители - 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). - Также экранирование каретки само по себе не охватывает все. Нужно смешивать методы
Итак, вот как я действую на данный момент:
- Двойные кавычки
QUOTATION MARK
только «локально», т.е. замените любой U+0022 на U+0022 U+0022 U+0022 U+0022 - Кавычки
SPACE
только «локальные», т.е. замените U+0020 на U+0022 U+0020 U+0022 - Экранирование самой каретки, т.е. замена U+005E на U+005E U+005E
- Экранируйте оставшиеся специальные символы (перечисленные в связанных статьях), например,
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) замените все вхождения наx
U+005Ex
. - Кроме того, по-видимому, необходимо экранировать
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) и предотвратить его подстановку?