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
cmdlet 选择对象的指定属性或对象集。
它还可以选择唯一对象、指定数量的对象或数组中指定位置的对象。
若要从集合中选择对象,请使用 First、Last、Unique、Skip和 Index 参数。 若要选择对象属性,请使用 属性 参数。
选择属性时,Select-Object
返回仅具有指定属性的新对象。
从 Windows PowerShell 3.0 开始,Select-Object
包括一项优化功能,可阻止命令创建和处理不使用的对象。
在命令管道中包含 First 或 Index 参数的 Select-Object
命令时,PowerShell 会在生成所选对象数后立即停止生成对象的命令,即使生成对象的命令出现在管道中的 Select-Object
命令之前也是如此。
若要关闭此优化行为,请使用 Wait 参数。
示例
示例 1:按属性选择对象
此命令创建具有进程对象的 名称、ID和工作集(WS) 属性的对象。
Get-Process | Select-Object -Property ProcessName, Id, WS
示例 2:按属性选择对象并设置结果格式
此命令获取有关计算机上进程使用的模块的信息。
它使用 Get-Process
cmdlet 在计算机上获取进程。
它使用 Select-Object
cmdlet 输出 [System.Diagnostics.ProcessModule]
实例数组,如 Get-Process
每个 System.Diagnostics.Process
实例输出的 Modules 属性中包含的。
该命令使用 Select-Object
cmdlet 的 属性 参数来选择进程名称。 这会向每个 [System.Diagnostics.ProcessModule]
实例添加一个 ProcessName
NoteProperty
,并使用当前进程 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:选择使用最多内存的进程
此命令获取使用最多内存的五个进程。
Get-Process
cmdlet 获取计算机上的进程。
Sort-Object
cmdlet 根据内存(工作集)使用情况对进程进行排序,Select-Object
cmdlet 仅选择生成的对象数组的最后五个成员。
包含 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:从数组中选择唯一字符
此命令使用 唯一 参数 Select-Object
从字符数组获取唯一字符。
"a","b","c","a","a","a" | Select-Object -Unique
a
b
c
示例 5:在事件日志中选择最新和最早的事件
这些命令获取 Windows PowerShell 事件日志中的第一个(最新)和最后一个(最旧)事件。
此命令使用 Get-EventLog
cmdlet 获取 Windows PowerShell 日志中的所有事件。
它将它们保存在 $a
变量中。
第二个命令使用管道运算符 (|) 将 $a
中的事件发送到 Select-Object
cmdlet。
Select-Object
命令使用 Index 参数从 $a
变量中的事件数组中选择事件。 第一个事件的索引为 0。
最后一个事件的索引是 $a
减 1 中的项数。
$a = Get-EventLog -LogName "Windows PowerShell"
$a | Select-Object -Index 0, ($A.count - 1)
示例 6:选择除了第一个对象的所有对象
此命令在 Servers.txt 文件中列出的每台计算机上创建新的 PSSession,但第一台计算机除外。
此命令使用 Select-Object
cmdlet 来选择计算机名称列表中除了第一台计算机外的所有计算机。
生成的计算机列表设置为 New-PSSession
cmdlet 的 ComputerName 参数的值。
New-PSSession -ComputerName (Get-Content Servers.txt | Select-Object -Skip 1)
示例 7:重命名文件并选择多个要审阅的文件
此命令将“-ro”后缀添加到具有只读属性的文本文件的基名称,然后显示前五个文件,以便用户可以看到效果示例。
该命令使用 FileSystem cmdlet Get-ChildItem
的 ReadOnly 动态参数来获取只读文件。
它使用管道运算符 (|) 将文件发送到 Rename-Item
cmdlet,该 cmdlet 重命名该文件。
它使用 Rename-Item
的 Passthru 参数将重命名的文件发送到 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
示例 8:演示 -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), int IComparable.CompareTo(System.Object obj)...
Equals Method bool Equals(System.Object obj), bool Equals(int obj), bool IEquatable[int].Equals(int other)
GetHashCode Method int GetHashCode()
GetType Method type GetType()
GetTypeCode Method System.TypeCode GetTypeCode(), System.TypeCode IConvertible.GetTypeCode()
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 ToString(System.IFormatProvider provider)...
ToType Method System.Object IConvertible.ToType(type conversionType, System.IFormatProvider provider)
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
示例 9:在对象上创建自定义属性
以下示例演示如何使用 Select-Object
向任何对象添加自定义属性。
指定不存在的属性名称时,Select-Object
会在传递的每个对象上将此属性创建为 NoteProperty。
$customObject = 1 | Select-Object -Property MyCustomProperty
$customObject.MyCustomProperty = "New Custom Property"
$customObject
MyCustomProperty
----------------
New Custom Property
示例 10:为每个 InputObject 创建计算属性
此示例演示如何使用 Select-Object
向输入添加计算属性。
将 ScriptBlock 传递给 属性 参数会导致 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
参数
-ExcludeProperty
指定此 cmdlet 从操作中排除的属性。 允许通配符。 仅当命令还包含 属性 参数时,此参数才有效。
类型: | String[] |
Position: | Named |
默认值: | None |
必需: | False |
接受管道输入: | False |
接受通配符: | True |
-ExpandProperty
指定要选择的属性,并指示应尝试展开该属性。
- 如果指定的属性是一个数组,则数组的每个值都包含在输出中。
- 如果指定的属性是对象,则每个 InputObject 都会扩展对象属性
在任一情况下,对象的输出 类型 将与扩展属性 类型 匹配。
如果指定了 Property 参数,Select-Object
将尝试将每个所选属性添加为每个输出对象的 NoteProperty。
警告
如果收到错误:Select: 属性无法处理,因为属性 <PropertyName>
已存在,请考虑以下事项。
请注意,使用 -ExpandProperty
时,Select-Object
不能替换现有属性。
这意味着:
- 如果展开的对象具有同名的属性,将发生错误。
- 如果 Selected 对象具有与 展开 对象属性同名的属性,则会发生错误。
类型: | String |
Position: | Named |
默认值: | None |
必需: | False |
接受管道输入: | False |
接受通配符: | False |
-First
指定要从输入对象的数组开头选择的对象数。
类型: | Int32 |
Position: | Named |
默认值: | None |
必需: | False |
接受管道输入: | False |
接受通配符: | False |
-Index
根据数组的索引值从数组中选择对象。 在逗号分隔的列表中输入索引。
数组中的索引以 0 开头,其中 0 表示第一个值,(n-1)表示最后一个值。
类型: | Int32[] |
Position: | Named |
默认值: | None |
必需: | False |
接受管道输入: | False |
接受通配符: | False |
-InputObject
指定要通过管道发送到 cmdlet 的对象。
此参数使你可以通过管道将对象传递给 Select-Object
。
将对象传递给 InputObject 参数时,Select-Object
将 InputObject 视为单个对象,即使值是集合也是如此。 建议在将集合传递给 Select-Object
时使用管道。
类型: | PSObject |
Position: | Named |
默认值: | None |
必需: | False |
接受管道输入: | True |
接受通配符: | False |
-Last
指定要从输入对象的数组末尾选择的对象数。
类型: | Int32 |
Position: | Named |
默认值: | None |
必需: | False |
接受管道输入: | False |
接受通配符: | False |
-Property
指定要选择的属性。 这些属性作为 NoteProperty 成员添加到输出对象。 允许通配符。
属性 参数的值可以是新的计算属性。 若要创建计算属性,请使用哈希表。 有效密钥包括:
- 名称(或标签):
<string>
- 表达式
<string>
或<script block>
类型: | Object[] |
Position: | 0 |
默认值: | None |
必需: | False |
接受管道输入: | False |
接受通配符: | True |
-Skip
跳过(未选择)指定的项数。 默认情况下,Skip 参数计数从数组或对象列表的开头,但如果命令使用 Last 参数,它将从列表或数组的末尾进行计数。
与从 0 开始计数的 Index 参数不同,Skip 参数从 1 开始。
类型: | Int32 |
Position: | Named |
默认值: | None |
必需: | False |
接受管道输入: | False |
接受通配符: | False |
-SkipLast
跳过(不选择)列表或数组末尾的指定项数。 的工作方式与将 Skip 与 Last 参数一起使用。
与从 0 开始计数的 Index 参数不同,SkipLast 参数从 1 开始。
类型: | Int32 |
Position: | Named |
默认值: | None |
必需: | False |
接受管道输入: | False |
接受通配符: | False |
-Unique
指定如果输入对象的子集具有相同的属性和值,则只会选择子集的单个成员。
此参数区分大小写。 因此,仅字符大小写不同的字符串被视为唯一的。
类型: | SwitchParameter |
Position: | Named |
默认值: | None |
必需: | False |
接受管道输入: | False |
接受通配符: | False |
-Wait
指示 cmdlet 关闭优化。
PowerShell 按命令管道中显示的顺序运行命令,并允许它们生成所有对象。
默认情况下,如果在命令管道中包含具有 First 或 Index 参数的 Select-Object
命令,PowerShell 会在生成所选对象数后立即停止生成对象的命令。
此参数是在 Windows PowerShell 3.0 中引入的。
类型: | SwitchParameter |
Position: | Named |
默认值: | None |
必需: | False |
接受管道输入: | False |
接受通配符: | False |
输入
可以通过管道将任何对象传递给 Select-Object
。
输出
备注
- 还可以通过其内置别名
select
来引用Select-Object
cmdlet。 有关详细信息,请参阅 about_Aliases。 -
Select-Object
的优化功能仅适用于在处理对象时将对象写入管道的命令。 它不会影响缓冲区处理对象的命令,并将它们作为集合写入。 立即写入对象是 cmdlet 设计最佳做法。 有关详细信息,请参阅 MSDN 库中 强烈建议 将单条记录写入管道。