如何在 Windows 指令 shell 中正確轉義 - 甚至是星號?

如何在 Windows 指令 shell 中正確轉義 - 甚至是星號?

透過遵循好的(儘管有時是相互矛盾的)建議,例如 引號、轉義字元、分隔符號 - Windows CMD - SS64.com或者 轉義字元 – 維基百科,第 2.6 節 Windows_Command_Prompt甚至 Windows NT 命令外殼,我解決了99%左右的越獄問題,但最後一點還在掙扎。我的用例是將用於解密或加密 pdf 檔案的密碼參數指定為 的命令列參數qpdf.exe,因此歡迎使用特殊字元。如果可能的話,我希望能夠使用更多或更少全部可列印字符,其中 SPACE (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. Caret-轉義插入符本身,即以 U+005E U+005E 取代 U+005E
  4. 插入符轉義剩餘的特殊字元(如連結文章中所列的),即 for xin 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+005E x
  5. 另外,似乎有必要對插入符進行轉義PERCENT SIGN,將每個 U+0025 替換為 U+005E U+0025

因此要指定一個密碼,例如Hello %TEMP%>"&abc,我最終會得到

C:\path\to\qpdf.exe --encrypt Hello" "^%TEMP^%^>""""^&abc someownerpassword 256 -- input.pdf output.pdf

這工作正常,即打開output.pdf時我需要在密碼對話框視窗中輸入的密碼確實是Hello %TEMP%>"&abc

只有一個(到目前為止)邪惡角色無法阻止我所有逃離它的嘗試:ASTERISK(U+0042)!引用、重複、脫字符轉義(或我隨機嘗試的其他轉義字符)都不適用於它——它總是會嘗試“通配符”。在某些情況下,如果沒有文件與全局匹配,人們可能會很幸運,但我絕對需要問...

問題。我如何轉義所需的密碼,例如*.*(U+0042 U+002E U+0042) 並防止它通配?

相關內容