2012-04-06 70 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 
相關問題