【问题标题】:Select-Object with output from 2 cmdlets具有 2 个 cmdlet 输出的 Select-Object
【发布时间】:2018-02-07 02:49:58
【问题描述】:

假设我有以下 PowerShell 脚本:

Get-WmiObject -Class Win32_Service | 
Select DisplayName,@{Name="PID";Expression={$_.ProcessID}} |
Get-Process |
Select Name,CPU

这将:

第 1 行:获取本地机器上的所有服务

第 2 行:使用 DisplayName 和 PID 创建一个新对象。

第 3 行:调用 Get-Process 以获取有关每个服务的信息。

第 4 行:使用进程名称和 CPU 使用情况创建一个新对象。

但是,在第 4 行中,我还想拥有在第 2 行中获得的 DisplayName - 这可能吗?

【问题讨论】:

    标签: powershell pipeline


    【解决方案1】:

    一种方法是在收集所需的属性后输出自定义对象。示例:

    Get-WmiObject -Class Win32_Service | foreach-object {
      $displayName = $_.DisplayName
      $processID = $_.ProcessID
      $process = Get-Process -Id $processID
      new-object PSObject -property @{
        "DisplayName" = $displayName
        "Name" = $process.Name
        "CPU" = $process.CPU
      }
    }
    

    【讨论】:

      【解决方案2】:

      实现此目的的其他几种方法:

      给Get-Process返回的对象添加note属性:

      Get-WmiObject -Class Win32_Service | 
      Select DisplayName,@{Name="PID";Expression={$_.ProcessID}} |
      % {
          $displayName = $_.DisplayName;
          $gp = Get-Process;
          $gp | Add-Member -type NoteProperty -name DisplayName -value $displayName;
          Write-Output $gp
      } |
      Select DisplayName, Name,CPU
      

      在管道中的某一点设置脚本范围变量,并在管道中的稍后位置使用它:

      Get-WmiObject -Class Win32_Service | 
      Select @{n='DisplayName';e={($script:displayName =  $_.DisplayName)}},
             @{Name="PID";Expression={$_.ProcessID}} |
      Get-Process |
      Select @{n='DisplayName';e={$script:displayName}}, Name,CPU
      

      【讨论】:

      • note 属性+1 - 我认为在处理已经有很多您感兴趣的属性的对象时会更优雅。
      【解决方案3】:

      使用管道变量:

      Get-CimInstance -ClassName Win32_Service -PipelineVariable service | 
      Select @{Name="PID";Expression={$_.ProcessID}} |
      Get-Process |
      Select Name,CPU,@{Name='DisplayName';Expression={$service.DisplayName}}
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-07-11
        • 2017-12-16
        • 2020-07-02
        • 2020-01-24
        • 1970-01-01
        • 2013-08-29
        • 1970-01-01
        相关资源
        最近更新 更多