如何在 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. 插入符号 - 转义插入符号本身,例如,将 U+005E 替换为 U+005E U+005E
  4. 插入符号转义其余特殊字符(如链接文章中所列),即,对于xLESS-THAN SIGNU+003C)、GREATER-THAN SIGN(U+003E)、AMPERSAND(U+0026)、VERTICAL LINE(U+007C)、LEFT PARENTHESIS(U+0028)、 (U+0029)中的字符,用 U+005ERIGHT PARENTHESIS替换任何出现的字符。xx
  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)并防止其通配?

相关内容