在命令行工具调用 powershell 5.0 中包含字符串连接命令的结果

Including result of string joining command in command line tool call powershell 5.0

我想使用 pdftk 命令行工具将字符串连接命令的结果作为调用的一部分。这是我尝试过的:

$items_to_merge = '"' + $($(get-childitem *.pdf).name -join '" "') + '"'

echo $items_to_merge
pdftk $items_to_merge cat output test.pdf

各个 pdf 文件名本身包含空格,因此我用双引号将每个文件名括起来。

然而事实证明,当我 运行 这个命令时,我得到 pdftk 错误如下:

Error: Unable to find file

我有点惊讶,因为手动枚举文件并用双引号引起来一直有效。为什么我以编程方式执行时会失败?

遇到这种情况invoke-expression是你的朋友:

$items_to_merge = '"' + $($(get-childitem *.pdf).name -join '" "') + '"'
echo $items_to_merge
invoke-expression "pdftk $items_to_merge cat output test.pdf"

让 PowerShell 对文件名进行引用。通过在变量名前使用 @ 而不是 $,PowerShell 将数组扩展为单独的参数(又名 array splatting),必要时将被引用。

$items_to_merge = (get-childitem *.pdf).name
pdftk @items_to_merge cat output test.pdf

正如评论者 js2010 所指出的,喷溅甚至没有必要。这也有效:

$items_to_merge = (get-childitem *.pdf).name
pdftk $items_to_merge cat output test.pdf

显然,PowerShell 在传递给 本机命令.

时隐式显示一个数组参数

就我个人而言,我仍然更喜欢显式展开,因为它始终适用于本机命令和 PowerShell 命令。

在 Windows 沙盒中,使用带有或不带有额外双引号的字符串数组,可以更简单地工作。我将一个网页打印成 pdf 来制作样本 pdf。

$items_to_merge = (get-childitem *.pdf).name

$items_to_merge
pdftk $items_to_merge cat output test.pdf

或使用通配符:

pdftk *.pdf cat output test.pdf