Как я могу поместить вывод конвейера Powershell в команду, которая не поддерживает ввод конвейера (несколько аргументов)? - PullRequest
0 голосов
/ 06 августа 2020

Я пытаюсь использовать Powershell, чтобы взять список устаревших шоколадных пакетов и вставить их в команду choco upgrade, которая принимает список, разделенный пробелами: choco upgrade <pkg> [<pkg2 <pkgN>].

Это работает как ожидается получение и форматирование списка:

PS C:\WINDOWS\system32> (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:\WINDOWS\system32> 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-idiomati c, но любой хак, который работает, работает.)

Ответы [ 2 ]

1 голос
/ 07 августа 2020

Передача аргументов в виде массива работает:

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

Hi

Итак, сохранение первого вывода в виде массива:

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

Или

choco upgrade ((choco outdated -r) -replace '\|.*')
1 голос
/ 07 августа 2020

Кажется, что (choco outdated -r | %{$_.split('|')[0]}) -join ' ') принимается только как один параметр.

Попытайтесь избежать проблемы с invoke-Expression:

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

Примечание: я успешно использовал эту команду на своем компьютер:

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