如何将 PowerShell cmdlet 输出的 属性 通过管道传输到不同 cmdlet 的输入中?

How do I pipe a property of a PowerShell cmdlet output into an input of a different cmdlet?

具体用例为:

Get-NetTCPConnection -State Listen -LocalPort 6005 |
    Get-Process -PID ???

其中 ??? 是第一个 cmdlet 输出的 OwningProcess 属性。

-Id 参数通过 属性 名称接受管道输入,因此您必须添加另一个 属性 并使用包含 PID 的正确名称。虽然可能,但我通常只使用直接路由:

Get-NetTCPConnection | ForEach-Object { Get-Process -Id $_.OwningProcess }

有几种方法可以做到这一点。当 属性 无法匹配变量时,您可以像 中那样使用 ForEach-Object 循环,或者如果您想做一些疯狂的事情,您可以定制管道对象以满足需要。

Get-NetTCPConnection -State Listen -LocalPort 6005 |
    Select-Object @{Name="PID";E={$_.OwningProcess}} | 
    Get-Process 

因为 Get-Process 正在寻找匹配管道变量 属性 PID,我们只使用计算的 属性 来满足它的需要。

在这种情况下使用ForEach-Object要简单得多。只是想让你知道还有另一种方法。

我可以看到你在这里有几个选项。首先,也是最简单的,您可以将其通过管道传输到 ForEach-Object 循环,然后 运行 Get-Process 在其中:

Get-NetTCPConnection -State Listen -LocalPort 6005 | 
    ForEach-Object {
        Get-Process -PID $_.OwningProcess
    }

或者,如果您 运行 Get-Help Get-Process -PArameter Id 您可以看到 Id 参数通过 属性 名称接受来自管道的值,因此您可以创建该 属性,并且直接通过管道传输到 Get-Process:

Get-NetTCPConnection -State Listen -LocalPort 6005 | 
    Select @{l='Id';e={$_.OwningProcess}} |
    Get-Process