Windows命令行中如何正确转义含星号的特殊字符以传递PDF加解密密码
Windows命令行中如何正确转义含星号的特殊字符以传递PDF加解密密码
兄弟,我太懂你这种卡在最后一个特殊字符的痛苦了!星号(*)确实是Windows CMD里的刺头,尤其是它自带的通配符匹配(glob)特性,总在你不想它生效的时候搞事情。不过别慌,咱们换个思路就能搞定——
核心解决思路:用完整双引号包裹密码参数
CMD的通配符(*、?)只会对未被双引号完整包裹的内容进行展开,所以只要把整个密码参数用一对双引号括起来,就能直接避免星号被glob解析。结合你已经摸索出来的其他转义规则,调整后的完整转义逻辑如下:
- 把整个密码放在一对双引号
"中,让CMD把整个内容当作单个参数 - 密码内部原本的双引号
"替换为两个双引号""(这是CMD中在引号内部转义双引号的标准方式) - 密码内部的百分号
%替换为^%(因为CMD会优先解析环境变量,即使在引号内也不例外,必须用脱字符转义) - 其他特殊字符(
<、>、&、|、(、)、^)在双引号内部不需要额外转义,CMD会按字面传递给qpdf
举个例子:你之前的测试密码
比如你之前用的测试密码Hello %TEMP%>"&abc,用这个方法处理后,命令会变成:
C:\path\to\qpdf.exe --encrypt "Hello ^%TEMP^%>""&abc" someownerpassword 256 -- input.pdf output.pdf
这样qpdf收到的密码就是你需要的Hello %TEMP%>"&abc,完全没问题。
针对星号密码的具体处理
如果你的目标密码是*.*,直接用双引号包裹即可,不需要额外操作:
C:\path\to\qpdf.exe --encrypt "*.*" someownerpassword 256 -- input.pdf output.pdf
这个命令里,*.*被完整包裹在双引号中,CMD不会把它当作通配符去匹配文件,qpdf会准确接收到*.*作为密码。
为什么你之前的方法对星号无效?
你之前采用的是“局部引号”(比如把空格替换为" "),这种方式会让星号处于未被引号完整包裹的片段中,CMD仍然会对这些片段执行通配符匹配。而完整包裹整个参数后,整个密码都处于引号的保护范围内,glob规则就彻底失效了。
额外验证:混合多种特殊字符的密码
如果密码是*Pa$$w0rd">%TEMP%&这种混合了星号、双引号、百分号和&的复杂内容,处理后的命令是:
C:\path\to\qpdf.exe --encrypt "*Pa$$w0rd"">^%TEMP^%&" someownerpassword 256 -- input.pdf output.pdf
这里只需要把内部的"替换为"",%替换为^%,其他特殊字符(包括*、&、>)都直接放在引号内,CMD会原样传递给qpdf,完全符合你的需求。
备注:内容来源于stack exchange,提问作者Hagen von Eitzen




