Select-Object

选择对象或对象属性。

语法

Select-Object
      [-InputObject <PSObject>]
      [[-Property] <Object[]>]
      [-ExcludeProperty <String[]>]
      [-ExpandProperty <String>]
      [-Unique]
      [-Last <Int32>
      [-First <Int32>]
      [-Skip <Int32>]
      [-Wait]
      [<CommonParameters>]
Select-Object
      [-InputObject <PSObject>]
      [[-Property] <Object[]>]
      [-ExcludeProperty <String[]>]
      [-ExpandProperty <String>]
      [-Unique]
      [-SkipLast <Int32>]
      [<CommonParameters>]
Select-Object
      [-InputObject <PSObject>]
      [-Unique]
      [-Wait]
      [-Index <Int32[]>]
      [<CommonParameters>]
Select-Object
      [-InputObject <PSObject>]
      [-Unique]
      [-SkipIndex <Int32[]>]
      [<CommonParameters>]

说明

cmdlet Select-Object 选择对象或对象集的指定属性。 它还可以从数组中选择唯一对象、指定数目的对象或指定位置中的对象。

若要从集合中选择对象,请使用 FirstLastUniqueSkipIndex 参数。 若要选择对象属性,请使用 Property 参数。 选择属性时, Select-Object 返回仅具有指定属性的新对象。

从 Windows PowerShell 3.0 开始,Select-Object包括一个优化功能,该功能可防止命令创建和处理不使用的对象。

Select-Object 命令管道中包含具有 FirstIndex 参数的命令时,PowerShell 会在生成选定数量的对象后立即停止生成对象的命令,即使生成对象的命令在管道中的命令出现之前 Select-Object 也是如此。 若要禁用此优化行为,请使用 Wait 参数。

示例

示例 1:按属性选择对象

此示例创建具有 名称ID 和工作集 (WS) 进程对象的属性的对象。

Get-Process | Select-Object -Property ProcessName, Id, WS

示例 2:按属性选择对象并设置结果的格式

此示例获取有关计算机上进程使用的模块的信息。 它使用 Get-Process cmdlet 在计算机上获取进程。

它使用 Select-Object cmdlet 输出每个实例输出Get-Process[System.Diagnostics.ProcessModule]System.Diagnostics.ProcessModules 属性中包含的实例数组。

cmdlet 的 Select-ObjectProperty 参数选择进程名称。 这会将 NoteProperty 添加到ProcessName每个[System.Diagnostics.ProcessModule]实例,并使用当前进程的 ProcessName 属性的值填充该实例。

最后, Format-List cmdlet 用于显示列表中每个进程的名称和模块。

Get-Process Explorer |
    Select-Object -Property ProcessName -ExpandProperty Modules |
    Format-List

ProcessName       : explorer
ModuleName        : explorer.exe
FileName          : C:\WINDOWS\explorer.exe
BaseAddress       : 140697278152704
ModuleMemorySize  : 3919872
EntryPointAddress : 140697278841168
FileVersionInfo   : File:             C:\WINDOWS\explorer.exe
                    InternalName:     explorer
                    OriginalFilename: EXPLORER.EXE.MUI
                    FileVersion:      10.0.17134.1 (WinBuild.160101.0800)
                    FileDescription:  Windows Explorer
                    Product:          Microsoft Windows Operating System
                    ProductVersion:   10.0.17134.1
...

示例 3:选择使用最多内存的进程

此示例获取使用最多内存的五个进程。 cmdlet Get-Process 获取计算机上的进程。 cmdlet Sort-Object 根据内存 (工作集) 使用情况对进程进行排序,cmdlet Select-Object 仅选择生成的对象数组的最后五个成员。

在包含 Sort-Object cmdlet 的命令中不需要 Wait 参数,因为Sort-Object会处理所有对象,然后返回集合。 优化 Select-Object 仅适用于在处理对象时单独返回对象的命令。

Get-Process | Sort-Object -Property WS | Select-Object -Last 5

Handles  NPM(K)    PM(K)      WS(K) VS(M)   CPU(s)     Id ProcessName
-------  ------    -----      ----- -----   ------     -- -----------
2866     320       33432      45764   203   222.41   1292 svchost
577      17        23676      50516   265    50.58   4388 WINWORD
826      11        75448      76712   188    19.77   3780 Ps
1367     14        73152      88736   216    61.69    676 Ps
1612     44        66080      92780   380   900.59   6132 INFOPATH

示例 4:从数组中选择唯一字符

此示例使用 的 Unique 参数 Select-Object 从字符数组中获取唯一字符。

"a","b","c","a","a","a" | Select-Object -Unique

a
b
c

示例 5:将“-Unique”与其他参数一起使用

唯一参数在应用其他Select-Object参数后筛选值。 例如,如果使用 First 参数选择数组中的第一个项数, 则 Unique 仅应用于所选值,而不是整个数组。

"a","a","b","c" | Select-Object -First 2 -Unique

a

在此示例中, First 选择 "a","a" 作为数组中的前 2 个项。 Unique 应用于 "a","a" ,并作为唯一值返回 a

示例 6:在事件日志中选择最新和最早的事件

此示例获取Windows PowerShell事件日志中第一个 (最新的) 和最后一个 (最早的) 事件。

Get-EventLog获取Windows PowerShell日志中的所有事件,并将其保存在 变量中$a。 然后, $a 通过管道连接到 Select-Object cmdlet。 命令 Select-Object 使用 Index 参数从变量中的事件数组中选择 $a 事件。 第一个事件的索引为 0。 最后一个事件的索引是减去 1 中的 $a 项数。

$a = Get-EventLog -LogName "Windows PowerShell"
$a | Select-Object -Index 0, ($A.count - 1)

示例 7:选择所有对象,但第一个对象

本示例在Servers.txt文件中列出的每台计算机上创建新的 PSSession,第一台除外。

Select-Object 在计算机名称列表中选择除第一台计算机的所有计算机。 生成的计算机列表设置为 cmdlet 的 ComputerName 参数 New-PSSession 的值。

New-PSSession -ComputerName (Get-Content Servers.txt | Select-Object -Skip 1)

示例 8:重命名文件并选择要查看的几个文件

此示例向具有只读属性的文本文件的基名称添加一个“-ro”后缀,然后显示前五个文件,以便用户可以看到效果的示例。

Get-ChildItem 使用 ReadOnly 动态参数获取只读文件。 生成的文件通过管道传递给 Rename-Item cmdlet,该 cmdlet 将重命名文件。 它使用 的 Rename-ItemPassThru 参数将重命名的文件Select-Object发送到 cmdlet,该 cmdlet 选择前 5 个进行显示。

Wait 参数 Select-Object 可防止 PowerShell 在 Get-ChildItem 获取前五个只读文本文件后停止 cmdlet。 如果不使用此参数,则只有前五个只读文件会被重命名。

Get-ChildItem *.txt -ReadOnly |
    Rename-Item -NewName {$_.BaseName + "-ro.txt"} -PassThru |
    Select-Object -First 5 -Wait

示例 9:显示 -ExpandProperty 参数的复杂功能

此示例演示 ExpandProperty 参数的复杂功能。

请注意,生成的输出是实例数组 [System.Int32] 。 实例符合 输出视图的标准格式设置规则。 对于任何 扩展 属性,这都是如此。 如果输出的对象具有特定的标准格式,则展开的属性可能不可见。

# Create a custom object to use for the Select-Object example.
$object = [pscustomobject]@{Name="CustomObject";Expand=@(1,2,3,4,5)}
# Use the ExpandProperty parameter to Expand the property.
$object | Select-Object -ExpandProperty Expand -Property Name

1
2
3
4
5

# The output did not contain the Name property, but it was added successfully.
# Use Get-Member to confirm the Name property was added and populated.
$object | Select-Object -ExpandProperty Expand -Property Name | Get-Member

TypeName: System.Int32

Name        MemberType   Definition
----        ----------   ----------
CompareTo   Method       int CompareTo(System.Object value), int CompareTo(int value), ...
Equals      Method       bool Equals(System.Object obj), bool Equals(int obj), bool IEq...
GetHashCode Method       int GetHashCode()
GetType     Method       type GetType()
GetTypeCode Method       System.TypeCode GetTypeCode(), System.TypeCode IConvertible.Ge...
ToBoolean   Method       bool IConvertible.ToBoolean(System.IFormatProvider provider)
ToByte      Method       byte IConvertible.ToByte(System.IFormatProvider provider)
ToChar      Method       char IConvertible.ToChar(System.IFormatProvider provider)
ToDateTime  Method       datetime IConvertible.ToDateTime(System.IFormatProvider provider)
ToDecimal   Method       decimal IConvertible.ToDecimal(System.IFormatProvider provider)
ToDouble    Method       double IConvertible.ToDouble(System.IFormatProvider provider)
ToInt16     Method       int16 IConvertible.ToInt16(System.IFormatProvider provider)
ToInt32     Method       int IConvertible.ToInt32(System.IFormatProvider provider)
ToInt64     Method       long IConvertible.ToInt64(System.IFormatProvider provider)
ToSByte     Method       sbyte IConvertible.ToSByte(System.IFormatProvider provider)
ToSingle    Method       float IConvertible.ToSingle(System.IFormatProvider provider)
ToString    Method       string ToString(), string ToString(string format), string ToS...
ToType      Method       System.Object IConvertible.ToType(type conversionType, System...
ToUInt16    Method       uint16 IConvertible.ToUInt16(System.IFormatProvider provider)
ToUInt32    Method       uint32 IConvertible.ToUInt32(System.IFormatProvider provider)
ToUInt64    Method       uint64 IConvertible.ToUInt64(System.IFormatProvider provider)
Name        NoteProperty string Name=CustomObject

示例 10:在对象上创建自定义属性

以下示例演示如何使用 Select-Object 向任何对象添加自定义属性。 指定不存在的属性名称时, Select-Object 将在传递的每个对象上创建该属性作为 NoteProperty

$customObject = 1 | Select-Object -Property MyCustomProperty
$customObject.MyCustomProperty = "New Custom Property"
$customObject

MyCustomProperty
----------------
New Custom Property

示例 11:为每个 InputObject 创建计算属性

此示例演示如何使用 Select-Object 向输入添加计算属性。 将 ScriptBlock 传递给 Property 参数会导致 Select-Object 计算每个传递对象的表达式,并将结果添加到输出。 在 ScriptBlock 中,可以使用 $_ 变量来引用管道中的当前对象。

默认情况下, Select-Object 使用 ScriptBlock 字符串作为属性的名称。 使用 哈希表,可以将 ScriptBlock 的输出标记为添加到每个对象的自定义属性。 可以将多个计算属性添加到传递给 Select-Object的每个对象。

# Create a calculated property called $_.StartTime.DayOfWeek
Get-Process | Select-Object -Property ProcessName,{$_.StartTime.DayOfWeek}

ProcessName  $_.StartTime.DayOfWeek
----         ----------------------
alg                       Wednesday
ati2evxx                  Wednesday
ati2evxx                   Thursday
...

# Add a custom property to calculate the size in KiloBytes of each FileInfo
# object you pass in. Use the pipeline variable to divide each file's length by
# 1 KiloBytes
$size = @{label="Size(KB)";expression={$_.length/1KB}}
# Create an additional calculated property with the number of Days since the
# file was last accessed. You can also shorten the key names to be 'l', and 'e',
# or use Name instead of Label.
$days = @{l="Days";e={((Get-Date) - $_.LastAccessTime).Days}}
# You can also shorten the name of your label key to 'l' and your expression key
# to 'e'.
Get-ChildItem $PSHOME -File | Select-Object Name, $size, $days

Name                        Size(KB)        Days
----                        --------        ----
Certificate.format.ps1xml   12.5244140625   223
Diagnostics.Format.ps1xml   4.955078125     223
DotNetTypes.format.ps1xml   134.9833984375  223

示例 12:在不使用计算属性的情况下选择哈希表键

从 PowerShell 6 开始, Select-Object 支持选择 哈希表 输入的键作为属性。 以下示例在输入哈希表上选择 weightname 键,并显示输出。

@{ name = 'a' ; weight = 7 } | Select-Object -Property name, weight

name weight
---- ------
a         7

参数

-ExcludeProperty

指定此 cmdlet 从操作中排除的属性。 允许使用通配符。

从 PowerShell 6 开始,不再需要包含 ExcludeProperty的 Property 参数即可正常工作。

Type:String[]
Position:Named
Default value:None
Accept pipeline input:False
Accept wildcard characters:True

-ExpandProperty

指定要选择的属性,并指示应当尝试展开该属性。

  • 如果指定的属性是数组,则数组的每个值都包含在输出中。
  • 如果指定的属性是对象,则会为每个 InputObject 扩展对象属性

在任一情况下,输出对象的 Type 都与扩展属性的 Type 匹配。

如果指定 了 Property 参数, Select-Object 则尝试将每个所选属性作为 NoteProperty 添加到每个输出对象。

警告

如果收到由于具有该名称的属性已存在而无法处理属性的错误,请考虑以下事项。 请注意,使用 ExpandProperty 时, Select-Object 不能替换现有属性。 这意味着:

  • 如果展开的对象具有同名的属性,则命令将返回错误。
  • 如果 Selected 对象具有与 Expanded 对象的属性同名的属性,则命令将返回错误。
Type:String
Position:Named
Default value:None
Accept pipeline input:False
Accept wildcard characters:False

-First

指定要从输入对象的数组的开头选择的对象数。

Type:Int32
Position:Named
Default value:None
Accept pipeline input:False
Accept wildcard characters:False

-Index

基于对象的索引值从数组中选择对象。 以逗号分隔的列表形式输入索引。 数组中的索引从 0 开始,0 表示第一个值,(n-1) 表示最后一个值。

Type:Int32[]
Position:Named
Default value:None
Accept pipeline input:False
Accept wildcard characters:False

-InputObject

指定要通过管道发送到 cmdlet 的对象。 此参数使你能够通过管道将对象传递给 Select-Object

将对象传递给 InputObject 参数时,即使值是集合,也不使用管道, Select-Object 而是将 InputObject 视为单个对象。 建议在将集合 Select-Object传递给 时使用管道。

Type:PSObject
Position:Named
Default value:None
Accept pipeline input:True
Accept wildcard characters:False

-Last

指定要从输入对象的数组的末尾选择的对象数。

Type:Int32
Position:Named
Default value:None
Accept pipeline input:False
Accept wildcard characters:False

-Property

指定要选择的属性。 这些属性作为 NoteProperty 成员添加到输出对象。 允许使用通配符。

Property 参数的值可以是新的计算属性。 若要创建计算属性,请使用哈希表。

有效键包括:

  • 名称 (或标签) - <string>
  • 表达式 - <string><script block>

有关详细信息,请参阅 about_Calculated_Properties

Type:Object[]
Position:0
Default value:None
Accept pipeline input:False
Accept wildcard characters:True

-Skip

跳过 (不选择) 指定数量的项。 默认情况下, Skip 参数从数组或对象列表的开头开始计数,但如果命令使用 Last 参数,则会从列表或数组的末尾进行计数。

与从 0 开始计数的 Index 参数不同,Skip 参数从 1 开始计数。

Type:Int32
Position:Named
Default value:None
Accept pipeline input:False
Accept wildcard characters:False

-SkipIndex

Type:Int32[]
Position:Named
Default value:None
Accept pipeline input:False
Accept wildcard characters:False

-SkipLast

跳过 (不从列表或数组末尾选择) 指定数量的项。 的工作方式与将 SkipLast 参数一起使用的方式相同。

Index 参数不同,Index 参数从 0 开始计数, SkipLast 参数从 1 开始。

Type:Int32
Position:Named
Default value:None
Accept pipeline input:False
Accept wildcard characters:False

-Unique

指定如果输入对象的子集具有相同的属性和值,则只应选择子集的单个成员。

唯一 在应用其他筛选参数 选择值。

此参数区分大小写。 因此,会将仅大小写不同的字符串视为唯一项。

Type:SwitchParameter
Position:Named
Default value:None
Accept pipeline input:False
Accept wildcard characters:False

-Wait

指示 cmdlet 关闭优化。 PowerShell 按照命令管道中出现的顺序运行命令,并允许它们生成所有对象。 默认情况下,如果在 Select-Object 命令管道中包含具有 FirstIndex 参数的命令,PowerShell 会在生成选定数量的对象后立即停止生成对象的命令。

已在 Windows PowerShell 3.0 中引入了此参数。

Type:SwitchParameter
Position:Named
Default value:None
Accept pipeline input:False
Accept wildcard characters:False

输入

PSObject

可以通过管道将对象传递给此 cmdlet。

输出

PSObject

此 cmdlet 返回仅具有所选属性的输入对象。

备注

PowerShell 包含以下别名 Select-Object

  • 所有平台:
    • select

Select-Object 优化功能仅适用于在处理对象时将对象写入管道的命令。 它对用于缓冲处理的对象并将其作为集合写入的命令不起作用。 立即写入对象是 cmdlet 设计的最佳做法。 有关详细信息,请参阅强鼓励开发指南中的将单个记录写入管道