一覧へEnglish

T10

powershell -Command の1行に書いた $変数 が、呼ぶ前に消える

症状

powershell -Command "foreach ($i in 1..2) { $i }" が構文エラーになる。中身は正しいのに、子の PowerShell には foreach ( in 1..2) が届いている。

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
powershell -NoProfile -Command "foreach ($i in 1..2) { $i }"; $e = $LASTEXITCODE
"exit=$e"
if ($e -ne 0) { 'REPRODUCED' } else { 'NOT REPRODUCED' }

なぜ起きるか

二重引用符の中の $i は、呼ぶ側の PowerShell が先に展開する(空になる)。展開済みの文字列が子に渡る。

直し方

処理は .ps1 に書いて -File で呼ぶ。1行で渡すなら単一引用符で囲む。

powershell -NoProfile -File .\job.ps1
powershell -NoProfile -Command 'foreach ($i in 1..2) { $i }'

作者の PC での結果

構文エラー、終了コード 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 で公開)

ほかの症状