我试图将powershell命令的输出转换为数组,但似乎无法正常工作。实际上我想用行和列索引来解决输出问题。 e.g。
$a=Get-Service
带输出(部分)
Status Name DisplayName
------ ---- -----------
Stopped AeLookupSvc Application Experience
Stopped ALG Application Layer Gateway Service
Stopped AppIDSvc Application Identity
Running Appinfo Application Information
Stopped AppMgmt Application Management
我想在第二行解决DisplayName,例如
$a[2][2]
它应该给予
Application Layer Gateway Service
但这似乎不起作用。
有人可以帮忙吗?
答案 0 :(得分:8)
这类问题让我觉得你可能来自Unix背景,习惯于不得不处理指标和列索引等等。
从根本上说,PowerShell是一种面向对象的脚本语言。你根本不需要做你在这里问的事。
例如,如果你想捕获结果,那么抓住其中一个对象的属性,这就是它的完成方式。
首先,捕获输出。
$a=Get-Service
现在,您需要特定实体的特定属性。为此,请索引到您想要的对象。
>$a[2]
Status Name DisplayName
------ ---- -----------
Stopped AJRouter AllJoyn Router Service
要选择.DisplayName
,您只需将其附加到上一个命令的末尾。
> $a[2].DisplayName
AllJoyn Router Service
如果要选择多个值,可以使用此方法。
#Select multiple values from one entity
$a[2] | select DisplayName, Status
>DisplayName Status
----------- ------
Application Layer Gateway Service Stopped
#Select multiple values from each in the array
$a | select DisplayName, Status
>DisplayName Status
----------- ------
Adobe Acrobat Update Service Running
AllJoyn Router Service Stopped
Application Layer Gateway Service Stopped
Application Identity Stopped
答案 1 :(得分:6)
如果没有从属性名称到数组索引的映射,这是不可能的。请注意,您在输出中看到的只是部分属性列表(在某个XML文件中定义)。因此,甚至没有一种简单的方法可以将它们转换为数组索引。
但是,我也不太了解您的需求。您可以按预期获得$a[1]
的第二项服务。然后,您可以使用DisplayName
获取其$a[1].DisplayName
属性值。 PowerShell始终使用对象。只是为了获取数据,根本不需要回退到文本解析或神秘列索引。这是一种更简单的方法。
答案 2 :(得分:3)
您在控制台中看到的Get-Service
输出可能看起来像一个数组(因为它在发送到控制台时被格式化为表格),但它实际上是一个'System.ServiceProcess.ServiceController'对象
您需要使用属性的名称来检索它,而不是使用行和列指定,因此对于您的示例:
$a[2].DisplayName
将返回Application Layer Gateway Service