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命令返回一个类型为 的对象ServiceController,这就是您可以查询名称和状态的原因。

当您将输出传递给 时Format-List,该命令会将对象转换为旨在显示信息的对象列表:如果您检查结果,Format-List您将看到它是一个主要包含FormatEntryData对象的混合数组。知道了这一点,很明显你在: 你不再有一个服务对象Status的输出上找不到这个属性了!Format-List

您可以通过运行这两个片段来查看差异,这将在结果中显示对象的类型:

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

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