一覧へEnglish

T02

-File で渡した2つ目の引数が、エラーなしで消える

症状

[string[]] の引数に -Path a b と2つ渡したのに、スクリプトには a しか入っていない。エラーも出ず、終了コードも 0。

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\arr.ps1", 'param([string[]]$Path) "count=$($Path.Count) first=$($Path[0])"')
$o = powershell -NoProfile -ExecutionPolicy Bypass -File "$d\arr.ps1" -Path a b; $e = $LASTEXITCODE
"$o  exit=$e"
if ($o -eq 'count=1 first=a' -and $e -eq 0) { 'REPRODUCED' } else { 'NOT REPRODUCED' }

なぜ起きるか

-File で呼ぶと、引数は文字列のまま1つずつ渡る。-Path に入るのは a だけで、b はどの引数にも当たらない余りとして $args に回り、そのまま捨てられる。

直し方

param の前に [CmdletBinding()] を付ける。余った引数があるとエラーで止まるようになる。複数の値は1つの文字列で受けて、自分で分ける(次の T03)。

[CmdletBinding()]
param([string]$Path)
$paths = $Path -split ','

作者の PC での結果

count=1 first=a、終了コード 0([CmdletBinding()] を付けると終了コード 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 で公開)

ほかの症状