如何将powershell命令的输出转换为数组

时间:2017-01-11 12:53:33

标签: arrays powershell

我试图将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

但这似乎不起作用。

有人可以帮忙吗?

3 个答案:

答案 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