PowerShell Windows Cross-Shell Scripting Pitfalls¶
概念概覽
路徑問題¶
核心知識¶
路徑問題¶
PowerShell 呼叫 bash subprocess 時,反斜線路徑會被吃掉。應全程用 PowerShell 避免跨 shell 的 PATH 與路徑問題。
ConvertTo-Json 陣列序列化¶
ConvertTo-Json 對單一字串**不會自動序列化成陣列**:
多重賦值陷阱¶
# 危險:$ecr 變成單元素陣列,非字串
$local, $ecr = @('a', 'b')
# 安全:用索引存取
$pair = @('a', 'b')
$local = $pair[0]; $ecr = $pair[1]
二進位檔案重導向¶
pg_dump 二進位格式透過 PowerShell > redirect 會被轉成 UTF-16 破壞檔案。必須用:
cmd /c 保持二進位安全輸出。
經驗教訓¶
-
PowerShell 的 > redirect 對二進位輸出有破壞性,pg_dump 等二進位工具必須用 cmd /c 包裝
-
ConvertTo-Json 單一字串不自動變陣列是常見 SSM --parameters 序列化 bug 來源
-
Windows 上 DevOps 腳本全程 PowerShell 比混用 bash 更可維護
常見陷阱¶
-
PowerShell > redirect 將二進位輸出轉 UTF-16,破壞 pg_dump binary format
-
ConvertTo-Json 不自動包裝單一字串為陣列
-
多重賦值 $a, $b = @(...) 讓後面的變數變成陣列型別
最佳實踐¶
-
二進位輸出重導向一律用 cmd /c 包裝
-
強制陣列序列化用 @($var) | ConvertTo-Json
-
Windows DevOps 腳本全程 PowerShell,不混用 bash subprocess
相關概念¶
來源 Sessions¶
| 日期 | Session | 貢獻摘要 |
|---|---|---|
| 2026-04-07 | 9632bcf1-7666-464a-9364-4b237ee0291b | 記錄 Windows PowerShell 驅動 Docker/bash 的具體陷阱:路徑、ConvertTo-Json 行為、多重賦值、二進位重導向 |