變數與型別
變數用來暫存資料,型別決定這份資料能做什麼事(數字可以相加、字串可以串接、日期可以比較先後)。PowerShell 是動態型別語言,通常不需要宣告型別,但了解型別在背後怎麼運作,能避開許多「為什麼結果怪怪的」的狀況。
變數
變數名稱以 $ 開頭,用 = 指派值:
變數名稱不分大小寫($Name 與 $name 是同一個)。PowerShell 也提供一些內建的自動變數:
| 變數 | 內容 |
|---|---|
$_ |
管線中目前處理的那個物件(在 Where-Object、ForEach-Object 的大括號內) |
$null |
表示「沒有值」 |
$true、$false |
布林值 |
$PSVersionTable |
PowerShell 版本與環境資訊 |
$HOME |
目前使用者的家目錄 |
$env:名稱 |
環境變數,例如 $env:PATH、$env:USERNAME |
五種最常用的型別
| 型別 | 說明 | 範例 |
|---|---|---|
[string] |
文字 | 'hello'、"hello" |
[int] |
整數 | 42 |
[double] |
帶小數的數字 | 3.14 |
[bool] |
布林值,只有真與假 | $true、$false |
[datetime] |
日期與時間 | Get-Date |
用 .GetType() 可以查出任何值的型別:
字串
單引號與雙引號的差別是最常見的初學者困惑:
$name = 'Victor'
'Hello, $name' # 單引號:原樣輸出,得到 Hello, $name
"Hello, $name" # 雙引號:會展開變數,得到 Hello, Victor
雙引號字串中要放屬性或運算式,需要用 $( )(子運算式)包起來,否則只會展開變數本身:
$p = Get-Process | Select-Object -First 1
"名稱:$p.Name" # 錯:只展開 $p,屬性 .Name 被當成一般文字
"名稱:$($p.Name)" # 正確
常用的字串運算:
'a,b,c' -split ',' # 拆成陣列:a b c
@('a','b','c') -join '-' # 合併:a-b-c
'Hello World' -replace 'World','PowerShell'
'Total: {0:N2}' -f 1234.567 # 格式化:Total: 1,234.57
'hello'.ToUpper() # 方法:HELLO
多行文字用 here-string,以 @" 開頭、"@ 結尾(結尾符號必須獨佔一行且從第一欄開始):
數值與運算
10 + 3 # 13
10 / 3 # 3.33333333333333
10 % 3 # 1(餘數)
[math]::Round(10 / 3, 2) # 3.33
1KB, 1MB, 1GB # 1024, 1048576, 1073741824(內建的大小單位)
布林與 $null
if 判斷式中,下列值會被視為「假」:$false、$null、0、空字串 ''、空陣列。其他大多視為「真」。
日期
$now = Get-Date
$now.AddDays(7) # 七天後
$now.ToString('yyyy-MM-dd') # 2026-09-19(依你執行的日期)
[datetime]'2026-12-31' - $now # 兩個日期相減得到 TimeSpan(時間間隔)
型別轉換
PowerShell 會在需要時自動轉換型別,也可以用 [型別] 強制轉換:
自動轉換的規則以左邊的運算元為準,這是常見的陷阱:
限制變數型別
在變數前面加上型別,之後指派的值都會自動轉成該型別,轉不過去就報錯,能及早發現資料問題:
何時該寫型別
在函式的參數與腳本的關鍵變數上寫型別,可以擋住不合法的輸入;一次性的互動指令不必逐一標型別。