PowerShell 5.0中拼接字符串作为pdftk参数提示找不到文件如何解决?
问题根因
- PowerShell 调用外部可执行程序时采用参数数组传递逻辑,而非命令行字符串解析逻辑:你手动拼接的包含多个双引号文件名的完整字符串,会被 PowerShell 作为单个位置参数直接传给 pdftk,而非按引号拆分出多个独立的文件名参数。此时 pdftk 会把整个拼接后的带引号字符串当成一个单独的文件名查找,自然提示找不到文件。
- 你手动输出
$items_to_merge看起来格式正常,是因为 echo 只是输出字符串的字面内容,不会模拟外部程序的参数接收逻辑;你手动在终端敲入对应字符串能运行,是因为终端会对输入的命令行做原生参数拆分,和变量传递参数的逻辑完全不同。
正确实现方式
直接将 PDF 文件名作为数组传递给 pdftk 即可,PowerShell 会自动处理带空格文件名的转义,无需手动拼接引号:
# 获取当前目录所有PDF文件名数组 $pdf_list = (Get-ChildItem -Filter *.pdf).Name # 直接传递数组给pdftk,PowerShell自动处理参数拆分和转义 pdftk $pdf_list cat output test.pdf
如果确实需要使用拼接好的命令字符串调用,可使用停止解析符--%告知PowerShell不要解析后续内容,直接按原生命令行规则处理:
$items_to_merge = '"' + $((Get-ChildItem *.pdf).Name -join '" "') + '"' pdftk --% $items_to_merge cat output test.pdf
注意:停止解析符仅适用于 PowerShell 3.0 及以上版本,且不支持后续引用 PowerShell 变量,优先推荐数组传参的方案。
内容的提问来源于stack exchange,提问作者user32882
相关产品推荐
相关产品推荐

