AIに作らせたバッチファイルやPowerShellが動かない・文字化けするときの直し方|疑う場所は3つ

AIに作らせたバッチファイルやPowerShellが動かない・文字化けするときの直し方|疑う場所は3つ
当サイトはアフィリエイト広告を利用しています。
この記事に出てくる用語
  • バッチファイル(bat) … コマンドプロンプトに実行させる命令を並べたテキストファイル。拡張子は「.bat」
  • PowerShell(パワーシェル) … Windowsのもう1つの命令実行のしくみ。ファイルの拡張子は「.ps1」

結論:症状を見れば、原因はほぼ特定できる

AIに書かせたバッチファイルやPowerShellが動かないとき、原因はコードの中身とは限りません。
その外側の3か所(文字の保存形式・実行許可・貼り付けと保存のやり方)で止まっているケースが大半です。

一度も動かせていない場合は、面倒なパソコン作業はAIに書かせて自動化する を先に読んでください。

表の行は、手元のファイルが.batと.ps1のどちらかで分かれています。
ファイルを右クリックして「プロパティ」を開くと、「ファイルの種類」欄の末尾に「(.bat)」「(.ps1)」と表示されます。
「(.txt)」なら、ただのテキストとして保存されています(後半の「拡張子が『.bat.txt』になっている」へ)。

表に出てくる保存形式の名前は3つ。

  • ANSI(アンシ) … 日本語Windowsが昔から使ってきた保存形式。メモ帳の保存画面にこの名前で出てくる
  • UTF-8(ユーティーエフエイト) … いまの世界標準の保存形式。AIが出すコードはこちら
  • BOM(ボム) … ファイルの先頭に付く見えない目印。同じUTF-8でも、これが付いているかで症状が別物になる
いま起きていること原因直し方
batを実行すると、日本語だけが「縺薙s縺ォ縺。縺ッ」のように化ける。処理自体は進んでいるUTF-8(BOMなし)で保存されているANSIで保存し直す(→ 疑う場所1)
batの1行目からエラー。書いた覚えのないコマンドが画面に流れていくUTF-8(BOM付き)で保存されているANSIで保存し直す(→ 疑う場所1)
.ps1を実行すると「スクリプトの実行が無効になっているため…」と出る実行ポリシー(スクリプトファイルの実行を許可するかを決めている設定)。既定では実行しない設定を確認する。変えずに動かす方法もある(→ 疑う場所2)
.ps1の中の日本語だけが化ける。日本語のある行でエラーになるBOMなしのUTF-8を、古い側のPowerShellが読んでいるUTF-8(BOM付き)で保存し直す(→ 疑う場所1)
「’~’ は、内部コマンドまたは外部コマンド…として認識されていません」とファイルごと弾かれるファイル名・拡張子・貼り付け先の問題ファイル名を半角英数にする。拡張子を確認する(→ 疑う場所3)

保存形式の正解は、batが「ANSI」、.ps1が「UTF-8 (BOM 付き)」です。
この2つは真逆なので、片方で覚えた対処をもう片方に使うと、直すつもりの操作で悪化します。

なぜ「AIに書かせたコード」だと起きやすいのか

AIが出すコードはUTF-8を前提に書かれていて、日本語Windowsのコマンドプロンプトは今もShift-JISで動いているからです。
チャット画面のコードはただの文字列で、文字コードが決まるのは、ファイルに保存する瞬間です。保存に使ったアプリの設定が採用されます。
Windowsのメモ帳は、2019年の更新(Windows 10 バージョン1903)以降、既定がANSIからUTF-8(BOMなし)に変わりました(Windows 11も同じ)。
AIの回答をメモ帳に貼ってそのまま保存すると、書く側と読む側が食い違います。

疑う場所1:文字コード(保存形式)

保存形式が違うと、症状も別物になる

同じ内容のbatファイルでも、保存形式が違うと結果は次のように変わります。
日本語Windowsの標準設定(コードページ932=Shift-JISとほぼ同じ)で実行した場合の話です。

保存形式結果
ANSI(Shift-JIS)正常。「こんにちは」「処理を開始」と表示される
UTF-8(BOMなし)文字化け。「こんにちは」が「縺薙s縺ォ縺。縺ッ」、「処理を開始」が「蜃ヲ逅・r髢句ァ・」になる。ただし処理は最後まで進む
UTF-8(BOM付き)1行目からエラー。以降はコマンドがそのまま画面に流れるため、画面に出る量が正常時より大幅に増える

重いのはBOM付きです。
コマンドプロンプトはBOMの3バイトを1行目のコマンドの一部として読むため、定番の1行目 @echo off(実行中のコマンドを画面に出さない指定)と合体して、次のようなエラーが出ます。

'・ソ@echo' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。

@echo off が効かないため、以降は実行されるコマンドが1行ずつ画面に流れます。
コードが壊れたわけではありません。

BOMなしの「化けるけど動く」も軽く見ないでください。
日本語のフォルダ名やファイル名を扱うbatでは、化けた名前で対象を探しに行き、「指定されたパスが見つかりません」のような失敗につながります。

バッチファイル(.bat)は「ANSI」で保存し直す

  1. メモ帳を起動し、対象の.batファイルをメモ帳の窓へドラッグして開く(「ファイル」→「開く」の場合は、ファイルの種類を「すべてのファイル」にすると.batが選べます)
  2. 画面の右下を見る。現在の保存形式(UTF-8など)が表示されている
  3. 「ファイル」→「名前を付けて保存」を開く
  4. 「ファイルの種類」を「すべてのファイル」に変える(テキスト文書のままだと末尾に .txt が付きます)
  5. 保存画面の「エンコード」欄を 「ANSI」 に変えて保存する

検索すると、chcp 65001(コマンドプロンプト側をUTF-8に切り替える命令)をbatの1行目に足す方法も出てきます。
ただし、BOM付きで保存されている場合はこの方法では直りません。
BOMの3バイトが1行目にくっつくので、何を書いてもその行自体が壊れるからです。
BOMなしの場合は、chcp 65001 を足すより、ANSIで保存し直すほうが確実です。

PowerShell(.ps1)は逆で、「UTF-8 (BOM 付き)」で保存する

パソコンに入っているPowerShellには、2系統あります。

Windows PowerShell 5.1PowerShell 7
入手Windowsに最初から入っている自分でインストールした場合だけ入っている
BOMなしUTF-8の.ps1日本語が化ける(ANSIとして読むため)正常に動く(UTF-8が前提のため)
BOM付きUTF-8の.ps1正常に動く正常に動く

BOMがない場合、Windows PowerShellはスクリプトを従来のANSIコードページとして解釈します。
BOMなしのUTF-8で日本語が化けるのは、このためです。

両方の系統で正しく動くのは「UTF-8 (BOM 付き)」です。
半角の英数字・記号に収まらない文字を使うスクリプトは、この形式で保存するようMicrosoftが案内しています。
メモ帳の保存画面の「エンコード」欄で 「UTF-8 (BOM 付き)」 を選ぶだけです。

自分がどちらの系統かは、PowerShellの画面で確かめられます。
Windows 11ならスタートボタンを右クリックして「ターミナル」、Windows 10なら同じメニューの「Windows PowerShell」を選びます。
通常はPowerShellの画面が開きます。
「コマンドプロンプト」になっている場合は、スタートメニューの検索で「powershell」と入力しても開けます。
開いた画面に次の1行を貼り付けて(Ctrl+V)、Enterを押してください。

$PSVersionTable

表示された PSVersion が5.1なら最初から入っている側、7.xなら後から入れた側です。

疑う場所2:実行許可(.ps1の実行が拒否されるとき)

そのエラーは故障ではなく、安全装置

保存し直しても、.ps1を実行するとこう言われることがあります。

このシステムではスクリプトの実行が無効になっているため、
ファイル ~.ps1 を読み込むことができません。

これは実行ポリシーという設定の仕業で、故障でもコードの間違いでもありません。
Windowsに最初から入っているWindows PowerShellは既定が「Restricted」で、画面に打ち込むコマンドは実行しますが、スクリプトファイルは実行しません。
中身を確かめないまま悪意あるスクリプトを実行する事故を防ぐための安全装置です。

まず、いまの設定を確認する

PowerShellの画面を開き(Windows 11ならスタートボタンを右クリックして「ターミナル」)、次の1行を貼り付けて(Ctrl+V)、Enterを押します。
どの設定でも実行できます。

Get-ExecutionPolicy -List

次のような表が出ます。

        Scope ExecutionPolicy
        ----- ---------------
MachinePolicy       Undefined
   UserPolicy       Undefined
      Process       Undefined
  CurrentUser       Undefined
 LocalMachine       Undefined

見るのは上2行です。

  • MachinePolicy か UserPolicy に Undefined 以外の値が入っている … 会社の管理者がグループポリシー(組織のPCを一括設定する仕組み)で決めています。
    ユーザー側の変更より優先されるので、自分では変えられません
  • すべて Undefined … 誰も設定を変えていない状態です。Windows PowerShellでは既定のRestrictedとして扱われ、スクリプトファイルは実行されません

会社のパソコンでは、設定を変えようとしない

注意:会社のパソコンの場合

  • 検索すると「このオプションを付けて起動すれば実行できる」という回避方法が見つかりますが、会社のパソコンでは使わないでください
  • 実行ポリシーは管理者が意図して設定しているものです。回避はセキュリティ規程への違反になり得ます
  • MachinePolicy や UserPolicy に値が入っていたら、情報システム担当に「この作業を自動化したい」と用途から相談するのが正道です

設定を変えずに動かす:画面に直接貼り付ける

設定を一切変えずに動かす方法があります。
Restrictedが禁止しているのは「スクリプトファイルの実行」で、画面に打ち込むコマンドは許可されています。
.ps1に保存せず、AIのコードをPowerShellの画面に直接貼り付ければ、そのまま実行されます。

貼り付けたときに「複数行を貼り付けようとしています」という確認が出ることがありますが、これは貼り間違い防止の確認です。
内容を見て、意図したコードなら続行してください。

ただし、会社のパソコンではこの方法も相談してから使ってください。
Microsoftの資料はこのやり方を実行ポリシーの「回避方法」の1つとして挙げています。
技術的に動くことと、組織のルールで許されていることは別です。

個人のパソコンで毎回ファイルから実行したくなったら、上の「実行許可」の節をもう一度読んでから判断してください。
理解より先に設定を緩めるのは順番が逆です。

疑う場所3:どこに貼って、どう保存するか

「PowerShellに貼り付けてください」には、2通りの意味があります。

やり方向いている場面
(a) 画面(黒い窓)に直接貼り付ける一度きりの処理。試しに動かしてみるとき。実行ポリシーに止められない
(b) ファイルに保存して実行する何度も使う処理。タスクスケジューラで定期実行したいとき

バッチファイル用のコマンドを(a)で試すときは、スタートメニューの検索で「cmd」と入力してコマンドプロンプトを開きます。

AIは会話の流れで両方のコードを出すので、ファイル化の前にどちらのコードかを確かめてください。
AIの回答のコード枠の左上のラベル(powershell/bat/cmd)で見分けられます。

ファイル化の手順

  1. メモ帳を開き、AIのコードを貼り付ける
  2. 「ファイル」→「名前を付けて保存」を開く
  3. 「ファイルの種類」を「すべてのファイル」に変える(テキスト文書のままだと、末尾に.txtが付く)
  4. ファイル名は半角英数+拡張子にする(例: backup.bat、backup.ps1)
  5. 「エンコード」欄で保存形式を選ぶ。.batは「ANSI」、.ps1は「UTF-8 (BOM 付き)」

保存したファイルの実行方法も違います。
batはダブルクリックで実行されます。
.ps1は既定ではダブルクリックしても実行されず、メモ帳などで開かれるだけです。
右クリックメニューの「PowerShell で実行」を使ってください(見当たらなければ「その他のオプションを確認」の中)。
どちらも実行ポリシーは適用されます。

つまずきやすい箇所

AIに「Shift-JISで出力して」と頼んでも直らない

文字化け対策としてAIに保存形式を指定したくなりますが、それでは保存形式は変わりません。
文字コードはファイルに保存する瞬間に、保存するアプリの設定で決まるからです。
指定する相手はAIではなく、保存画面の「エンコード」欄です。

拡張子が「.bat.txt」になっている

Windowsは既定で拡張子を隠すので、「backup.bat」に見えるファイルが実は「backup.bat.txt」ということがあります。
典型的な症状は「ダブルクリックするとメモ帳が開く」です。
エクスプローラーの「表示」→「表示」→「ファイル名拡張子」にチェックを入れると、本当の名前が確認できます。

ダブルクリックすると一瞬で窓が閉じて、エラーが読めない

batをダブルクリックすると、エラーがあっても窓が一瞬で閉じてメッセージが読めません。
先にコマンドプロンプトを開いておき、batファイルを窓の中へドラッグしてEnterで実行してください。
窓が残り、メッセージを最後まで読めます。
出てきたエラーは、化けていてもそのままAIに貼り付けて構いません。

ファイル名に日本語を使っている

ファイル名に日本語が入っていると、呼び出し方や経由するツールによっては「’~.bat’ は、内部コマンドまたは外部コマンド…として認識されていません」と弾かれることがあります。
日本語のファイル名でも直接実行するぶんには動きますが、半角英数にすれば、この種の問題を最初から避けられます。

この記事の確認範囲

扱うのはコードが動かない側だけです。AIの答えそのものを疑う方法は「AIが自信満々に間違えたときの切り返し方」へ。

  • 画面の説明は、とくに断っていない箇所はWindows 11のものです。拡張子を表示させる手順など、Windows 10では項目の場所が違うところがあります
  • 保存形式を選ぶ手順は、Windowsに最初から入っているメモ帳のものです。他のテキストエディタでは、保存形式を選ぶ欄の名前が違います
  • AIが書くコードは毎回違います。記事の例と同じものが出るとは限らず、症状の型が同じなら同じ直し方が効く、という書き方です
  • AIサービス(ChatGPTなど)の回答の傾向は、更新によって変わります
  • 会社のパソコンでは、管理者の設定によって実行ポリシーの変更が許可されていないことがあります

コメント

タイトルとURLをコピーしました