← Engineering Workflow

ENGINEERING WORKFLOW · 66

PowerShell Files / Scripts:把「我手動做過」變成「任何人可重跑」

當一組 commands 需要重複執行、需要接受參數、需要在失敗時停止,它就不該永遠留在聊天紀錄或 terminal history。Script 是把 procedure 變成 versioned executable artifact。

Learning outcomes

1. File operations 先分 inspect 與 mutate

Get-ChildItem .\lessons
Get-Content .\package.json
Select-String -Path .\lessons\*.html -Pattern "Knowledge check"

先觀察再修改。大量 Remove-Item / overwrite 之前,應確認 path 與 target set。

2. Script parameter

param(
  [Parameter(Mandatory)]
  [string]$RepoRoot
)

Set-Location $RepoRoot
git status

把會變動的值做成 parameter,不要把每台機器不同的 path 全部 hard-code。

3. External command failure 要明確傳播

node .\scripts\check-site.mjs

if ($LASTEXITCODE -ne 0) {
  throw "Site check failed"
}

否則前一步失敗,script 仍可能繼續做 deploy/delete 等後續操作。

4. Path 應從已知 root 建構

$lessonDir =
  Join-Path
    $RepoRoot
    "lessons"

Get-ChildItem $lessonDir

這比假設 caller 已經 cd 到某個位置更穩。

5. Script policy 與 trust

PowerShell execution policy、signed scripts、下載來源標記都屬執行環境安全的一部分。不要為了「跑得動」就長期把整台機器安全設定放到最寬鬆。

Project checkpoint:Course Workspace v5

建立 verify-course.ps1:接受 repo root,確認 Git clean/dirty 狀態、跑 syntax/site checks,任一步失敗就 non-zero 結束。

param([string]$RepoRoot)

Set-Location $RepoRoot

npm run check:js
if ($LASTEXITCODE -ne 0) {
  exit $LASTEXITCODE
}

npm run check
exit $LASTEXITCODE

Debug evidence:同一 script 在你電腦可以、CI 不行

比較 cwd、PATH、PowerShell version、environment variables、file path case、已安裝 tools。Script 若偷偷依賴個人 shell profile,就不是真正可重現。

Knowledge check

  1. 何時值得把 commands 變成 script?
  2. 為什麼 script 不應假設 caller cwd?
  3. external process exit code 怎麼轉成 script failure?
  4. 把三個手動驗證 command 重構成一個 parameterized script。