我正在尝试将多个对象属性组合到一个对象中。
如果我有以下代码,则会合并对象属性。
$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
变量的属性。即:第二个对象不与第一个对象组合。
答案 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