Durch Befolgen guter (wenn auch manchmal widersprüchlicher) Ratschläge wie
Anführungszeichen, Escape-Zeichen, Trennzeichen - Windows CMD - SS64.comoder
Escape-Zeichen – Wikipedia, Abschnitt 2.6 Windows_Command_Promptoder auch
Die Windows NT-Eingabeaufforderung, ich habe das Problem des Escapens zu etwa 99 % gelöst, aber mit dem letzten Teil kämpfe ich immer noch. Mein Anwendungsfall ist die Angabe der Passwortargumente zum Entschlüsseln oder Verschlüsseln von PDF-Dateien als Befehlszeilenparameter an qpdf.exe
, daher sind Sonderzeichen zu erwarten und willkommen. Wenn möglich, würde ich gerne mehr oder weniger verwenden könnenalledruckbare Zeichen, mit dem Leerzeichen (U+0020) als einzigem Leerzeichen.
Es gibt keine zusätzliche Indirektionsebene, wie etwa das Weiterleiten der Argumente zwischen Befehlen oder das Aufrufen einer Batchdatei. Alles, was ich erzeugen muss, ist der „direkte“ Befehl für die Windows-Befehlszeile.
So weit bin ich bisher gekommen:
- Im Gegensatz zu dem, was im obigen SS64.com-Link erwähnt wird, stellen
COMMA
(U+002C),SEMICOLON
(U+003B) undEQUAL SIGN
(U+003D) kein Problem dar (zumindest für meinen Anwendungsfall). - Einfach alles in
QUOTATION MARKS
(U+0022) einzufügen und dabei das bereits vorhandeneQUOTATION MARKS
(U+0022) zu verdoppeln, funktioniert nicht richtig, da es zumindest mitPERCENT SIGN
(U+0025) zu Problemen kommt. - Auch das alleinige Verwenden von Cursor-Escapes deckt nicht alles ab. Man muss die Methoden mischen
So gehe ich bisher vor:
- Setzen Sie nur "lokal" doppelte Anführungszeichen
QUOTATION MARK
, d. h. ersetzen Sie jedes U+0022 durch U+0022 U+0022 U+0022 U+0022 - Zitieren Sie alle
SPACE
nur "lokal", d. h. ersetzen Sie U+0020 durch U+0022 U+0020 U+0022 - Cursor-Escape für den Cursor selbst, d. h. ersetzen Sie U+005E durch U+005E U+005E
- Mit dem Caret-Zeichen werden die verbleibenden Sonderzeichen (wie in den verknüpften Artikeln aufgeführt) maskiert, d. h.
x
inLESS-THAN SIGN
(U+003C),GREATER-THAN SIGN
(U+003E),AMPERSAND
(U+0026),VERTICAL LINE
(U+007C), (LEFT PARENTHESIS
U+0028),RIGHT PARENTHESIS
(U+0029) wird jedes Vorkommen vonx
durch U+005E ersetztx
. - Darüber hinaus scheint es notwendig zu sein, das mit einem Caretzeichen zu maskieren
PERCENT SIGN
, d. h. jedes U+0025 durch U+005E U+0025 zu ersetzen.
Geben Sie daher ein Passwort wieHello %TEMP%>"&abc
, ich würde am Ende haben
C:\Pfad\zu\qpdf.exe --encrypt Hallo" "^%TEMP^%^>""""^&abc someownerpassword 256 -- Eingabe.pdf Ausgabe.pdf
Das funktioniert einwandfrei, d.h. das Passwort, das ich beim Öffnen von output.pdf im Passwort-Dialogfenster eingeben muss, ist tatsächlichHello %TEMP%>"&abc
Es gibt nur ein (bisher) böses Zeichen, das sich all meinen Versuchen, ihm zu entkommen, widersetzt: ASTERISK
(U+0042)! Keine Anführungszeichen, Verdoppelungen, Caret-Escapes (oder andere Escape-Zeichen, die ich zufällig ausprobiert habe) funktionieren dagegen – es wird immer versuchen, einen „Glob“ zu verwenden. In manchen Fällen kann man Glück haben, wenn keine Dateien mit dem Glob übereinstimmen, aber ich muss definitiv einen … fragen.
Frage.Wie kann ich ein gewünschtes Passwort umgehen, wie z. B.*.*
(U+0042 U+002E U+0042) und verhindern, dass es globuliert wird?