昨天講完 「管道參數綁定」( Pipeline Parameter Binding )後,在實務上,如果遇到需要處理「由其他人建立的物件或資料」時,書中講述了一種方法,這就是自訂屬性(也稱為計算屬性)。
自訂屬性允許你即時創建新的屬性或修改現有的屬性。這在需要重命名屬性以匹配下一個指令的預期輸入時特別有用。
計算屬性是一個具有以下鍵的雜湊表(Hashtable)
@{
Name = 'NewPropertyName';
Expression = { $_.ExistingProperty }
}
假設你有一個檔案的物件集合,並且你希望能顯示檔案名及大小。
Get-ChildItem -File | Select-Object Name, Length | gm
# 取得目前資料夾中的檔案,並新增一個顯示檔案大小的自訂屬性
Get-ChildItem -File | Select-Object Name, @{ Name = 'Size'; Expression = { $_.Length }} | gm
假設你需要顯示檔案的建立時間,但希望用自訂的格式(例如:YYYY-MM-DD HH:MM)。
Get-ChildItem -File | Select-Object Name, CreationTime
Get-ChildItem -File | Select-Object Name, @{ Name = 'CreationDate'; Expression = { $_.CreationTime.ToString('yyyy-MM-dd HH:mm') } }
在 PowerShell 中,小括號 () 用於執行括號內的命令或表達式,並將結果作為一個整體返回。
取得系統日期,然後格式化
PS /Users/kanglin/code/30days> Get-Date
2024年9月25日 星期三 1:07:03
PS /Users/kanglin/code/30days> (Get-Date).ToString('yyyy-MM-dd')
2024-09-25
# 計算所有 .txt 檔案的總大小
Get-ChildItem -File | Where-Object { $_.Name -like '*.txt' } | Measure-Object -Property Length -Sum
# 取得所有 .txt 檔案的集合,然後取 Length 屬性的總和
($files = Get-ChildItem -File | Where-Object { $_.Name -like '*.txt' }).Length | Measure-Object -Sum
不使用小括號時,我們將物件管道傳遞給 Measure-Object,它能夠處理物件集合,並計算指定屬性的統計值。
使用小括號時,小括號內的命令先執行,結果是一個物件陣列。我們直接存取這個陣列的 Length 屬性,這會返回所有檔案大小的數值集合,然後再將這個數值集合傳遞給 Measure-Object。
取得檔案名稱的清單
我們需要使用 Select-Object -ExpandProperty 來提取名稱屬性。
# 取得所有 .txt 檔案的名稱
Get-ChildItem -File | Where-Object { $_.Name -like '*.txt' } | Select-Object -ExpandProperty Name
我們先取得物件的集合,然後直接存取 Name 屬性,這會返回一個名稱的陣列。
# 使用小括號,然後直接存取 Name 屬性
($files = Get-ChildItem -File | Where-Object { $_.Name -like '*.txt' }).Name
在處理物件集合時,可能只需要某一個特定屬性的值,例如名稱、大小、日期等。提取單一屬性可以簡化資料,方便進一步的處理或計算。
-ExpandProperty 直接返回屬性的值,而非包含在物件內。
直接取得屬性值,適合提取單一屬性
使用 ForEach-Object 遍歷每個物件,提取所需的屬性。
適合需要對每個物件進行處理時使用。
對於單一物件或已知名稱的屬性,可以直接存取。
當物件結構簡單或已知時,可以直接使用 物件.屬性 的方式。
# 取得當前使用者的環境變數路徑
$envPath = $env:PATH
Write-Output $envPath
Day 12 - 使你所見更加美觀:格式化