ENGINEERING WORKFLOW · 66
PowerShell Files / Scripts:把「我手動做過」變成「任何人可重跑」
當一組 commands 需要重複執行、需要接受參數、需要在失敗時停止,它就不該永遠留在聊天紀錄或 terminal history。Script 是把 procedure 變成 versioned executable artifact。
Learning outcomes
- 能安全讀寫/搜尋檔案。
- 能建立接受參數的
.ps1。 - 能處理 external process exit code。
- 能避免依賴隱藏的 current directory / machine state。
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 $LASTEXITCODEDebug evidence:同一 script 在你電腦可以、CI 不行
比較 cwd、PATH、PowerShell version、environment variables、file path case、已安裝 tools。Script 若偷偷依賴個人 shell profile,就不是真正可重現。
Knowledge check
- 何時值得把 commands 變成 script?
- 為什麼 script 不應假設 caller cwd?
- external process exit code 怎麼轉成 script failure?
- 把三個手動驗證 command 重構成一個 parameterized script。