AIに書かせたPowerShellスクリプトで日本語が壊れるとき、原因のほとんどはファイルの保存形式です。BOMなしUTF-8で保存されたファイルを、Windows PowerShell 5.1が日本語環境のコードページとして読むために起きます。

赤堀亘
執筆・監修 AiWiLL株式会社 代表取締役 赤堀亘

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で書かれた日本語は、そこで別の文字列に化けます。

化けたのがコードの構文部分なら、トークン '}' を使用できません のような構文エラーが出て即座に止まります。これは運がいい方です。壊れたことが、その場で分かる。

私の場合、化けたのはパスの文字列でした。すると、こうなります。

  1. Test-Path が、化けたパスを見て false を返す
  2. スクリプトは「そのファイルは存在しない」と正しく判断し、その動画を飛ばす
  3. これを21回くり返す
  4. 一度も失敗していないので、終了コードは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だった場合や、外部コマンドへの受け渡しで壊れる場合は原因が別です。原本は上書きせず、変換結果を別名で保存してから確かめてください。

医療、建設、農業、営業、製造、飲食など、さまざまな仕事の人が並ぶAiWiLLのキービジュアル。AIを使いこなす会社は、イケてる。

伴走型AI顧問 WiLLAGENT

初月10万円で、AI顧問、使い放題。

月2回・隔週90分の定例枠で、AI社員の開発・改善、社員研修、導入設計・戦略、会社訪問を、御社の仕事に合わせて選べます。定例の間もチャットで相談できます。

初月10万円、翌月から月30万円。最低3か月・総額70万円(いずれも税別)。訪問の交通費、AIツール利用料は別途実費です。

AI顧問の内容と料金を見る