跳轉至

建立 2026-09-19 更新 2026-09-19

陣列與雜湊表

真實的工作幾乎都要處理「很多筆」資料:一批檔案、一堆伺服器名稱、一組設定值。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- 系列指令若回傳多筆結果,你拿到的就是陣列。但只回傳一筆時,拿到的是單一物件而不是陣列。需要保證是陣列時,用 @( ) 包起來:

$files = @(Get-ChildItem *.log)
$files.Count    # 即使只有一個檔案或沒有檔案,也能正確得到 1 或 0

雜湊表(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()

foreach ($entry in $user.GetEnumerator()) {
    "$($entry.Key) = $($entry.Value)"
}

保持順序

一般雜湊表不保證順序。需要依加入順序輸出時,加上 [ordered]

$config = [ordered]@{
    Host = 'localhost'
    Port = 8080
}

自訂物件:[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:用雜湊表傳參數

當指令有很多參數,單行會很長。可以把參數放進雜湊表,再用 @ 符號(不是 $)展開傳入:

$params = @{
    Path    = 'C:\Logs'
    Filter  = '*.log'
    Recurse = $true
}
Get-ChildItem @params

這樣參數一目了然,也方便根據條件增減。

怎麼選

  • 一串同性質的值(檔名、伺服器名稱)→ 陣列
  • 用名稱查對應值、或表示一份設定 → 雜湊表
  • 要當作「一筆紀錄」在管線與匯出中使用 → [pscustomobject]

相關資料