iT邦幫忙

DAY 7
6

強而有力的 Windows PowerShell系列 第 7

Windows PowerShell 基本操作 - 將執行的結果格式化

Windows PowerShell 提供 1 組 cmdlet 來讓我們將執行的結果加以格式化。
在 Windows PowerShell 裡,有 1 組以 Format 帶頭的 cmdlet 可以將執行的結果加以格式化,如此一來,我們便可決定要如何顯示結果。

這組格式化的 cmdlet 有下列幾種:
Format-Wide (別名是 fw
Format-List(別名是 fl
Format-Table(別名是 ft
Format-Custom(別名是 fc

在此僅討論前 3 種。每種格式化的 cmdlet 都有其預設的屬性,因此我們不需特別指定所要顯示的屬性。而且每種格式化的 cmdlet 也都使用相同的參數:Property,來指定所要顯示的屬性有哪些。

Format-Wide
就先用 Format-Wide 的基本型來查看目前執行中的程序,以 ie 帶頭的有哪些:

Get-Process -Name ie* | Format-Wide

沒指定任何參數,就會顯示 2 欄的結果

接著加入參數:Property 以便指定只看程序的識別碼(亦即 Id 欄位)為何:

Get-Process -Name ie* | Format-Wide -Property Id

看完這兩個執行結果,不知道大家有沒有發現到一件事情,那就是 Format-Wide 一次只能顯示 1 個屬性。因此,當我們希望每 1 行只顯示 1 個結果時,就可以再加入 Column 1 參數:

Get-Process -Name ie* | Format-Wide -Property Id -Column 1

附註:
簡化後的指令:

ps -N ie* | fw -P Id -C 1

再簡化一次:

ps ie* | fw Id -C 1

看出差異沒有?其實不用特別將 NameProperty 參數寫出來,Windows PowerShell 的 Get-ProcessFormat-Wide 就會知道要找執行程序名稱是什麼,以及要把哪些欄位的屬性列出來。不過,還是老話一句,不要把指令簡寫的太過火,不然就是要加上相關的註解。

如果您要在每一行顯示多個欄位,卻又不希望每個欄位的字會因為指定過多的欄位個數而被截斷,可以使用 AutoSize 參數,以便讓 Windows PowerShell 自動計算出最佳的欄位個數:

Get-Process | Format-Wide -AutoSize

Format-List
Format-List cmdlet 會將結果的每一個屬性,逐行以清單方式列示出來,所以使用 Format-List 可以顯示結果的全部或部分屬性。直接看例子比較清楚,沒有指定任何參數:

Get-Process ie* | Format-List

使用 Property 參數指定只顯示產品名稱、識別碼、與檔案版本:

Get-Process ie* | Format-List Product, Id, FileVersion

以下面的指令而言,使用萬用字元 *,單單 1 個程序就會列出高達 60 多個屬性結果:

Get-Process ie* | Format-List *

Format-Table
Format-Table cmdlet 會將結果以整齊的表格方式呈現,Windows PowerShell 會自動決定每個欄位所要呈現的內容,當然我們可以自訂要顯示哪些欄位。

不加任何參數:

Get-Process -Name ie* | Format-Table

其實上面指令執行的結果就跟使用 Get-Process 不加任何格式化一樣:
Get-Process -Name ie*

自訂顯示某些欄位:
Get-Process ie* | Format-Table Product, Id, FileVersion, Path, Company

某些欄位的結果出現 ...,就表示有些字元被截斷了,這時候就要 AutoSize 參數上場了:
Get-Process ie* | Format-Table Product, Id, FileVersion, Path, Company -AutoSize

雖然使用了 AutoSize 參數,但在結果中,卻看不到公司的欄位。那把 Product 跟 Company 的位置互換,看看結果如何:
Get-Process ie* | Format-Table Company, Id, FileVersion, Path, Product -AutoSize

從上圖中,我們可以發現,Format-Table 會把距離 Property 參數越近的欄位之重要性視為最高,越後面的欄位之重要性越低,所以 Product 欄位就被壯烈地犧牲掉了,不過 Windows PowerShell 還滿貼心的會提醒我們這件事。

如果不希望犧牲任何欄位,請使用 Wrap 參數:
Get-Process ie* | Format-Table -Wrap Product, Id, FileVersion, Path, Company

使用 Format-Table 的另外一個好處是,搭配 GroupBy 參數可以把某個欄位值相同的排在一起,以方便進行比對:
Get-Process ie* | Format-Table -Wrap Product, Id, FileVersion, Path -AutoSize -GroupBy Path

只要建立擁有 2 個鍵值:LabelExpression 的雜湊表(Hash Table)便可進行計算,其中的 Label 鍵值是代表計算後的欄位名稱,而 Expression 鍵值則是一段計算結果的程式碼。以下面的程式碼為例,就是計算出 IE 瀏覽器已經執行多久的時間:
Get-Process iexplore | Format-Table ProcessName, @{Label="已經執行多久時間"; Expression={(get-date) - $_.StartTime}}

有時候,會因為要寫的程式碼過長,所以我們會使用 ****</span> 這個符號來告訴 Windows PowerShell 說,這行的程式碼到這邊為止,新的要從下一行開始: Get-Process iexplore | Format-Table ProcessName,
@{Label="已經執行多久時間"; Expression={(get-date) - $_.StartTime}} `
-AutoSize


上一篇
Windows PowerShell 基本操作 - 管線
下一篇
Windows PowerShell 基本操作 - 執行 Windows 的程式
系列文
強而有力的 Windows PowerShell33
0
alexc
iT邦高手 1 級 ‧ 2009-10-04 02:00:48

為了編輯這篇文章
我足足花了一個多小時
在跟 bbcode 奮戰
因為不管怎麼改
程式碼的內容居然都會自動變成一樣的
最後我投降了
實在是累了
所以有部分的程式碼
就請自行辛苦點
剪下、貼上多操作幾次吧

0
逮丸逮丸
iT邦大師 1 級 ‧ 2009-10-04 07:17:18

以前我也發生過同樣的情形,
就是同一篇文章超過了太多組「CODE」段落
「CODE」段落的程式碼內容就會造成不正常顯示。
所以儘管會有很多的 一行指令,要做說明,
儘量集中在同一個「CODE」的區域,
裡面再用「#」註解符號,放說明內容…
才解決這一網站 太多組「CODE」段落 的問題。

0
alexc
iT邦高手 1 級 ‧ 2009-10-04 07:53:44

原來要這樣用啊
也不失為解法

我要留言

立即登入留言