如何将PowerShell cmdlet输出的属性传递到另一个cmdlet的输入中?

时间:2017-04-20 20:04:00

标签: powershell pipeline

具体用例是:

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

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

3 个答案:

答案 0 :(得分:3)

-Id参数接受按属性名称输入的管道,因此您必须添加另一个具有包含PID的正确名称的属性。尽管可能,我通常只使用直接路线:

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

答案 1 :(得分:3)

我可以在这里看到几个选项。首先,也是最简单的,您可以将其传递给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

答案 2 :(得分:2)

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

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

由于Get-Process希望匹配管道变量属性PID,我们只需使用计算属性来为其提供所需的内容。

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