AIに書かせたPowerShellスクリプトで日本語が壊れるとき、原因のほとんどはファイルの保存形式です。BOMなしUTF-8で保存されたファイルを、Windows PowerShell 5.1が日本語環境のコードページとして読むために起きます。
AiWiLL株式会社代表。AI顧問「WiLLAGENT」で、企業の仕事をAIと人が進められる形にする伴走支援を行っています。記事では、実務で使える手順と、人が確認すべき点を明らかにします。
ただし、この不具合には出方が二つあります。構文エラーで即座に止まる方と、エラーを一つも出さずに「完了」と表示して終わる方です。私が時間を溶かしたのは、後者でした。
「完了」と出た。YouTube Studioには、1本も上がっていなかった
2026年8月14日、自社のアニメチャンネル向けに作った動画22本を、1本ずつYouTubeへアップロードするPowerShellスクリプトを走らせました。1本ずつ上げて、失敗したらそこで止まる、という単純な作りです。
処理は最後まで走りました。エラーメッセージはゼロ。終了コードは0。画面には「完了」と出ています。
念のためYouTube Studioを開きました。何もありませんでした。21本が、1本も上がっていない。
アップロードに失敗したのではありません。一度も試みられていなかったのです。
エラーが出なかった理由は、パスの文字が化けていたこと
このスクリプトはAIに書かせたものでした。日本語のコメントと、日本語を含むフォルダ名(ワークスペース)のパスが入っています。
AIがファイルを書くとき、標準はBOMなしのUTF-8です。macOSでもLinuxでも、これが正しい。問題は読む側にあります。Windows PowerShell 5.1は、BOMのないファイルをシステムのコードページ、つまり日本語環境ではShift_JIS相当として読みます。UTF-8で書かれた日本語は、そこで別の文字列に化けます。
化けたのがコードの構文部分なら、トークン '}' を使用できません のような構文エラーが出て即座に止まります。これは運がいい方です。壊れたことが、その場で分かる。
私の場合、化けたのはパスの文字列でした。すると、こうなります。
Test-Pathが、化けたパスを見てfalseを返す- スクリプトは「そのファイルは存在しない」と正しく判断し、その動画を飛ばす
- これを21回くり返す
- 一度も失敗していないので、終了コードは0
さらに悪いことに、経過を書き出す Add-Content も同じ化けたパスへ書こうとして、無言で失敗していました。だからログすら残っていない。あとから原因を追う手がかりが、自分で消えていたことになります。
| 化けた場所 | 何が起きるか | 気づきやすさ |
|---|---|---|
| コードの構文(括弧・引用符) | 構文エラーで即停止 | すぐ分かる |
| ファイルパスの文字列 | Test-Pathが偽を返し、全件スキップして正常終了 | 気づけない |
| ログ出力先のパス | 記録が一行も残らない | 追跡できなくなる |
幸い、このときは重複アップロードは起きませんでした。何もしていなかったので、壊すものも無かったということです。
直し方は、書いた直後にBOM付きで保存し直す1行
AIにスクリプトを書かせたら、実行する前に保存形式を変換します。
$path = 'C:\Work\upload.ps1'
$code = Get-Content -LiteralPath $path -Raw -Encoding UTF8
[IO.File]::WriteAllText($path, $code, [Text.UTF8Encoding]::new($true))
最後の行の $true が、BOMを付ける指定です。これで5.1もUTF-8として読みます。
ここで一つ、はっきりさせておきます。「Windowsだから全部BOMを付ける」は間違いです。 BOMを嫌う読み手もあります。CSVを取り込む先や、Linux側で動かすスクリプトに付けると、今度はそちらが壊れます。BOMが必要なのは、日本語を含んでいて、Windows PowerShell 5.1が実行する .ps1 です。PowerShell 7では既定がBOMなしUTF-8に統一されているので、そもそもこの問題は起きません。
自分がどちらで動かしているかは、これで分かります。
$PSVersionTable.PSVersion
5.1 から始まっていれば、この記事の話が当てはまります。
本当の教訓は、文字コードの方ではありませんでした
この一件のあと、私が変えたのはスクリプトの書き方ではありません。確認の仕方です。
翌8月15日から、アップロードのあとは必ずAPI側の一覧を取り直し、実物の本数を数えるようにしました。その日は合計22本・予約11本を数えて、初めて「終わった」と判断しています。以来、この手順は続けています。
終了コード0は、「プログラムが最後まで走った」という意味です。「仕事が終わった」という意味ではない。この二つを同じものとして扱っていたことが、本当の原因でした。
私がAIと仕事をしていて、一番時間を溶かすのは止まるエラーではありません。止まらないエラーです。処理は成功する。納期にも間に合う。形も整っている。なのに中身が基準以下か、あるいは何も起きていない。エラーが出てくれるなら、まだ親切な方です。
そして厄介なことに、これは丁寧に一つずつ作っているときには、ほとんど起きません。一度に大量に処理させたときに出ます。量が増えると、人の目という最後の確認が経路から落ちるからです。あの日の21本も、まさにそれでした。
いまのところ、防ぐ手は二つ見つかっています。性格が違います。
一つ目は、成果物が置かれている側を見にいくことです。スクリプトの報告ではなく、YouTube Studioの画面を開く。フォルダの中のファイルを数える。
これはAIに頼んでも構いません。私は「YouTubeに上がっている動画が重複していないか、YouTube側を見て確認して」と頼んだことがあります。すると「なぜかこの動画が2つ重複しています」と返ってきました。作った側の記録ではなく、置かれた側を数えさせたから見つかったものです。
二つ目は、作らせたAIとは別のAIにレビューさせることです。上がってきたファイルを指定して、「レビューして」と言うだけです。役は固定せず、入れ替えています。Claude Codeで作ったらCodexに見せ、Codexで作ったらClaudeに見せる。
返ってくるのは、書き漏らしていた事例の指摘や、記事のトンマナが他とそろっていない、といった指摘です。どれも処理としては成功しているもので、エラーにはなりません。同じAIに「これで合っていますか」と聞くと、自分が作ったものを前提にして見てしまう。別の系統に見せると、その前提を共有していないぶん、抜けやズレが目に入るようです。
私の範囲では、的外れな指摘はあまり出ていません。それでも、レビューを通したこと自体を「確認済み」の証拠にはしていません。レビューは一段目で、最後は自分で実物を見ます。
もしAIに任せた処理が「完了しました」と言ってきたら、成果物のある場所を一度だけ開いてみてください。それだけで、この記事のような時間は防げます。
ファイルが見つからないと言われる場合はWindowsのパスを確認する順番、担当者へ引き継ぐ場合はエラーログ共有テンプレートが次の確認先です。
この記事の範囲と、確認した資料
2026年8月14日に自社で起きた事象の記録です。環境はWindows 11、Windows PowerShell 5.1、AIが生成した.ps1。同じ症状でも、元データがShift_JISだった場合や、外部コマンドへの受け渡しで壊れる場合は原因が別です。原本は上書きせず、変換結果を別名で保存してから確かめてください。
- Microsoft:PowerShellの文字エンコーディング(確認日2026年9月9日)

伴走型AI顧問 WiLLAGENT
初月10万円で、AI顧問、使い放題。
月2回・隔週90分の定例枠で、AI社員の開発・改善、社員研修、導入設計・戦略、会社訪問を、御社の仕事に合わせて選べます。定例の間もチャットで相談できます。
初月10万円、翌月から月30万円。最低3か月・総額70万円(いずれも税別)。訪問の交通費、AIツール利用料は別途実費です。
AI顧問の内容と料金を見る

