選取資料
執行命令可能可以提供強大的功能,您可以從您的本機機器或從網路上取得資料。 若要更有效率,您必須了解如何取得所需的資料。 大部分的命令都會以輸入或輸出 (或兩者) 的形式在物件上運作。 物件具有屬性,而且您可以存取那些屬性的子集,並將其呈現在報表中。 您也可以根據一或多個屬性來將資料排序。 但應該如何達成該目的?
使用 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-Table 或 Format-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
從預設回應中,Id 和 ProcessName 屬性很可能具有相同的名稱,但是 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
除了依資料行名稱進行排序之外,您也可以提供自己的自訂運算式。 在此範例中,我們使用自訂運算式來依據 Name 和 CPU 資料行排序,並控制每個資料行的排序順序。
Get-Process 'some process' | Sort-Object -Property @{Expression = "Name"; Descending = $True}, @{Expression = "CPU"; Descending = $False}
上述範例示範了 Sort-Object 的強大與彈性。 此主題較為進階,而且已超出此課程模組的範圍,但我們將會在更為進階的課程模組中加以討論。