You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动