PowerShell: выберите пользовательское выражение и разверните за одну операцию

Я могу сделать что-то вроде

ls . `
| select @{ Name="Dir"; Expression = { $_ | Split-Path } } `
| select -ExpandProperty Dir

выбрать пользовательское выражение (в этом случае $_ | Split-Path) в простой массив значений.

Есть ли способ объединить два оператора выбора в один, который все еще дает эквивалентные результаты?

1 ответ

Решение

Что ты пытаешься сделать? Вы можете получить те же результаты только с ls/Get-ChildItem а также Split-Path, Не уверен, если вам нужно Microsoft.PowerShell.Core\FileSystem:: часть.

PS C:\Path\To\Dir> Get-ChildItem | Split-Path
Microsoft.PowerShell.Core\FileSystem::C:\Path\To\Dir
Microsoft.PowerShell.Core\FileSystem::C:\Path\To\Dir
Microsoft.PowerShell.Core\FileSystem::C:\Path\To\Dir

PS C:\Path\To\Dir> (Get-ChildItem).FullName | Split-Path
C:\Path\To\Dir
C:\Path\To\Dir
C:\Path\To\Dir

редактировать

Если предположить, nuget list <my-package> выводит массив строк, вы можете использовать -replace и регулярное выражение ($ чтобы соответствовать концу строки) манипулировать им и получить массив результатов.

$((nuget list <my-package>).Replace(" ",",") -replace "$",".nupkg")

Я думаю, что OP ищет ForEach-Object(MSDN), который выполняет операцию с каждым элементом в коллекции входных объектов. Это похоже наmap или Select работа на других языках.

Так что вместо:

ls . `
| select @{ Name="Dir"; Expression = { $_ | Split-Path } } `
| select -ExpandProperty Dir

Вы хотите:

ls . `
| ForEach-Object { $_ | Split-Path }

Вы также можете заменить ForEach-Object с %. Но он менее читабелен и менее доступен для поиска новым пользователям PowerShell:

ls . `
| % { $_ | Split-Path }
Другие вопросы по тегам