iT邦幫忙

2024 iThome 鐵人賽

DAY 12
0

透過 cmdlet 所產生出來的物件所擁有的屬性很多,但是 PowerShell 是依賴預設設定和規則來決定最後輸出到螢幕上的結果,書中透過第 11 章「格式化:為何要在最後完成」中講述如何覆蓋這些預設設定,並為你的命令輸出結果建立自己的格式。


使用預設的格式

書中以 cmdlet Get-PSReadLineKeyHandler 進行解釋,當執行該指令時,他會預設呈現以下格式:
https://ithelp.ithome.com.tw/upload/images/20240926/20168708A5vRwJ3TCI.png
在 Windows PowerShell 5.1 及更早版本中,格式化文件( *.ps1xml)位於 $PSHOME 目錄下,然而,在 PowerShell 7 及更高版本中,這些默認的格式化文件不再以獨立的 .ps1xml 文件形式存在。相反,這些格式化定義被嵌入到程序集(DLL)中,例如 Microsoft.PowerShell.ConsoleHost.dll。
而書中所提到的這個 cmdlet 正好不屬於核心模塊並且我們可以透過檢視其 PSReadLine.format.ps1xml 的內容以了解如何查看格式化文件。

1. 確認 Get-PSReadLineKeyHandler 物件類型

TypeName: Microsoft.PowerShell.KeyHandler
https://ithelp.ithome.com.tw/upload/images/20240926/20168708p4e3JWtmV4.png

2. 查詢 Microsoft.PowerShell.KeyHandlerPSReadLine.format.ps1xml 的設定

PS /usr/local/microsoft/powershell/7/Modules/PSReadLine> code ./PSReadLine.format.ps1xml

紅框是整個 Microsoft.PowerShell.KeyHandler 的預設顯示方式的規則,而黃框是呈現 Table 的欄位及內容等定義。
https://ithelp.ithome.com.tw/upload/images/20240926/20168708uXNPDvqDWc.png


格式化為表格

Format-Table(簡寫為 ft)cmdlet 允許您將輸出格式化為表格形式,並指定要顯示的屬性。
這在需要對比多個物件的屬性時非常有用。

範例:

原先的 Get-Process 輸出

https://ithelp.ithome.com.tw/upload/images/20240926/20168708zGu4ZvRGVN.png

透過 Format-Table 自定義要看的欄位

https://ithelp.ithome.com.tw/upload/images/20240926/20168708bpEcQjFGH9.png


格式化為清單

Format-List(簡寫為 fl)cmdlet 將每個物件的屬性以清單形式顯示,適合查看單個物件的詳細資訊或當物件有大量屬性時使用。

範例

將名為 pwsh 的進程的所有屬性以清單形式顯示。

Get-Process | Where-Object { $_.ProcessName -eq "pwsh" } | Format-List *

https://ithelp.ithome.com.tw/upload/images/20240926/201687087AFzKKFvaO.png


格式化為多欄位清單

Format-Wide(簡寫為 fw)cmdlet 允許您以多欄方式顯示單一屬性的值,適合在螢幕上橫向空間充足時使用。

範例

原先 Get-Command 的格式

https://ithelp.ithome.com.tw/upload/images/20240926/20168708Z7gUAJi1Tm.png

將所有命令的名稱透過 Format-Wide 以三欄的方式顯示。

https://ithelp.ithome.com.tw/upload/images/20240926/20168708xAyqcxR4ck.png


資料輸出:儲存成檔案或顯示在主機上

除了在主機上顯示資料外,您還可以將資料輸出到檔案,例如文字檔、CSV、JSON 等,以便於後續處理或分享。

範例

# 將進程列表導出為 CSV 檔案
Get-Process | Export-Csv -Path "processes.csv" -NoTypeInformation

# 將服務列表導出為文字檔案
Get-Service | Out-File -FilePath "services.txt"

# 將物件序列化為 JSON 格式
Get-Process | ConvertTo-Json | Out-File -FilePath "processes.json"

另一種輸出格式:GridView

Out-GridView cmdlet 允許您在圖形化介面中查看資料,並提供即時的篩選和排序功能。( Windows 系統才能用)

範例

Get-Process | Out-GridView

此命令將進程列表在新的視窗中顯示,您可以在其中篩選和排序資料。


常見的困惑點

總是最後才格式化

在管道中,格式化 cmdlet(如 Format-TableFormat-List)應該放在最後一個,因為一旦物件被格式化,它們就不再是原始物件,而是格式化後的資料塊,無法再進行物件層級的處理。

# 正確的順序
Get-Service | Where-Object { $_.Status -eq "Running" } | Format-Table Name, Status

# 錯誤的順序
Get-Service | Format-Table Name, Status | Where-Object { $_.Status -eq "Running" }

在錯誤的範例中,Where-Object 無法對格式化後的物件進行篩選。

請一次只處理一種類型的物件

在管道中,建議一次只處理一種類型的物件,以避免格式化或處理上的混亂。

# 建議的做法
Get-Process | Format-Table

# 不建議的做法
Get-Process; Get-Service | Format-Table

在不建議的範例中,Get-ProcessGet-Service 產生的物件類型不同,直接一起格式化可能導致輸出結果不一致或難以閱讀。


明日主題

Day 13 - 篩選與比較


上一篇
Day 11 - 深度探索管線 Part 2
下一篇
Day 13 - 篩選與比較
系列文
《30天挑戰精通 PowerShell:從 Windows Server 到 Azure DevOps 自動化之旅》30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言