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

9

我正在尝试将powershell命令的输出存入一个数组,但似乎不起作用。实际上,我想使用行和列索引来访问输出。 例如:

$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

但这似乎没有起作用。 有人能帮忙吗?
4个回答

23

这种类型的问题让我想到您可能来自Unix背景,并习惯于处理索引和列索引之类的东西。

基本上,PowerShell是一种面向对象的脚本语言。在这里,您根本不需要做您所问的事情。

例如,如果您想要捕获结果,然后获取一个对象的属性,请按以下方式进行操作。

首先,捕获输出。

$a=Get-Service

现在,您想要特定实体的特定属性。为了获得它,索引进您想要的对象。

>$a[2]
Status   Name               DisplayName                           
------   ----               -----------                           
Stopped  AJRouter           AllJoyn Router Service                

只需将.DisplayName追加到您之前的命令末尾即可选择.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

7
这是不可能的,除非有属性名称到数组索引的映射。请注意,在输出中看到的仅是属性的部分列表(在某个XML文件中定义)。因此,甚至没有一种简单的方法将它们转换为数组索引。
然而,我也不太理解你的需求。您可以使用 $a[1] 获取第二个服务,如预期的那样。然后,您可以使用 $a[1].DisplayName 获取其 DisplayName 属性值。PowerShell 在整个过程中都使用对象。根本没有必要回退到文本解析或神秘的列索引来获取数据。有一种更简单的方法。

5
Get-Service 命令在控制台中的输出看起来可能像一个数组(因为发送到控制台时格式化为表格),但实际上它是一个 'System.ServiceProcess.ServiceController' 对象。
您需要使用属性名称而不是行和列指示来检索属性,例如: $a[2].DisplayName 将返回 Application Layer Gateway Service

0

继续之前提到使用属性名称的答案:

要发现从管道中输出的对象的属性名称,请将 cmdlet 的输出导入到 Get-Member 中。例如:

Get-Service | Get-Member

这将给出从管道中输出的对象的类型,以及这些对象的属性、方法和事件的列表。如果您只对对象的属性名称感兴趣,可以使用 Get-Member -MemberType Property, AliasProperty 过滤 Get-Member 的输出。

例如:

> Get-Service | Get-Member -MemberType Property, AliasProperty

   TypeName: System.Service.ServiceController#StartupType

Name                MemberType    Definition
----                ----------    ----------
Name                AliasProperty Name = ServiceName
RequiredServices    AliasProperty RequiredServices = ServicesDependedOn
BinaryPathName      Property      System.String {get;set;}
CanPauseAndContinue Property      bool CanPauseAndContinue {get;}
CanShutdown         Property      bool CanShutdown {get;}
CanStop             Property      bool CanStop {get;}
Container           Property      System.ComponentModel.IContainer Container {get;}
DelayedAutoStart    Property      System.Boolean {get;set;}
DependentServices   Property      System.ServiceProcess.ServiceController[] DependentServices {get;}
Description         Property      System.String {get;set;}
DisplayName         Property      string DisplayName {get;set;}
MachineName         Property      string MachineName {get;set;}
ServiceHandle       Property      System.Runtime.InteropServices.SafeHandle ServiceHandle {get;}
ServiceName         Property      string ServiceName {get;set;}
ServicesDependedOn  Property      System.ServiceProcess.ServiceController[] ServicesDependedOn {get;}
ServiceType         Property      System.ServiceProcess.ServiceType ServiceType {get;}
Site                Property      System.ComponentModel.ISite Site {get;set;}
StartType           Property      System.ServiceProcess.ServiceStartMode StartType {get;}
StartupType         Property      Microsoft.PowerShell.Commands.ServiceStartupType {get;set;}
Status              Property      System.ServiceProcess.ServiceControllerStatus Status {get;}
UserName            Property      System.String {get;set;}

请注意,Get-Member会提供通过管道传递的每个对象的详细信息,而不是整个对象集合的信息。因此,在从Get-Service显示的输出中,Get-Member会提供表示安装在计算机上的单个服务的对象的详细信息。它不代表所有服务的集合。
然后,您可以使用这些属性名称与Select-Object cmdlet一起使用,以指定要显示的属性。
例如:
> Get-Service | Select-Object ServiceName, Status, StartType

ServiceName                   Status StartType
-----------                   ------ ---------
ALG                          Stopped    Manual
AppHostSvc                   Running Automatic
AppIDSvc                     Stopped    Manual
Appinfo                      Running    Manual
AppMgmt                      Stopped    Manual

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接