條件與迴圈
腳本要能「看情況做事」與「重複做事」。條件判斷用 if,重複用 foreach 等迴圈。這兩個是腳本語法中最常用的部分,掌握 if 和 foreach 就能完成大多數工作。
if 條件判斷
括號裡放的是會得到真或假的運算式。PowerShell 的比較運算子用文字,不用符號:
| 運算子 | 意思 | 運算子 | 意思 |
|---|---|---|---|
-eq |
等於 | -ne |
不等於 |
-gt |
大於 | -ge |
大於等於 |
-lt |
小於 | -le |
小於等於 |
-like |
萬用字元比對 | -match |
正規表示式比對 |
-in |
值在集合內 | -contains |
集合含有某值 |
-and |
且 | -or |
或 |
-not 或 ! |
反向 |
字串比較預設不分大小寫
'ABC' -eq 'abc' 的結果是 True。需要區分大小寫時,使用 -ceq、-clike 等前面加 c 的版本。
測試路徑是否存在
腳本中常用 Test-Path 先確認檔案或資料夾存在:
if (Test-Path 'C:\Logs') {
Get-ChildItem 'C:\Logs'
}
else {
New-Item -ItemType Directory -Path 'C:\Logs' | Out-Null
}
foreach 迴圈
foreach 對集合中的每一個元素執行一次區塊:
foreach 語句與管線中的 ForEach-Object 不同:foreach 先把整個集合載入記憶體再逐一處理,速度快、寫法直覺;ForEach-Object 邊接收管線輸出邊處理,適合資料量大或需要串流的情況。
# 兩者結果相同,寫法不同
foreach ($f in Get-ChildItem *.log) { $f.Name }
Get-ChildItem *.log | ForEach-Object { $_.Name }
其他迴圈
# for:需要計數器時
for ($i = 1; $i -le 3; $i++) {
"第 $i 次"
}
# while:條件成立就重複(先判斷再執行)
$n = 0
while ($n -lt 3) {
$n++
}
# do...while:至少執行一次,再判斷
do {
$answer = Read-Host '輸入 y 繼續'
} while ($answer -ne 'y')
在迴圈中,break 立即跳出整個迴圈,continue 跳過這一輪、直接進入下一輪。
switch:多選一
同一個值要與很多種情況比對時,switch 比一長串 elseif 清楚:
switch ($env:OS) {
'Windows_NT' { 'Windows' }
default { '其他系統' }
}
switch -Wildcard ($fileName) {
'*.log' { '記錄檔' }
'*.csv' { '資料檔' }
default { '未知類型' }
}
PowerShell 7 的新運算子
PowerShell 7 加入了幾個其他語言常見的簡寫,能讓條件式更短。這些在 Windows PowerShell 5.1 不能用。
# 三元運算子:條件 ? 為真時 : 為假時
$label = ($score -ge 60) ? '及格' : '不及格'
# 空值合併:左邊是 $null 就用右邊
$port = $env:APP_PORT ?? 8080
# 空值合併指派:變數是 $null 時才指派
$name ??= 'guest'
# 管線鏈:前一個成功才執行下一個(&&),失敗才執行(||)
Get-Item ./config.json && '設定檔存在'
平行處理
PowerShell 7 的 ForEach-Object -Parallel 可以同時處理多筆資料,適合每一筆都要等網路或磁碟的工作:
五筆工作各等 1 秒,平行執行下總共約 1 秒完成,而不是 5 秒。-ThrottleLimit 限制同時執行的數量。
推薦影音
官方:PowerShell 7 新運算子
簡述:PowerShell 團隊說明 PowerShell 7 新增的運算子(約 12 分鐘),對應本頁最後的「新運算子」一節。這是 PowerShell 7.0 發布時的影片,示範的運算子至今仍是 PowerShell 7 的標準功能。
官方:ForEach-Object -Parallel
簡述:PowerShell 團隊示範 ForEach-Object -Parallel 平行處理(約 5 分鐘),對應本頁「平行處理」一節。