共用方式為


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>]

Description

Select-Object Cmdlet 會選取物件或物件集的指定屬性。 它也可以選取唯一物件、指定的物件數目,或陣列中指定位置中的物件。

若要從集合中選取物件,請使用 FirstLastUniqueSkipIndex 參數。 若要選取物件屬性,請使用 Property 參數。 當您選取屬性時,Select-Object 會傳回只有指定屬性的新物件。

從 Windows PowerShell 3.0 開始,Select-Object 包含一項優化功能,可防止命令建立及處理未使用的物件。

當您在命令管線中包含 Select-ObjectIndex 參數的 命令時,即使產生物件的命令出現在管線中 Select-Object 命令之前,也會停止產生物件的命令。 若要關閉此優化行為,請使用 Wait 參數。

範例

範例 1:依屬性選取物件

此命令會建立具有進程物件之 NameID和工作集 (WS) 屬性的物件。

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

範例 2:依屬性選取物件並格式化結果

此命令會取得計算機上進程所使用的模組相關信息。 它會使用 Get-Process Cmdlet 來取得電腦上的程式。

它會使用 Select-Object Cmdlet,輸出 [System.Diagnostics.ProcessModule] 實例的陣列,如 所輸出的每個 Get-Process 屬性所包含。

此命令會使用 Cmdlet 的 Select-Object 參數來選取行程名稱。 這會將 ProcessNameNoteProperty 新增至每個 [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:選取使用最多記憶體的進程

此命令會取得使用最多記憶體的五個進程。 Get-Process Cmdlet 會取得電腦上的進程。 Sort-Object Cmdlet 會根據記憶體(工作集)使用量來排序進程,而 Select-Object Cmdlet 只會選取結果物件數位的最後五個成員。

Wait 參數不需要在包含 Sort-Object Cmdlet 的命令中,因為 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 來選取電腦名稱清單中的第一部電腦。 產生的計算機清單會設定為 Cmdlet New-PSSession 參數的值。

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

範例 7:重新命名檔案,然後選取數個要檢閱的檔案

此命令會將 「-ro」 後綴新增至具有唯讀屬性的文字檔基底名稱,然後顯示前五個檔案,讓使用者可以看到效果的範例。

此命令會使用 FileSystem Cmdlet Get-ChildItem 動態參數來取得只讀檔案。 它會使用管線運算符 (|) 將檔案傳送至重新命名檔案的 Rename-Item Cmdlet。 它會使用 Rename-Item 參數,將重新命名的檔案傳送至 Select-Object Cmdlet,其會選取前 5 個顯示專案。

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 傳遞至 Property 參數會導致 Select-Object 評估傳遞的每個物件上的表達式,並將結果新增至輸出。 在 ScriptBlock中,您可以使用 $_ 變數來參考管線中的目前物件。

根據預設,Select-Object 會使用 ScriptBlock 字串作為屬性的名稱。 使用 Hashtable,您可以將 Script Block 的輸出標示為新增至每個物件的自定義屬性。 您可以將多個匯出屬性新增至傳遞至 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 從作業中排除的屬性。 允許通配符。 只有當命令也包含 Property 參數時,此參數才有效。

類型:String[]
Position:Named
預設值:None
必要:False
接受管線輸入:False
接受萬用字元:True

-ExpandProperty

指定要選取的屬性,並指出應該嘗試展開該屬性。

  • 如果指定的屬性是陣列,陣列的每個值都會包含在輸出中。
  • 如果指定的屬性是 物件,則會針對每個 InputObject 展開物件屬性

不論是哪一種情況,物件的 Type 輸出都會符合展開屬性的 Type

如果指定了 Property 參數,Select-Object 會嘗試將每個選取的屬性新增為 NoteProperty 至每個輸出的物件。

警告

如果您收到錯誤:選取 :無法處理屬性,因為屬性 <PropertyName> 已經存在,請考慮下列事項。 請注意,使用 -ExpandProperty時,Select-Object 無法取代現有的屬性。 這表示:

  • 如果展開的物件具有相同名稱的屬性,就會發生錯誤。
  • 如果 Selected 物件具有與 Expanded objects 屬性相同的屬性,則會發生錯誤。
類型: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 成員至輸出物件。 允許通配符。

Property 參數的值可以是新的導出屬性。 若要建立導出的屬性,請使用哈希表。 有效的金鑰如下:

  • 名稱(或標籤):<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 會依命令管線中出現的順序執行命令,並讓他們產生所有物件。 根據預設,如果您在命令管線中包含 Select-ObjectIndex 參數的 命令,PowerShell 會在產生選取的物件數目后立即停止產生物件的命令。

此參數是在 Windows PowerShell 3.0 中引進的。

類型:SwitchParameter
Position:Named
預設值:None
必要:False
接受管線輸入:False
接受萬用字元:False

輸入

PSObject

您可以使用管線將任何物件傳送至 Select-Object

輸出

PSObject

備註

  • 您也可以透過內建別名來參考 Select-Object Cmdlet,select。 如需詳細資訊,請參閱 about_Aliases
  • Select-Object 的優化功能僅適用於在處理物件時寫入管線的命令。 它不會影響緩衝區處理物件的命令,並將其寫入為集合。 立即寫入物件是 Cmdlet 設計最佳做法。 如需詳細資訊,請參閱 MSDN 連結庫中 強式鼓勵的開發指導方針 將單一記錄寫入管線。