陣列與雜湊表
真實的工作幾乎都要處理「很多筆」資料:一批檔案、一堆伺服器名稱、一組設定值。PowerShell 最常用的兩種容器是陣列(依序排列的清單)與雜湊表(用名稱查值的字典),再加上把它們組合成自訂物件的 [pscustomobject]。
陣列(Array)
陣列是有順序的一串值,用逗號分隔,或用 @( ) 建立:
$servers = 'web01', 'web02', 'db01'
$nums = @(1, 2, 3, 4, 5)
$range = 1..5 # 範圍運算子:1 2 3 4 5
$empty = @() # 空陣列
存取元素
索引從 0 開始,負數表示從尾端算起:
$servers[0] # web01(第一個)
$servers[-1] # db01(最後一個)
$servers[0..1] # web01, web02(切片)
$servers.Count # 3(元素個數)
常用操作
$servers -contains 'db01' # True:陣列是否包含某個值
'db01' -in $servers # True:同上,寫法相反
$servers.Count -gt 0 # 判斷陣列是否有內容
$servers | Where-Object { $_ -like 'web*' } # 篩選:web01, web02
新增元素的注意事項
PowerShell 的陣列大小固定。+= 看似在「加入」元素,其實是建立一個新陣列、複製舊資料再附加。資料量小時沒差別,但在迴圈裡累加成千上萬筆就會變得很慢。需要大量新增時,改用 List:
$list = [System.Collections.Generic.List[string]]::new()
$list.Add('web01')
$list.Add('web02')
$list.Count # 2
用管線取得陣列
Get- 系列指令若回傳多筆結果,你拿到的就是陣列。但只回傳一筆時,拿到的是單一物件而不是陣列。需要保證是陣列時,用 @( ) 包起來:
雜湊表(Hashtable)
雜湊表以「鍵(key)=值(value)」成對儲存資料,用鍵來查值,類似其他語言的字典(dictionary)。
$user = @{
Name = 'Victor'
Age = 42
Roles = 'admin', 'editor'
}
$user['Name'] # Victor
$user.Name # Victor(用屬性方式取值,等價)
$user.Roles[0] # admin
新增、修改、刪除
$user['Email'] = 'v@example.com' # 新增鍵,或更新既有鍵的值
$user.Age = 43 # 修改
$user.Remove('Roles') # 刪除
$user.ContainsKey('Name') # True:是否有這個鍵
逐項走訪
雜湊表直接丟進管線會被當成「一個物件」,需要走訪鍵值時用 .GetEnumerator():
保持順序
一般雜湊表不保證順序。需要依加入順序輸出時,加上 [ordered]:
自訂物件:[pscustomobject]
把雜湊表轉成物件,就能像其他 cmdlet 的輸出一樣,用點號取屬性、送進管線、匯出成 CSV 或 JSON。這是自己組資料時最實用的做法:
$people = @(
[pscustomobject]@{ Name = 'Amy'; Score = 92 }
[pscustomobject]@{ Name = 'Bob'; Score = 78 }
[pscustomobject]@{ Name = 'Cathy'; Score = 85 }
)
$people | Where-Object Score -ge 80 | Sort-Object Score -Descending
Splatting:用雜湊表傳參數
當指令有很多參數,單行會很長。可以把參數放進雜湊表,再用 @ 符號(不是 $)展開傳入:
這樣參數一目了然,也方便根據條件增減。
怎麼選
- 一串同性質的值(檔名、伺服器名稱)→ 陣列
- 用名稱查對應值、或表示一份設定 → 雜湊表
- 要當作「一筆紀錄」在管線與匯出中使用 →
[pscustomobject]