这是我到目前为止的代码:
$objServicecol = @()
# how do i get AddService object back
Function AddServiceObjects
{
ForEach ($Service in $Services)
{
$objService = New-Object System.Object
$objService | Add-Member -MemberType NoteProperty -Name SystemName -Value $Services.SystemName
$objService | Add-Member -MemberType NoteProperty -Name Name -Value $Services.Name
$objService | Add-Member -MemberType NoteProperty -Name StartMode -Value $Services.StartMode
$objService | Add-Member -MemberType NoteProperty -Name StartName -Value $Services.StartName
$objService | Add-Member -MemberType NoteProperty -Name Status -Value $Services.Status
#$objServiceCol += $objService
AddServiceObjects += $objService
}
}
# Executes local WMI
If ($Servers -contains "localhost")
{
$Services = Get-WMIObject Win32_Service -ComputerName "localhost" | Select-Object SystemName, Name, StartMode, StartName, Status
AddServiceObjects $Services
}
...#execute remote wmi...
答案 0 :(得分:3)
在.NET中,System.Object是继承层次结构的根,因此您输出的任何类型都可以视为System.Object。您可能需要考虑在循环中创建psobject
而不是System.Object
(并简化它):
Function AddServiceObjects($Services)
{
ForEach ($service in $Services)
{
New-Object psobject -Property @{
SystemName = $service.SystemName
Name = $service.Name
StartMode = $service.StartMode
StartName = $service.StartName
Status = $service.Status }
}
}
请注意,由于没有将New-Object
输出分配给变量,它将从函数中获得输出 - 通过循环的每次迭代都有一个对象。另请注意,您的foreach迭代变量为$service
,但您在$Services
命令中引用了全局New-Object
。
答案 1 :(得分:0)
取消注释#$objServiceCol += $objService
并摆脱AddServiceObjects += $objService
。
然后,在foreach之后,只需执行$objServiceCol
以获取列表以对象格式吐出其内容。
答案 2 :(得分:0)
当您管道到Select-Object时,您已经获得了PSObject。我不明白为什么你觉得需要在你的函数中重新创建对象。仅仅因为你有两个WMI调用并不意味着什么。让每个人写入管道。如果需要,将每个结果添加到数组中,然后将数组写入脚本末尾的管道。
If ($Servers -contains "localhost") { $objServiceCol+= Get-WMIObject Win32_Service -ComputerName "localhost" | Select-Object SystemName, Name, StartMode, StartName, Status } else { $objServiceCol+= Get-WMIObject Win32_Service -ComputerName $computer -credential $cred | Select-Object SystemName, Name, StartMode, StartName, Status } #write final results to the pipeline $objServiceCol