在PowerShell中将对象属性组合到一个对象中

时间:2015-10-28 00:19:49

标签: powershell

我正在尝试将多个对象属性组合到一个对象中。

如果我有以下代码,则会合并对象属性。

$computer = gwmi win32_computersystem | select numberOfProcessors, NumberOfLogicalProcessors, HypervisorPresent

$osInfo = gwmi win32_operatingsystem | select version, caption, serialnumber, osarchitecture

Foreach($p in Get-Member -InputObject $osInfo -MemberType NoteProperty)
{

 Add-Member -InputObject $computer -MemberType NoteProperty  -Name $p.Name -Value $osInfo.$($p.Name) -Force

}

$computer

但是,如果我用

替换上面的计算机 osInfo 变量
$computer = Get-Process | Select processname, path
$osInfo = Get-Service | Select name, status

然后{for}循环执行后,$computer变量没有$osInfo变量的属性。即:第二个对象不与第一个对象组合。

2 个答案:

答案 0 :(得分:0)

原始代码处理cmdlet,它返回与同一源相关的两个单个对象。

您正在尝试将其与返回多个对象数组的cmdlet一起使用。

以下基本上合并了两个数组。

$computer = 'Server01'

$collection = @()

$services = Get-Service | Select name, status

$processes = Get-Process | Select processname, path

foreach ($service in $services) {
    $collection += [pscustomobject] @{
        ServiceName   = $service.name
        ServiceStatus = $service.status
        ProcessName   = ""
        ProcessPath   = ""
    }
}

foreach ($process in $processes) {
    $collection += [pscustomobject] @{
        ServiceName   = ""
        ServiceStatus = ""
        ProcessName   = $process.processname
        ProcessPath   = $process.path
    }
}

$collection

就个人而言,我只需使用$services$processes两行即可。

答案 1 :(得分:0)

您的问题来自于集合中Get_Member的错误使用。

Get-Member -InputObject ACollection给出了该集合的成员。

ACollection | Get-Member给出集合中每个元素的成员。

所以在你的情况下,它将适用于:

Foreach($p in ($osInfo | Get-Member  -MemberType NoteProperty))
{
}

<强>被修改

$computer也是à集合,所以你期待什么。我添加了我认为你期望的代码。

$processes = Get-Process | Select processname, path, Id

Foreach($p in $processes)
{
 $services = Get-WmiObject "Win32_Service" -filter "ProcessId=$($p.Id)"
 Add-Member -InputObject $p -MemberType NoteProperty  -Name "Services" -Value $(($services | % {$_.name}) -join ',') -Force
}

$processes