跳轉到

PowerShell Windows Cross-Shell Scripting Pitfalls

概念概覽

路徑問題

核心知識

路徑問題

PowerShell 呼叫 bash subprocess 時,反斜線路徑會被吃掉。應全程用 PowerShell 避免跨 shell 的 PATH 與路徑問題。

ConvertTo-Json 陣列序列化

ConvertTo-Json 對單一字串**不會自動序列化成陣列**:

# 錯誤:輸出 "string" 而非 ["string"]
$cmd | ConvertTo-Json

# 正確:強制包裝成陣列
@($cmd) | ConvertTo-Json

多重賦值陷阱

# 危險:$ecr 變成單元素陣列,非字串
$local, $ecr = @('a', 'b')

# 安全:用索引存取
$pair = @('a', 'b')
$local = $pair[0]; $ecr = $pair[1]

二進位檔案重導向

pg_dump 二進位格式透過 PowerShell > redirect 會被轉成 UTF-16 破壞檔案。必須用:

cmd /c 'docker exec ... pg_dump ... > file.dump'
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 行為、多重賦值、二進位重導向 |


本概念頁面由 Semi-Brain Wiki 系統自動維護

最後更新: 2026-04-07