2
PowerShell psh = PowerShell.Create();
//psh.AddScript("Get-Service | Format-List -Property Name, Status");
psh.AddScript("Get-Service");

Collection<PSObject> result = psh.Invoke();

foreach (PSObject msg in result)
{
    Console.WriteLine(msg.Properties["Name"].Value);
}

上記の例では、「Get-Service」を単独で使用すると、システム上のサービスの名前とステータスを取得できます。しかし、「Get-Service | Format-List -Property Name, Status」で同じものを使用すると、例外が発生します。

4

1 に答える 1

5

PowerShell でコマンドを実行すると、通常、結果は CLR オブジェクトとして返されます。したがって、Get-Serviceコマンドは type のオブジェクトを返しますServiceController。これが、名前とステータスを照会できる理由です。

出力を に渡すとFormat-List、そのコマンドはオブジェクトを情報の表示用に設計されたオブジェクトのリストに変換します。 の結果を調べると、ほとんどがオブジェクトFormat-Listを含む混合配列であることがわかります。これを知っていると、 の出力でプロパティをFormatEntryData見つけることができないことは明らかです: サービス オブジェクトはもうありません!StatusFormat-List

これらの 2 つのスニペットを実行すると、結果にオブジェクトのタイプが表示され、違いがわかります。

Get-Service | % { $_.GetType().FullName }

Get-Service | Format-List | % { $_.GetType().FullName }
于 2013-05-23T08:01:24.853 に答える