【问题标题】:How do I pipe a property of a PowerShell cmdlet output into an input of a different cmdlet?如何将 PowerShell cmdlet 输出的属性通过管道传输到不同 cmdlet 的输入?
【发布时间】:2017-04-21 04:18:57
【问题描述】:

具体用例是:

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

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

【问题讨论】:

    标签: powershell pipeline


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      我可以看到这里有几个选项。首先,也是最简单的,您可以将其通过管道传输到 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
      

      【讨论】:

        【解决方案3】:

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

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

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-01-24
          相关资源
          最近更新 更多