Select-Object
選取物件或物件屬性。
語法
Select-Object
[[-Property] <Object[]>]
[-InputObject <psobject>]
[-ExcludeProperty <string[]>]
[-ExpandProperty <string>]
[-Unique]
[-Last <int>]
[-First <int>]
[-Skip <int>]
[-Wait]
[<CommonParameters>]
Select-Object
[[-Property] <Object[]>]
[-InputObject <psobject>]
[-ExcludeProperty <string[]>]
[-ExpandProperty <string>]
[-Unique]
[-SkipLast <int>]
[<CommonParameters>]
Select-Object
[-InputObject <psobject>]
[-Unique]
[-Wait]
[-Index <int[]>]
[<CommonParameters>]
Description
Cmdlet 會 Select-Object
選取物件或物件集的指定屬性。 它也可以選取唯一物件、指定的物件數目,或陣列中指定位置中的物件。
若要從集合中選取物件,請使用 First、Last、Unique、Skip 和 Index 參數。 若要選取物件屬性,請使用 Property 參數。 當您選取屬性時, Select-Object
會傳回只有指定屬性的新物件。
從 Windows PowerShell 3.0 開始,包含一項優化功能, Select-Object
可防止命令建立及處理未使用的物件。
當您在命令管線中搭配 First 或 Index 參數使用Select-Object
時,PowerShell 會在到達選取的物件數目後立即停止產生物件的命令。 若要關閉此優化行為,請使用 Wait 參數。
範例
範例 1:依屬性選取物件
此範例會建立具有 進程物件之 Name、 ID 和工作集 (WS) 屬性的物件。
Get-Process | Select-Object -Property ProcessName, Id, WS
範例 2:依屬性選取物件並格式化結果
這個範例會取得計算機上進程所使用的模組相關信息。 它會使用 Get-Process
Cmdlet 來取得電腦上的程式。
它會使用 Select-Object
Cmdlet 輸出實例數位,[System.Diagnostics.ProcessModule]
如 所輸出之每個System.Diagnostics.Process
實例的 Modules 屬性所Get-Process
包含。
Cmdlet 的 Select-Object
Property 參數會選取進程名稱。 這會將 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
根據記憶體(工作集)使用量來排序進程,而 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
Unique 參數,從字元陣列取得唯一字元。
"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,以重新命名檔案。 它會使用的 Rename-Item
PassThru 參數,將重新命名的檔案傳送至 Select-Object
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 字串做為屬性的名稱。 您可以使用 Hashtable,將 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:選取具有導出屬性之哈希表的索引鍵
此範例示範如何使用 Select-Object
來顯示具有導出屬性之 哈希表 物件的機碼/值組。 每個匯出屬性 哈希表 都會指定新屬性的標籤做為索引鍵的顯示名稱,以及擷取該索引鍵值的運算式。
@{ name = 'a' ; weight = 7 } | Select-Object -Property @(
@{ label = 'Name' ; expression = { $_.name } }
@{ label = 'Weight' ; expression = { $_.weight } }
)
Name Weight
---- ------
a 7
範例 13 - ExpandProperty 會改變原始物件
此範例示範使用 ExpandProperty 參數的副作用。 當您使用 ExpandProperty 時, Select-Object
會將選取的屬性新增至原始物件做為 NoteProperty 成員。
PS> $object = [PSCustomObject]@{
name = 'USA'
children = [PSCustomObject]@{
name = 'Southwest'
}
}
PS> $object
name children
---- --------
USA @{name=Southwest}
# Use the ExpandProperty parameter to expand the children property
PS> $object | Select-Object @{n="country"; e={$_.name}} -ExpandProperty children
name country
---- -------
Southwest USA
# The original object has been altered
PS> $object
name children
---- --------
USA @{name=Southwest; country=USA}
如您所見,Country 屬性在使用 ExpandProperty 參數之後已新增至子物件。
範例 14 - 建立具有展開屬性的新物件,而不改變輸入物件
您可以藉由建立新的物件,並從輸入物件複製屬性,以避免使用 ExpandProperty 參數的副作用。
PS> $object = [PSCustomObject]@{
name = 'USA'
children = [PSCustomObject]@{
name = 'Southwest'
}
}
PS> $object
name children
---- --------
USA @{name=Southwest}
# Create a new object with selected properties
PS> $newobject = [PSCustomObject]@{
country = $object.name
children = $object.children
}
PS> $newobject
country children
------- --------
USA @{name=Southwest}
# $object remains unchanged
PS> $object
name children
---- --------
USA @{name=Southwest}
參數
-ExcludeProperty
指定此 Cmdlet 從作業中排除的屬性。 允許通配符。 只有當命令也包含 Property 參數時,此參數才有效。
類型: | String[] |
Position: | Named |
預設值: | None |
必要: | False |
接受管線輸入: | False |
接受萬用字元: | True |
-ExpandProperty
指定要選取的屬性,並指出應該嘗試展開該屬性。 如果輸入物件管線沒有名為的屬性, Select-Object
則傳回錯誤。
- 如果指定的屬性是陣列,陣列的每個值都會包含在輸出中。
- 如果指定的屬性是 物件,則會針對每個 InputObject 展開物件屬性
不論是哪一種情況,輸出物件的 Type 都符合展開屬性的 Type。
注意
使用 ExpandProperty 時會有副作用。 會將 Select-Object
選取的屬性新增至原始物件做為 NoteProperty 成員。
如果指定 Property 參數,Select-Object
嘗試將每個選取的屬性新增為 NoteProperty 至每個輸出的物件。
警告
如果您收到無法處理屬性的錯誤,因為具有該名稱的屬性已經存在,請考慮下列事項。 請注意,使用 ExpandProperty 時, Select-Object
無法取代現有的屬性。 這表示:
- 如果展開的物件具有相同名稱的屬性,命令會傳回錯誤。
- 如果 Selected 物件具有與 Expanded 物件屬性相同名稱的屬性,此命令會傳回錯誤。
類型: | 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 成員。 允許通配符。 如果輸入物件沒有名為 的屬性,則新 NoteProperty 的值會設定為 $null
。
Property 參數的值可以是新的導出屬性。 若要建立導出的屬性,請使用哈希表。
有效的金鑰如下:
- 名稱 (或標籤) -
<string>
- 表達式 -
<string>
或<script block>
如需詳細資訊,請參閱 about_Calculated_Properties。
類型: | Object[] |
Position: | 0 |
預設值: | None |
必要: | False |
接受管線輸入: | False |
接受萬用字元: | True |
-Skip
略過 (未選取) 指定的項目數目。 根據預設, Skip 參數會從 物件的集合開頭計算。 如果命令使用 Last 參數,它會從集合結尾計算。
不同於 Index 參數,從 0 開始計算,Skip 參數會從 1 開始。
類型: | Int32 |
Position: | Named |
預設值: | None |
必要: | False |
接受管線輸入: | False |
接受萬用字元: | False |
-SkipLast
略過清單或陣列結尾的指定項目數目(未選取)。 與使用 Skip 搭配 Last 參數的方式相同。
不同於 Index 參數,其會從 0 開始計算,SkipLast 參數會從 1 開始。
類型: | Int32 |
Position: | Named |
預設值: | None |
必要: | False |
接受管線輸入: | False |
接受萬用字元: | False |
-Unique
指定如果輸入物件的子集具有相同的屬性和值,則應該只選取子集的單一成員。
在套用其他篩選參數之後,唯一選取值。
此參數區分大小寫。 因此,只有字元大小寫不同的字串會被視為唯一的。
類型: | SwitchParameter |
Position: | Named |
預設值: | None |
必要: | False |
接受管線輸入: | False |
接受萬用字元: | False |
-Wait
表示 Cmdlet 會關閉優化。 PowerShell 會依命令管線中出現的順序執行命令,並讓他們產生所有物件。 根據預設,如果您在 Select-Object
命令管線中包含具有 First 或 Index 參數的命令,PowerShell 會在產生選取的物件數目後立即停止產生物件的命令。
此參數是在 Windows PowerShell 3.0 中引進的。
類型: | SwitchParameter |
Position: | Named |
預設值: | None |
必要: | False |
接受管線輸入: | False |
接受萬用字元: | False |
輸入
您可以使用管線將物件傳送至此 Cmdlet。
輸出
此 Cmdlet 只會傳回只具有所選屬性的輸入物件。
備註
Windows PowerShell 包含下列的 Select-Object
別名:
select
的 Select-Object
優化功能僅適用於在處理物件時寫入管線的命令。 它不會影響緩衝區處理物件的命令,並將其寫入為集合。 立即寫入物件是 Cmdlet 設計最佳做法。 如需詳細資訊,請參閱強式鼓勵開發指導方針中的將單一記錄寫入管線。