假设我有以下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 - 这可能吗?
答案 0 :(得分: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
}
}
答案 1 :(得分: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
答案 2 :(得分:0)
使用管道变量:
Get-CimInstance -ClassName Win32_Service -PipelineVariable service |
Select @{Name="PID";Expression={$_.ProcessID}} |
Get-Process |
Select Name,CPU,@{Name='DisplayName';Expression={$service.DisplayName}}