1

ローカルマシンとリモートマシンからサービスを取得するためのスクリプトを作成しています。ローカルマシンとリモートマシンの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...
4

3 に答える 3

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、関数から出力が得られることに注意してください。ループの反復ごとに1つのオブジェクトです。また、foreach反復変数はでしたが、コマンド$serviceでグローバルを参照していたことにも注意してください。$ServicesNew-Object

于 2012-04-06T15:31:16.223 に答える
0

Select-Objectにパイプすると、すでにPSObjectが取得されています。関数でオブジェクトを再作成する必要があると感じる理由がわかりません。WMI呼び出しが2つあるからといって、何の意味もありません。それぞれにパイプラインへの書き込みを依頼します。必要に応じて、各結果を配列に追加し、スクリプトの最後に配列をパイプラインに書き込みます。

If($ Servers -contains "localhost")
{{
   $ objServiceCol + = Get-WMIObject Win32_Service -ComputerName "localhost" | Select-Object SystemName、Name、StartMode、StartName、Status

}
そうしないと
{{
  $ objServiceCol + = Get-WMIObject Win32_Service -ComputerName $ computer -credential $ cred | Select-Object SystemName、Name、StartMode、StartName、Status

}
#最終結果をパイプラインに書き込む
$ objServiceCol
于 2012-04-09T20:02:04.643 に答える
0

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

次に、foreachの後で$objServiceCol、リストを取得してその内容をオブジェクト形式で吐き出すだけです。

于 2012-04-06T20:31:31.577 に答える