【发布时间】:2017-04-21 04:18:57
【问题描述】:
具体用例是:
Get-NetTCPConnection -State Listen -LocalPort 6005 |
Get-Process -PID ???
其中??? 是第一个cmdlet 输出的OwningProcess 属性。
【问题讨论】:
标签: powershell pipeline
具体用例是:
Get-NetTCPConnection -State Listen -LocalPort 6005 |
Get-Process -PID ???
其中??? 是第一个cmdlet 输出的OwningProcess 属性。
【问题讨论】:
标签: powershell pipeline
-Id 参数接受按属性名称输入的管道,因此您必须添加另一个具有正确名称且包含 PID 的属性。虽然可能,我通常只使用直接路线:
Get-NetTCPConnection | ForEach-Object { Get-Process -Id $_.OwningProcess }
【讨论】:
我可以看到这里有几个选项。首先,也是最简单的,您可以将其通过管道传输到 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
【讨论】:
有几种方法可以做到这一点。当变量无法通过属性匹配时,您可以使用 ForEach-Object 循环(如 Joey's answer),或者如果您想做一些疯狂的事情,您可以定制管道对象以满足需求。
Get-NetTCPConnection -State Listen -LocalPort 6005 |
Select-Object @{Name="PID";E={$_.OwningProcess}} |
Get-Process
由于 Get-Process 正在寻找匹配管道变量属性 PID,我们只需使用计算属性来为其提供所需的内容。
在这种情况下使用ForEach-Object 要简单得多。只是想让你知道还有另一种方法。
【讨论】: