PowerShell的Select-Object cmdlet使您能够从一组输入对象中无缝挑选对象和属性。但有时候,您需要了解更多信息。ExpandProperty是Select-Object的一个开关,用于展开有关特定属性的详细信息。
在这个示例引导的教程中发现PowerShell Expand Property(-ExpandProperty
)开关的力量。
先决条件
这个教程将是一个动手演示。如果您想跟随操作,您需要的只是一台安装了PowerShell 5.1及以上版本的Windows机器。本文使用的是一台安装了PowerShell 5.1的Windows 10机器。
使用PowerShell Expand Property提取属性对象值
登录到您的Windows机器并启动一个PowerShell终端。在这一部分,您将会熟悉Select-Object
cmdlet及其ExpandProperty
开关。
1. 运行Get-Service cmdlet以获取系统上所有服务的列表。将输出传递给Select-Object cmdlet以仅选择并显示每个服务对象的名称属性,如下所示。
现在,您应该看到一个对象的单列,代表系统上服务的名称列表,如下面的截图所示。

2. 在前一个管道的末尾运行Get-Member cmdlet,确认select-object返回的对象类型如下。知道对象类型有助于编写函数或cmdlet来扩展您的管道。
参考下面的截图,您会注意到虽然-Property开关输出的看似是字符串列表,但这些是System.ServiceProcess.ServiceController对象的Selected列表。

3. 将Get-Members cmdlet替换为mkdir,以自动为每个服务创建一个文件夹。-first 5开关限制要返回的对象数量。而mkdir函数将仅基于管道中的对象创建五个文件夹。
您应该看到与下面截图类似的输出,表明尝试成功。

4. 通过在片段中使用rmdir来删除文件夹。打开-Verbose开关以在终端中显示详细输出。
rmdir cmdlet预期字符串,不能处理ServiceController对象的hashtable表示。您的尝试应该会失败,并显示多个错误,如下面的截图所示。

5. 将-Property开关更改为-ExpandProperty开关,如下面的代码片段所示。这样做可以在您只需要一个字符串时将属性的值作为字符串获取。
结合rmdir,您应该看到您尝试自动删除文件夹成功且没有错误,如下面的截图所示。

创建具有特定属性的一组选定对象
为了缩短各节中的代码片段,可以按如下方式为计算机上的前20个服务创建一个变量。
运行Get-Service
命令,通过Select-Object
cmdlet选择前20
个对象,并将对象存储在名为$testServices
的变量中。如下所示,仅选择Name
、Status
和DependentServices
属性。
PowerShell Expand Property开关一次只能展开一个属性,而Property开关可以同时选择多个属性。
执行变量名$testServices
,查看其内容结构。
您应该会看到一个表格,显示您筛选的服务的属性,类似于下面的截图。

使用PowerShell扩展属性扩展集合属性
A PowerShell object can have properties that are collections of objects, also known as collection properties. In this section, you will learn how to use PowerShell Expand Property to expand a collection property to view its members’ properties.
在$testServices
变量上执行Select-Object
cmdlet,并展开每个服务的DependentServices
属性。
由于DependentServices
是一个集合属性,输出是所有填充集合中服务的列表,如下所示。请注意,由于连接了扩展的DependentServices
的结果,列表中存在重复项。

使用PowerShell结合属性扩展属性以获取分类输出
现在您有了一份依赖服务的列表,但是您如何知道它们依赖于哪个服务呢?在本节中,您将学习如何使用-Property
开关对扩展的属性进行分类。
运行以下命令,按Name
对DependentServices
属性进行分类。
由于依赖服务已经具有Name
属性,因此分类步骤失败,如下所示。
下面的错误告诉您,服务的初始列表(在$testServices中)已经具有与扩展的DependentServices属性中的Name属性冲突的Name属性。

一种解决方法是创建计算属性,将标识符属性重命名如下。
保存先前的命令输出,修改为指定一个名为$depServ的变量的计算属性称为Depends On作为标识符属性。Depends on将包含$testService中每个服务的Name值。
属性名称Depends on
在本教程中是任意选择的,可以是您选择的任何表达式。
通过Select-Object
将对象传递给$depServ
,以选择依赖服务Name
、Status
和Depends On
属性。
现在您可以看到哪些服务依赖于$testServices
中的服务,如下所示。

结合PowerShell Expand Property进行详细显示
PowerShell可能限制要显示的对象属性,特别是在表格式输出中,并且-ExpandProperty
开关输出可能会遇到相同的情况。您可以将扩展的属性显示在列表中,作为一种解决方法。
运行下面的Get-Process
cmdlet以检索explorer
进程使用的所有modules
。打开-ExpandProperty
开关以显示模块的属性。
您屏幕上的输出应类似于以下屏幕截图,自动截断以仅显示三个属性。

将对象传递到 Format-List
cmdlet 以查看模块对象的所有值,以更方便的列表形式显示。
如下所示,输出列出了所有属性及其值。您还可以进一步将数据保存到文件或将其传递给另一个 cmdlet 以进行进一步处理。

结论
通过成功达到这一步,您已经了解到如何从 PowerShell 的 Select-Object cmdlet 利用 Expand Property 开关 (-ExpandProperty) 获益。PowerShell 提供了许多用于执行常见任务的实用 cmdlet。您可以通过学习如何使用 PowerShell Cat 快速显示文件来扩展您的新知识。
Source:
https://adamtheautomator.com/powershell-expand-property/