2012-04-06 72 views
1

即时编写脚本以从本地和远程机器获取服务。我必须拆分本地和远程机器的wmi调用(远程机器需要不同的凭据)。我想输出它们作为System.Object。我如何为system.object的输出创建一个函数?Powershell:我如何为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

在.NET,System.Object的是继承层次结构,所以任何类型你输出可以被视为一个System.Object的根。您可能要考虑创建一个psobject,而不是在你的循环一个System.Object(和简化IT):

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,但您的New-Object命令中引用了全局$Services

+0

感谢下面的建议后代码更清洁:-) – resolver101 2012-04-06 20:31:48

0

取消注释#$objServiceCol += $objService,摆脱AddServiceObjects += $objService

然后,在foreach之后,只需执行$objServiceCol即可获取列表以对象格式吐出其内容。

0

当你管选择 - 对象你已经得到一个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 
相关问题