1

我正在编写一个脚本来从本地和远程机器获取服务。我不得不将 wmi 调用拆分为本地和远程机器(远程机器需要不同的凭据)。我想将它们输出为 System.Object。如何为 system.object 的输出创建函数?

这是我到目前为止的代码:

$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...
4

3 回答 3

3

在 .NET 中,System.Object 是继承层次结构的根,因此您输出的任何类型都可以视为 System.Object。您可能需要考虑在循环中创建 apsobject而不是 a (并简化它):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中引用了全局变量。$ServicesNew-Object

于 2012-04-06T15:31:16.223 回答
0

当您通过管道传输到 Select-Object 时,您已经获得了一个 PSObject。我不明白为什么你觉得需要在你的函数中重新创建对象。仅仅因为您有两个 WMI 调用并不意味着什么。让每个人都写入管道。如果需要,将每个结果添加到数组中,然后在脚本末尾将数组写入管道。

如果($Servers - 包含“本地主机”)
{
   $objServiceCol+= Get-WMIObject Win32_Service -ComputerName "localhost" | 选择对象 SystemName、名称、StartMode、StartName、状态

}
别的
{
  $objServiceCol+= Get-WMIObject Win32_Service -ComputerName $computer -credential $cred | 选择对象 SystemName、名称、StartMode、StartName、状态

}
#将最终结果写入管道
$objServiceCol
于 2012-04-09T20:02:04.643 回答
0

取消注释#$objServiceCol += $objService并删除AddServiceObjects += $objService.

然后,在 foreach 之后,只需$objServiceCol让列表以对象格式吐出其内容。

于 2012-04-06T20:31:31.577 回答