選取資料

已完成

執行命令可能可以提供強大的功能,您可以從您的本機機器或從網路上取得資料。 若要更有效率,您必須了解如何取得所需的資料。 大部分的命令都會以輸入或輸出 (或兩者) 的形式在物件上運作。 物件具有屬性,而且您可以存取那些屬性的子集,並將其呈現在報表中。 您也可以根據一或多個屬性來將資料排序。 但應該如何達成該目的?

使用 Get-Member 來檢查輸出

當您將命令的結果傳遞給 Get-Member 時,Get-Member 會傳回物件的相關資訊,例如:

  • 傳遞給 Get-Member 的物件類型。
  • 可以評估的物件屬性。
  • 可以執行的物件方法。

讓我們透過針對 Get-Member 命令執行 Get-Process 來示範此事實。

Get-Process | Get-Member

請注意您會如何使用管線 |,且透過呼叫 Get-Member 時,您實際上已經建立管線。 上述陳述式輸出的前幾行看起來會如下所示:

TypeName: System.Diagnostics.Process

Name                       MemberType     Definition
----                       ----------     ----------
Handles                    AliasProperty  Handles = Handlecount
Name                       AliasProperty  Name = ProcessName
NPM                        AliasProperty  NPM = NonpagedSystemMemorySize64
PM                         AliasProperty  PM = PagedMemorySize64
SI                         AliasProperty  SI = SessionId
VM                         AliasProperty  VM = VirtualMemorySize64
WS                         AliasProperty  WS = WorkingSet64
...

輸出會顯示 Get-Process 命令傳回的物件類型 (System.Diagnostics.Process)。 回應的其餘部分會顯示物件成員的名稱、類型和定義。 您可以看到,如果您想要讓 Get-Process 與管線中的另一個命令配合,將其與 Get-Member 配對是很好的第一步。

選擇物件

根據預設,當您執行將輸出至畫面的命令時,PowerShell 會自動新增 Out-Default 命令。 當輸出資料是物件集合時,PowerShell 便會查看物件類型以判斷是否有該物件類型的已註冊檢視。 如果找到任一個,則會使用該檢視。

檢視通常不會包含物件的所有屬性,因為其無法正確地在畫面上顯示,因此檢視中只會包含一些最常見的屬性。

您可以使用 Select-Object 並選擇自己的屬性清單來覆寫預設檢視。 接著您可以將那些屬性傳送到 Format-TableFormat-List,來以您想要的方式顯示資料表。

讓我們以在 Get-Process 處理序上執行 zsh 的結果為例:

 NPM(K)    PM(M)      WS(M)     CPU(s)      Id  SI ProcessName
 ------    -----      -----     ------      --  -- -----------
      0     0.00       0.01       0.38     644 620 zsh
      0     0.00       0.01       0.38     727 727 zsh
      0     0.00       0.01       0.38     731 731 zsh
      0     0.00       0.01       0.38     743 743 zsh
      0     0.00       0.01       0.38     750 750 zsh
      0     0.00       0.88       0.91   15747 …47 zsh
      0     0.00       0.01       0.29   41983 …83 zsh
      0     0.00       1.16       0.31   68298 …98 zsh

您會看到檢視,其中呈現您最想從此命令中看到的結果。 但是,此檢視不會顯示完整的資訊集。 若要查看不同的內容,您可以明確指定想在結果中看到的屬性。

取得完整的回應

您到目前為止所看到的都是有限的回應。 若要呈現完整的回應,您必須使用萬用字元 *,如下所示:

Get-Process zsh | Format-List -Property *

* 字元會顯示每個屬性及其值,讓您調查感興趣的值。 完整回應也會使用屬性的展示名稱,而不是實際的屬性名稱,而展示名稱在報表中的呈現效果不錯。

儘管有這些優點,但您可能不想要完整的資料輸出,也可能不滿足於預設的回應內容。

選取特定資料行

若要限制回應並尋找介於預設回應與完整回應之間的結果,建議您選取自己感興趣的一些屬性,並將其作為 Select-Object 的參數輸入。 但是,這裡的問題在於,您必須針對資料行使用實際名稱。 您要如何找出實際名稱? 使用 Get-Member。 呼叫 Get-Member 可以提供所有屬性及其實際名稱。

尋找實際的屬性名稱

讓我們使用下列子集來快速回顧一下預設回應:

 NPM(K)    PM(M)      WS(M)     CPU(s)      Id  SI ProcessName
 ------    -----      -----     ------      --  -- -----------
      0     0.00       0.01       0.38     644 620 zsh

從預設回應中,IdProcessName 屬性很可能具有相同的名稱,但是 CPU 是展示名稱,實際的屬性名稱通常只會由文字字元所組成,且不包含空格。 若要找出特定屬性的實際名稱,您可以使用 Get-Member

Get-Process zsh | Get-Member -Name C*

您現在會取得名稱開頭為 C 的所有成員清單。 其中一個是 CPU,這可能是您想要的:

TypeName: System.Diagnostics.Process

Name             MemberType     Definition
----             ----------     ----------
CancelErrorRead  Method         void CancelErrorRead()
CancelOutputRead Method         void CancelOutputRead()
Close            Method         void Close()
CloseMainWindow  Method         bool CloseMainWindow()
Container        Property       System.ComponentModel.IContainer Container {get;}
CommandLine      ScriptProperty System.Object CommandLine {get=…
Company          ScriptProperty System.Object Company {get=$this.Mainmodule.FileVersionInfo.CompanyName;}
CPU              ScriptProperty System.Object CPU {get=$this.TotalProcessorTime.TotalSeconds;}

您現在知道如何使用 Select-Object 以正確屬性名稱要求所需的確切內容,如下所示:

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

而這就是結果:

Id Name       CPU
-- ----       ---
644 zsh  0.3812141
727 zsh  0.3826498
731 zsh  0.3784953
743 zsh  0.3776352
750 zsh  0.3824036
15747 zsh  0.9097993
41983 zsh  0.2934763
68298 zsh  0.3121695

此命令序列提供的輸出與預設輸出不同,但是包含您在乎的屬性。

排序

當您在管線中使用 Sort-Object 時,PowerShell 會先使用預設屬性將輸出資料排序。 如果不存在此類屬性,則會嘗試比較物件本身。 排序會依照遞增或遞減順序進行。

透過提供屬性,您可以選擇依特定資料行來排序,如下所示:

Get-Process | Sort-Object -Descending -Property Name

在上述命令中,我們會依據 Name 資料行以遞減順序排序。 若要依據多個資料行排序,請使用逗號分隔資料行名稱,如下所示:

Get-Process | Sort-Object -Descending -Property Name, CPU

除了依資料行名稱進行排序之外,您也可以提供自己的自訂運算式。 在此範例中,我們使用自訂運算式來依據 NameCPU 資料行排序,並控制每個資料行的排序順序。

Get-Process 'some process' | Sort-Object -Property @{Expression = "Name"; Descending = $True}, @{Expression = "CPU"; Descending = $False}

上述範例示範了 Sort-Object 的強大與彈性。 此主題較為進階,而且已超出此課程模組的範圍,但我們將會在更為進階的課程模組中加以討論。