2

假设我有以下 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 - 这可能吗?

4

3 回答 3

4

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

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
  }
}
于 2013-08-15T14:49:36.517 回答
2

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

为 Get-Process 返回的对象添加注释属性:

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
于 2013-08-15T15:27:45.630 回答
0

使用管道变量:

Get-CimInstance -ClassName Win32_Service -PipelineVariable service | 
Select @{Name="PID";Expression={$_.ProcessID}} |
Get-Process |
Select Name,CPU,@{Name='DisplayName';Expression={$service.DisplayName}}
于 2018-02-06T15:37:15.187 回答