一覧へEnglish

T09

.cmd / .bat のコメントが、コマンドとして実行される

症状

rem で書いた日本語のコメントの一部が「内部コマンドまたは外部コマンド…として認識されていません」になる。途中の行が飛ばされることもある。文字コードを直しても直らない。

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
$k = [string][char]0x65E5 + [char]0x672C
[IO.File]::WriteAllText("$d\lf.cmd", "@echo off`nrem $k$k$k comment`nrem $k more`necho START`necho END`n", [Text.Encoding]::GetEncoding(932))
$o = cmd /c "`"$d\lf.cmd`" 2>&1" | Out-String; $e = $LASTEXITCODE
$extra = @($o -split "`r?`n" | Where-Object { $_.Trim() -ne '' -and $_.Trim() -ne 'START' -and $_.Trim() -ne 'END' })
$o; "console code page $([Console]::OutputEncoding.CodePage), exit=$e, unexpected lines=$($extra.Count)"
if ($e -ne 0 -or $o -notmatch 'START' -or $extra.Count -gt 0) { 'REPRODUCED' } else { 'NOT REPRODUCED' }

なぜ起きるか

本当の原因は改行。LF だけの .cmd を、cmd.exe がコードページ 932 で読むと、行の区切りを誤ってコメントの途中からを1行として実行する。コードページを 65001(UTF-8)にした端末や Claude Code の Bash ツールの中では起きないので、そこで試すと気づけない。

直し方

.cmd / .bat は改行を CRLF にして保存する。git なら .gitattributes に *.cmd text eol=crlf。

$enc = [Text.Encoding]::GetEncoding(28591)   # 1文字=1バイトで読み書きし、中身のバイトを変えない
$t = [IO.File]::ReadAllText($path, $enc)
$t = ($t -replace "`r`n", "`n") -replace "`n", "`r`n"
[IO.File]::WriteAllText($path, $t, $enc)

作者の PC での結果

cp932 で壊れ、cp65001 では通った

作者の 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 で公開)

ほかの症状