文字コードUTF-8で起きるバッチファイルのコメント(REM)の誤認識と対処例

バッチファイルの文字コードを UTF-8 (BOM なし) で保存した場合に、REM コマンドによるコメント文に日本語(具体的には「を」を使用した場合)を記述すると、実行時にコメント文の一部を未定義のコマンドと誤認してエラーメッセージが表示する場合の対処例を紹介します。
また、UTF-8 などを標準出力の文字コードに指定するコマンドについても紹介します。

バッチファイルを管理者権限で実行させるスクリプト例と文字コードによる文字化け1

誤認識が発生したバッチファイル

誤認識は前回の記事のバッチファイルのテスト中に発生しました。
前回の記事は以下です。

前回紹介したバッチファイルを Shift-JIS ではなく、文字コード UTF-8 で保存して実行すると、コメントの一部(「を」を起点にしていると思われます)をコマンドとして理解しようとしてエラーメッセージ(処理は続行します)が表示されました。

前回との違いは UTF-8 の文字コードを指定する chcp コマンドを2行目に追加したことです。

@echo off
chcp 65501

REM 管理者かどうか判定し、違うなら再起動(管理者として)
net session >nul 2>&1
if %errorLevel% neq 0 (
    echo 管理者権限で再実行します...
    powershell -Command "Start-Process '%~f0' -Verb runAs"
    exit /b
)
echo 管理者として実行されています。
REM ここに処理を記述します。

echo 処理が完了しました。ウィンドウを閉じるには何かキーを押してください。
pause >nul

アクティブなコンソール コード ページを変更します。 If used without parameters, chcp displays the number of the active console code page.

chcp | Microsoft Learn

chcp 65501で文字コードUTF-8に変更

【Python】pyautogui(PyMsgBox)インストールエラーに対する暫定対策 #error – Qiita

UTF-8 (BOM なし) + CRLF で保存したバッチファイルの実行

以下は 文字コード UTF-8 (BOMなし) 改行コード CRLF で保存して実行しました。
※前回は、前回の記事に書いた通り、文字コード Shift-JIS 改行コード CRLF で保存して実行しました。

「REM ここに処理を記述します。」の「を」の文字コードが UTF-8 (BOMなし) の場合は、バッチの実行時にコメント文なのに特別な認識をされてエラーメッセージが表示されました。
エラーメッセージは出ますが、処理は中断せず最後まで行われました。

Active code page: 65001
管理者として実行されています。
'�述します。' is not recognized as an internal or external command,
operable program or batch file.
処理が完了しました。ウィンドウを閉じるには何かキーを押してください。

バッチファイルを Shift-JIS で保存

バッチファイルを文字コード UTF-8 で保存すると、 REM コマンド(コメント行)の文字化けが発生する原因になる可能性があるため、日本語を記述する場合は Shift-JIS にすることが推奨されています。

一般的な文字コードであるUTF-8を利用すると、remコマンドで記述したコメントの文字化けが発生することがあります。

また、場合によってはエラーが発生することもあります。

そのため、日本語を記述する場合は、文字コードをShift-JISに設定することをおすすめします。

バッチファイルでコメントを記述する方法と具体例【remコマンド】 – コマンドプロンプトの教科書

以下は、先ほどのバッチファイルを、文字コード Shift-JIS 改行コード CRLF で保存して実行した結果です。
行数が5行から3行に減ったことから、エラーメッセージは消えたようですが、日本語の部分が文字化けして表示されます。
これは、文字コードを Shift-JIS にしたのに、バッチファイルの2行目 chcp 65501 で、文字の出力で 文字コード UTF-8 を使うように指定しているせいです。

Active code page: 65001
�Ǘ��҂Ƃ��Ď��s����Ă��܂��B
�������������܂����B�E�B���h�E��‚���ɂ͉����L�[������Ă��������B

実行結果

UTF-8 を指定している chcp 65501 を除去します。
文字コード Shift-JIS 改行コード CRLF で保存してから実行します。

@echo off

REM 管理者かどうか判定し、違うなら再起動(管理者として)
net session >nul 2>&1
if %errorLevel% neq 0 (
    echo 管理者権限で再実行します...
    powershell -Command "Start-Process '%~f0' -Verb runAs"
    exit /b
)
echo 管理者として実行されています。
REM ここに処理を記述します。

echo 処理が完了しました。ウィンドウを閉じるには何かキーを押してください。
pause >nul

コメント行をコマンドと誤認したエラーのメッセージが表示されなくなり、日本語の echo の標準出力も文字化けせずに行われました。

管理者として実行されています。
処理が完了しました。ウィンドウを閉じるには何かキーを押してください。
バッチファイルを管理者権限で実行させるスクリプト例と文字コードによる文字化け1

まとめ

今回は、バッチファイルの文字コードを UTF-8 (BOM なし) で保存した場合に、REM コマンドによるコメント文に日本語(具体的には「を」を使用した場合)を記述すると、実行時にコメント文の一部を未定義のコマンドと誤認してエラーメッセージが表示する場合の対処例を紹介しました。
また、UTF-8 などを標準出力の文字コードに指定するコマンドについても紹介しました。

参照サイト Thank You!

記事一覧 → Compota-Soft-Press

コメント

Ads Blocker Image Powered by Code Help Pro

お願い - Ads Blocker Detected

このサイトは広告を掲載して運営しています。

ポップアップを閉じて閲覧できますが、よろしければ

このサイト内の広告を非表示にする拡張機能をオフにしていただけませんか?

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

We have detected that you are using extensions to block ads. Please support us by disabling these ads blocker.

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