この記事で切り分けられること
Windows PowerShell 5.1で .ps1 を実行したときに「文字列に終端記号 " がありません」のようなパースエラーが出て、エラー文の中の日本語が化けている場合の原因と直し方を記録する。
症状
本人が install_apply_autopilot.ps1 を実行したところ、次のようなエラーで止まった。
- パースエラー: 文字列に終端記号 " がありません
- エラー文の中で「日付」という日本語が「日仁E」のように化けて表示されていた
スクリプトの内容自体は書き換えていないのに、保存して実行するたびに同じ場所で構文エラーになった。
原因
Windows PowerShell 5.1 は、BOM(バイトオーダーマーク)が付いていないUTF-8ファイルをANSI(cp932)として読み込む。これが原因だった。
- ファイルはUTF-8(BOM無し)で保存されていた
- PowerShellがこれをcp932として解釈したため、日本語部分のバイト列が別の文字に化けた
- 化けた結果、文字列を囲む引用符
"までバイト列に飲み込まれ、構文として壊れた
エラー文の「日仁E」という化け方は、まさにこのcp932誤読の典型的な症状だった。
直し方
ファイルをUTF-8 with BOMで書き直すことで解決した。Pythonでファイルを生成・修正している場合は、保存時のエンコーディング指定を utf-8-sig にする。
with open(r"C:/Users/<あなたのユーザー名>/<あなたのフォルダ>/install_apply_autopilot.ps1", "w", encoding="utf-8-sig") as f:
f.write(script_text)
保存し直したら、実行する前に構文だけを確認する。PowerShell上で次のコマンドを実行し、エラーが出ないことを確かめてから渡す。
$errors = $null
[System.Management.Automation.Language.Parser]::ParseFile(
"C:/Users/<あなたのユーザー名>/<あなたのフォルダ>/install_apply_autopilot.ps1",
[ref]$null,
[ref]$errors
) | Out-Null
$errors
$errors が空であれば構文は壊れていない。
あわせて気をつけたパス指定
実行環境の入力欄(! 実行)はPOSIXシェル経由のため、C:\Users\... のようにバックスラッシュを使うと文字が食われることがあった。次のどちらかで回避する。
- パス区切りをスラッシュにする:
C:/Users/<あなたのユーザー名>/... - パス全体をシングルクォートで囲む
再発防止
- 本人が実行する
.ps1に日本語を書く場合は、必ずBOM付きUTF-8(utf-8-sig)で保存する - 保存後は
[System.Management.Automation.Language.Parser]::ParseFileで構文エラーが無いことを確認してから渡す
それでも駄目なときに次に見る場所
| 確認項目 | 見る場所 |
| ファイルのエンコーディング | エディタやスクリプトでBOM付きUTF-8になっているか再確認する |
| エラー文の日本語が化けているか | 化けていればエンコーディング起因の可能性が高い |
| パスの区切り文字 | 実行する入力欄がPOSIXシェル経由かどうかを確認し、スラッシュまたはシングルクォートを使う |
| ParseFileの結果 | $errors の中身を見て、どの行・どの文字位置でエラーになっているか確認する |

Claude Codeとは何か、実際に投げた依頼文と直し方から説明する
Notion API連携の最初の設定をインテグレーション作成から実際に動かす手順
CSVの文字化けと列ずれが止まる場所をPythonのコードで具体的に潰す手順