如何将 Powershell 管道输出放入不支持管道输入(多个参数)的命令中?



我正试图使用Powershell获取一个过时的巧克力包列表,并将它们填充到choco upgrade命令中,该命令使用一个空格分隔的列表:choco upgrade <pkg> [<pkg2 <pkgN>]

如此之多的工作正如预期的那样获得和格式化列表:

PS C:WINDOWSsystem32> (choco outdated -r | %{$_.split('|')[0]}) -join ' '
google-drive-file-stream intel-dsa malwarebytes paint.net powertoys zoom

仅仅添加一个| choco upgrade是不可能的,因为它不接受管道输入。因此,我想插入管道的结果,就好像它是命令的参数一样,就好像我刚刚键入了这样的内容:
choco upgrade google-drive-file-stream intel-dsa malwarebytes paint.net powertoys zoom

这些是我最好的猜测:
(choco outdated -r | %{$_.split('|')[0]}) -join ' ' | %{choco upgrade $_}
choco upgrade ((choco outdated -r | %{$_.split('|')[0]}) -join ' ')
但他们似乎将整个列表作为一个参数插入,包括空格:

PS C:WINDOWSsystem32> choco upgrade ((choco outdated -r | %{$_.split('|')[0]} | Select-Object -skiplast 1) -join ' ')
Chocolatey v0.10.15
Upgrading the following packages:
google-drive-file-stream intel-dsa malwarebytes paint.net powertoys
By upgrading you accept licenses for the packages.
google-drive-file-stream intel-dsa malwarebytes paint.net powertoys is not installed. Installing...
google-drive-file-stream intel-dsa malwarebytes paint.net powertoys not installed. The package was not found with the source(s) listed.

如何插入所有这些值,就好像它们是单独的参数一样?

(我的目标是一句话。我对PS惯用的方法感兴趣,但任何有效的破解方法都有效。(

似乎(choco outdated -r | %{$_.split('|')[0]}) -join ' ')只是作为一个参数。

尽量避免调用表达式的问题

iex "choco upgrade $((choco outdated -r | %{$_.split('|')[0]}) -join ' ')"

注意:我已经成功地在我的计算机上使用了这个命令:

iex "choco upgrade $((choco outdated -r | %{ ($_ -split ".install||")[0] }) -join " ") -y"

以数组形式传递参数有效:

$myargs = '/i','hi'
echo Hi | findstr $myargs
Hi

因此,将第一个输出保留为数组:

choco upgrade (choco outdated -r | %{$_.split('|')[0]})

choco upgrade ((choco outdated -r) -replace '|.*')

最新更新