一覧へEnglish

T01

PowerShell の終了コードが、2 を返したのに 1 になる

症状

スクリプトの中で exit 2 と書いたのに、呼んだ側には 1 が返る。0 と 1 はそのまま返るので、「対象外は 2、失敗は 1」のように分けた判定だけが、黙って崩れる。

30秒で確かめる

PowerShell(Windows PowerShell 5.1)に貼って実行します。一時フォルダ(%TEMP% の下)にだけファイルを作ります。最後に REPRODUCED と出たら、あなたの PC で起きています。

$d = Join-Path $env:TEMP ('cc-trap-' + (Get-Date -Format 'yyyyMMddHHmmss')); New-Item -ItemType Directory $d -Force | Out-Null
[IO.File]::WriteAllText("$d\exit2.ps1", 'exit 2')
powershell -NoProfile -ExecutionPolicy Bypass -File "$d\exit2.ps1"; $a = $LASTEXITCODE
powershell -NoProfile -ExecutionPolicy Bypass -Command "& '$d\exit2.ps1'"; $b = $LASTEXITCODE
"-File=$a  -Command=$b"
if ($a -eq 2 -and $b -eq 1) { 'REPRODUCED' } else { 'NOT REPRODUCED' }

なぜ起きるか

powershell -Command "& 'x.ps1'" の形で呼ぶと、PowerShell はスクリプトの終了コードではなく「最後のコマンドが成功したか」を 0 か 1 で返す。-File で呼べば、スクリプトの終了コードがそのまま返る。

直し方

スクリプトは -File で呼ぶ。どうしても -Command で呼ぶなら、末尾に ; exit $LASTEXITCODE を付ける。

powershell -NoProfile -ExecutionPolicy Bypass -File .\x.ps1
powershell -NoProfile -Command "& '.\x.ps1'; exit $LASTEXITCODE"

作者の PC での結果

-File=2 -Command=1

作者の PC: Windows 11 / Windows PowerShell 5.1.26100 / Python 3.13.7 / Claude Code 2.1.304、日本語の Windows(コードページ 932)。2026-10-20〜22 に確認。

こんな言葉で探した人へ

関連

この穴を最初から踏まないようにした部品(書き込み先を絞る安全装置〈onFailure: block 付き〉、夜の無人実行、ファイルとフックの設定を調べる健康診断、CLAUDE.md の型、試験一式)は cc-win-kit にまとめています。

cc-win-kit 英語版(Payhip、19ドル。日本語版は 2026年10月31日に note で公開)

ほかの症状