PowerShell:Select 自定义表达式并在一次操作中展开

PowerShell: Select custom expression and expand in one operation

我可以做类似

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

将自定义表达式(在本例中为 $_ | Split-Path)select 转换为简单的值数组。

有没有办法将两个 select 语句合并为一个,仍然产生相同的结果?

你想做什么?仅使用 ls/Get-ChildItemSplit-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),它对输入对象集合中的每个项目执行操作。它类似于其他语言中的 mapSelect 操作。

所以代替:

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

你想要:

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

您也可以将 ForEach-Object 替换为 %。但对于新的 PowerShell 用户来说,它的可读性和可搜索性较差:

ls . `
| % { $_ | Split-Path }