2012-04-06 10 views
1

ローカルとリモートのマシンからサービスを取得するスクリプトを作成しています。私は、ローカルマシンとリモートマシン(リモートマシンは異なる資格情報を必要とする)のためにwmiコールを分割しなければなりませんでした。私はそれらをSystem.Objectとして出力したい。どのように私はsystem.objectの出力のための関数を作成するのですか?Powershell:system.objectの出力用の関数を作成するにはどうすればよいですか?

HERESに私はこれまで持っているコード:.NETで

$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

、System.Objectのはそう、あなたの出力はSystem.Objectのとして扱うことができる任意の型の継承階層のルートです。あなたはpsobjectの代わりに、あなたのループでSystem.Objectを(と、それを簡素化)作成を検討することをお勧めします:変数にNew-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 } 
    } 
} 

注 - 1ループを通るすべての反復のためのオブジェクト。 foreach反復変数は$serviceでしたが、New-Objectコマンドのグローバル$Servicesを参照していました。

+0

ありがとうございましたコードは、あなたの推奨事項に従ってください:-) – resolver101

0

#$objServiceCol += $objServiceのコメントを外してAddServiceObjects += $objServiceを削除します。

foreachの後に、$objServiceColを実行すると、その内容をオブジェクト形式で吐き出すことができます。

0

Select-Objectにパイプすると、既にPSObjectが取得されています。私はなぜあなたがあなたの機能にオブジェクトを再作成する必要があると感じているのか分かりません。 2つの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 
関連する問題