当前位置:网站首页 > 更多 > 玩电脑 > 正文

[玩转系统] 如何使用 PowerShell 选择对象

作者:精品下载站 日期:2024-12-14 18:44:11 浏览:17 分类:玩电脑

如何使用 PowerShell 选择对象


使用 PowerShell 检索数据时,您通常只需要对象的几个属性。为此,我们可以使用 cmdlet Select-Object,它允许我们选择所需的数据。

大多数人不知道的是,Select-Object 的功能远不止选择您需要的属性。例如,我们可以选择前 x 或最后 x 属性、展开属性,甚至创建计算属性。

在本文中,我们将了解如何使用 Select-Object、不同的选择选项,并且我将向您展示几个示例。

PowerShell 选择对象

Select-Object cmdlet 始终通过管道传输到 PowerShell 中的另一个 cmdlet 后面。它允许您选择或修改管道中的对象的属性。然后,所选属性仅显示在结果中,或者可以使用 Export-CSV cmdlet 将其导出到 CSV 文件。

为了选择属性,我们有几个可以使用的选项:

-Property

要选择的属性。使用逗号分隔列表选择多个

-ExcludeProperty

从结果中排除属性。

-First

从结果中选择前 x 个对象

-Last

从结果中选择最后 x 个对象

-Skip

跳过 x 数量的物体

-SkipLast

跳过最后 x 条记录

-Index

从结果中选择前 x 个对象

-SkipIndex

从结果中跳过选定的对象。

-Unique

选择独特的结果

让我们从基础知识开始,然后我们将深入了解 PowerShell Select-Object 的功能。要简单地从对象中选择几个属性,我们可以使用带有属性名称的逗号分隔列表:

Get-Process | Select-Object -Property Name, CPU

# You can also leave out the parameter -Property
Get-Process | Select-Object Name, CPU

[玩转系统] 如何使用 PowerShell 选择对象

我们并不总是需要使用属性的全名,在选择属性时也可以使用通配符。例如,如果我们想返回所有以 Size 结尾的属性,那么我们可以这样做:

Get-Process | Select-Object Name, CPU, *Size

排除属性

除了选择我们想要的属性之外,我们还可以使用参数 -ExcludeProperty 排除不需要的属性。就像选择属性一样,我们可以使用通配符来排除以特定字符串开头或结尾的所有属性。

例如,我们从给定路径获取所有项目,并希望排除以 PS 开头的属性和所有属性:

Get-ChildItem -Path c:\temp | Select-Object -ExcludeProperty Attributes, PS*

限制结果数量

然而,一个常见的问题是,您如何知道哪些属性可用?要获取所有可能的属性,我们可以将 Select-Object-first 参数与通配符结合使用。通配符将返回所有属性,-first 1 确保只返回一个对象:

Get-Process | Select-Object * -First 1

参数 -first-last 允许您从结果中选择第一个或最后 x 个对象。值得一提的是,您可以同时使用这两个参数,因此您可以从结果中选择前 3 个和最后 3 个对象:

Get-Process | Select-Object -First 3 -Last 3

跳过项目

除了选择第一个或最后 x 个项目之外,我们还可以使用参数 -skip 跳过多个项目。值得高兴的是,您可以将“skip”与“first”或“last”结合起来。假设我们要返回对象 11 到 15:

$numberArray = 1..20
$numberArray | Select-Object -Skip 10 -First 5

跳过总是从结果的开头开始,这是有道理的。但是如果您想跳过结果的最后 10 项怎么办?在这种情况下,您可以使用参数 -SkipLast,它将跳过列表中的最后 x 个结果:

$numberArray = 1..20
$numberArray | Select-Object -SkipLast 10

通过索引选择特定结果

如果您知道要返回哪个特定对象,那么您还可以使用参数 -index 来选择它们。我不经常使用 -index,但一个很好的例子是当您读取文件的内容时。如果您知道需要文件中的哪一行,则可以使用 -index 来选择行。请记住,索引从 0 开始。

# Select the 3 row from the CSV file
Get-Content -Path c:\temp\example.csv | Select-Object -index 2

您还可以使用 -SkipIndex 从结果中跳过特定对象(或上例中的行)。

选择唯一

当您获取计算机上所有正在运行的进程时,您可能会看到某些进程在结果中多次出现,例如 Chrome(当然,如果您将其用作浏览器)。要获取所有唯一的进程,我们可以使用参数 -unique。

但是 -unique 将根据所有属性(而不仅仅是名称)来确定对象是否唯一。因此,要获取计算机上运行的所有唯一进程,我们首先需要选择一个属性(在本例中为名称),然后使用参数 unique:

 Get-Process | Select-Object -Property Name -Unique

另一个很好的例子是当您想要获取 Active Directory 中使用的所有可能的职位名称时。为此,我们将获取所有具有属性标题的用户,仅选择标题,并从中提取唯一值:

Get-Aduser -Filter * -Properties title | Select Title -Unique

[玩转系统] 如何使用 PowerShell 选择对象

选择对象高级功能

PowerShell Select-Object cmdlet 还具有一些您确实应该了解的高级功能。这些功能基于哈希表,它允许我们重命名属性并创建计算属性。

哈希表的结构乍一看可能有点让人不知所措,所以在看几个例子之前,让我们先对其进行分解和解释。执行以下命令:

Get-Service | Select-Object @{Name="ServiceName"; Expression={$_.DisplayName}}

正如您所看到的,我们获得了所有服务,并将从中选择一个对象。我们来看看哈希表的各个部分的作用:

  • @{名称=“服务名称”; Expression={$_.DisplayName}} - 这是基于哈希表的参数。它定义了一个名为“Servicename”的自定义属性,该属性出现在原始服务对象中。

  • Name=”ServiceName” - 指定要添加到输出的新自定义属性

  • Expression={$_.DisplayName} - 计算新自定义属性值的表达式。在本例中,我们将获取每个对象的 DisplayName 属性并将其作为 ServiceName 返回

重命名属性

要重命名属性,我们可以使用上面的示例。我们将添加一个新的自定义属性,对于表达式,我们将采用属性 DisplayName 的值。您还可以添加其他属性。

Get-Service | Select-Object Status, @{Name="ServiceName"; Expression={$_.DisplayName}}

[玩转系统] 如何使用 PowerShell 选择对象

获取嵌套属性

我们还可以使用重命名方法来通过 Select-Object 获取嵌套属性。例如,我们想要从事件日志中获取最后 5 个事件,并将消息长度添加到结果中。我们可以创建一个新的自定义属性 MessageLength,并在表达式中从属性消息中选择属性长度:

Get-EventLog -LogName Application -Newest 5 | Select-Object TimeGenerated, EntryType, @{Name="MessageLength"; Expression={$_.Message.Length}}

计算属性

基于哈希表的参数中的表达式部分允许我们进行计算。原理还是一样的。首先,我们定义一个新的自定义属性,在表达式中,我们可以进行任何我们想要的计算。

例如,要获取磁盘的可用空间(以 GB 为单位),我们可以使用 Get-WmiObject cmdlet 从磁盘获取信息。但它会以字节为单位返回可用空间,因此我们将以 GB 为单位进行计算:

Get-WmiObject Win32_LogicalDisk | Select-Object DeviceID, MediaType, @{Name="FreeSpace (GB)"; Expression={"{0:N2}" -f ($_.FreeSpace / 1GB)}}

表达式通过将 FreeSpace 属性除以 1GB(千兆字节)来计算磁盘上的可用空闲空间。它还使用格式运算符 -f 使用 {0:N2} 格式说明符将结果格式化为两位小数。

展开属性

使用嵌套对象时,您有时希望包含结果,但与其他数据位于同一列中。在这些情况下,我们可以使用参数-ExpandProperty,以便结果显示在同一列中。取以下对象:

$myObject = [PSCustomObject]@{
    Name = "John"
    Age = 30
    Address = @{
        Street = "123 Main St"
        City = "Anytown"
        State = "CA"
    }
}

我们可以使用嵌套属性方法获取街道:

$myObject | Select-Object Name,@{Name="Street"; Expression={$_.Address.Street}}

# Result
Name Street
---- ------
John 123 Main St

但要将结果作为单独的对象获取,我们需要使用 -ExpandProperty 参数,如下所示:

$myObject | Select-Object Name, @{Name="Street"; Expression={$_.Address.Street}} -ExpandProperty Street

# Result
John
123 Main St

总结

PowerShell cmdlet Select-Object 允许您选择所需的结果。 -First-Last 参数是在输出所有结果之前检查结果的好方法。如果您想了解有关 PowerShell 的更多信息,请查看此入门指南。

我希望本文可以帮助您更好地了解 cmdlet 的工作原理。如果您有任何疑问,请在下面发表评论。

您需要 登录账户 后才能发表评论

取消回复欢迎 发表评论:

关灯