Powershell:我如何为system.object的输出创建一个函数?

时间:2012-04-06 14:31:26

标签: function powershell powershell-v2.0

我正在编写一个脚本来从本地和远程计算机获取服务。我不得不拆分本地和远程机器的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...

3 个答案:

答案 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