2012-04-06 2 views
1

Ich schreibe ein Skript, um Dienste von lokalen und Remote-Maschinen zu erhalten. Ich musste den WMI-Aufruf für lokale und Remote-Computer aufteilen (Remote-Computer erfordern unterschiedliche Anmeldeinformationen). Ich möchte sie als System.Object ausgeben. Wie erstelle ich eine Funktion für die Ausgabe von system.object?Powershell: Wie erstelle ich eine Funktion für die Ausgabe von system.object?

herer der Code ich habe bisher:

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

Antwort

3

In .NET System.Object die Wurzel der Vererbungshierarchie ist so jede Art können Sie die Ausgabe als System.Object behandelt werden. Sie könnten eine psobject Schaffung anstelle eines System.Object in der Schleife betrachten möchten (und zu vereinfachen, hat es):

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 } 
    } 
} 

Beachten Sie, dass die New-Object Ausgabe in eine Variable auf Grund nicht zuweisen es Ausgabe von der Funktion erhalten werden - ein Objekt für jede Iteration durch die Schleife. Beachten Sie auch, dass Ihre Foreach-Iterationsvariable $service war, aber Sie auf den globalen $Services in Ihrem New-Object-Befehl verwiesen haben.

+0

Dank der Code ist viel sauberer nach dem Befolgen Ihrer Empfehlungen :-) – resolver101

0

Uncomment #$objServiceCol += $objService und loswerden AddServiceObjects += $objService.

Dann, nach der foreach, tun Sie einfach $objServiceCol, um die Liste zu bekommen, um ihren Inhalt im Objektformat auszuspucken.

0

Wenn Sie eine Pipe zu Select-Object ausführen, erhalten Sie bereits ein PSObject. Ich verstehe nicht, warum Sie das Objekt in Ihrer Funktion neu erstellen müssen. Nur weil Sie zwei WMI-Anrufe haben, bedeutet das nichts. Habe jeden in die Pipeline schreiben lassen. Falls erforderlich, fügen Sie jedes Ergebnis zu Ihrem Array hinzu und schreiben Sie dann das Array in die Pipeline am Ende des Skripts.

 
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