PowerShell脚本调用PDFTK批量加密PDF时文件名含[]异常如何修复
问题修复方案
问题原因
PowerShell 中
[]属于通配符保留字符,默认传递路径时会被当作通配符规则解析,而非普通文件名的一部分,因此无法匹配到文件名包含[]的实际文件,最终导致文件被跳过。
修复要点
- 避免重复调用
Get-Item,直接使用Get-ChildItem返回的FileInfo对象自带的属性(FullName、Basename),不需要额外查询文件信息 - 调用外部程序
pdftk时,使用--%停止PowerShell的参数解析,避免特殊字符被错误解析 - 移除冗余的临时密码文件读写逻辑,直接使用生成的密码变量即可,同时避免可能的编码问题
- 补充:你当前输出的是逗号分隔的文本文件,后缀用
.xlsx是错误的,实际无法用Excel正常打开,建议修改后缀为.csv,如果需要生成标准xlsx文件可以额外调用ImportExcel等PowerShell模块实现
修复后完整代码
# 建议将后缀改为csv,符合逗号分隔文本的格式规范 $password_file = "output\passwords.csv" Remove-Item $password_file -ErrorAction Ignore # 遍历input目录下所有pdf文件,-LiteralPath参数避免路径中通配符被解析 Get-ChildItem -LiteralPath "input\*.pdf" | ForEach-Object { $inp_file = $_.FullName $out_file = "output\" + $_.Basename + ".pdf" # 生成16位随机密码 $password = -join ("!?@#$%^&0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz".ToCharArray() | Get-Random -Count 16) # 调用pdftk加密,--% 让后续参数原样传给外部程序,避免特殊字符解析问题 pdftk --% "$inp_file" output "$out_file" user_pw $password # 写入文件名和密码到记录文件 $record = $_.Basename + "," + $password Add-Content -Path $password_file -Value $record }
内容的提问来源于stack exchange,提问作者Akshay KB
相关产品推荐
相关产品推荐

