matub-ken
@matub-ken (松原 健)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

utf8でバッチを作成したら、怪奇現象が起きる。

解決したいこと

バッチで、outlookにスケジュールを登録するための.icsファイルを作成しようとしてます。
で、いつものように、SJISのバッチで作ったら、リダイレクト出力した.icsファイルもSJISになる。
でも、.icsファイルって、UTF-8でないと日本語が化けてしまうんですね。
SJIS形式のファイルを、powershellでUTF-8に変換しても良いのだが、そもそも、バッチファイルを
UTF-8形式にすれば、リダイレクトで作成するファイルがUTF-8になることが分かったので、
バッチをUTF-8で作成しました。

動きはしたのですが、怪奇現象が起きます。

怪奇現象1

remが途中からコマンドに解釈されて、エラーというか、警告がでる。
(停止はしないです。)

怪奇現象2

最後の行のコマンドが実行されない。

とりあえずの回避

とりあえず、このままではリリースできないので、
1.remはgotoでスキップさせる。
2.最後の行の後に空行を入れておく。
というので逃げてますが、原因と他処方があれば教えてください。

該当するソースコード

全文を書くと長いので、その怪奇現象部分だけにき出しました。
解決したら全文を公開します。

@echo off

rem 文字コードの影響かわかりませんが、以下のremがremとして認識されず、途中からコマンドと認識されてしまう現象が起きてます。
rem goto :start

rem やむを得ず、gotoでスキップします。
rem このバッチはTeamsに登録するスケジュールを作成します。
rem TeamsはUTF-8Nのファイルで入力する必要があるので、バッチ自体をUTF-8で作成しています。
rem shift-JISで保存しないでください。

:start
rem 怪奇現象としか思えない。「おしまい」の前後の空行をVSで削除すると、「おしまい」が表示されなくなります。ただし、最後の改行は、エディターで開くと、有無の区別が分からない。

echo おしまい。

自分で試したこと

VS Codeで、上記を、UTF-8のバッチファイルとして保存します。

怪奇現象1

実行すると、rem goto :start以降のremの一部がエラー表示されます。
goto のremを外すとエラーはなくなりますが、その状態で、色々な行に移すと、色々なところでエラーが出ます。

怪奇現象2

VS Codeの最後の、おしまいの後の改行を削除すると、おしまいが表示されなくなります。
これは、eof(End of File)の関係かとも思いますが、SJISとETF-8で何か違うんですかね。

0

5Answer

batファイルは日本語windows環境で実行する場合、デフォルト文字コードMS932つまりshiftjisです。
utf8にしたら、制御コードでてきたらbat解析がおかしくなって動きが変になります。どうしてもutf8にしたい場合、文字コードを設定で対応できます。以下の1行を最初に設定したらいろいろ直ると思います。

chcp 65001

2Like

Comments

  1. @matub-ken

    Questioner

    ありがとうございます。@echo offの次に入れたけど、ダメでした。

  2. echo offの次でもできますよ。以下のエビデンスをみてください。
    多分ほかの問題でしょう。batファイルの貼り付けたらいかがですか。
    image.png

    image.png

  3. @matub-ken

    Questioner

    ありがとうございます。上の方にあるのがソースです。
    ファイルを添付って出来るのでしたっけ?

  4. なるほど、コメント欄で添付できないとわかりました。
    貼り付けられたソースを試してみましたが、確かに不思議な現象ですね。
    以下の記事をみつかりました。
    文字コード混在という一説です。また解決方法を提示されています。
    ※まだ自分が試したことがありません。参考のみ。

    https://prtn-life.com/blog/batch-garble
    https://happy-nap.hatenablog.com/entry/2022/09/26/202008

  5. @matub-ken

    Questioner

    最初は、shift-JISで作成していたので、もしかしたら文字コードが混在してるのかもしれないですね。
    といっても見た目で分からないからたちが悪いですね。

    今回は、remは""でくくるという方法で逃げることにしました。

    いろいろと、調べていただきありがとうございました。

てきとーにググって見つかったブログ

手元に環境がないので未確認だけど、

  • 1番目のchcp 65001
  • 3番目のダブルクゥオーテーションでくくる

が効果ありそうに見える

2Like

Comments

  1. @matub-ken

    Questioner

    ありがとうございました。
    3番目ので解決しました。
    日本語文字コードが、何か意味のある文字列に見えてしまうのでしょうね。

コードページをUTF-8にしてから作ったプロセスではこの現象は起きませんよ。
chcp 65001を実行してからバッチファイル自身をcallしてサブシェルにすると日本語を""でくくるといった対策もいらないはずです。

1Like

Comments

  1. @matub-ken

    Questioner

    なるほど、s-jisで作ったバッチから、chcp 65001で文字コードを変えて、そこからコールすれば文字化けしないのですね。
    ちょっと面倒だけど、"日本語"よりもスマートですね。

    ありがとうございます。

    @echo off
    chcp 65001
    call %1

    みたいなの、一つ作っておくとよいかもしれませんね。

お二人に教えていただいたところを見てみます。
ありがとうございました。

0Like

結局、utf-8でバッチを作った場合、日本語のremは""でくくるのが良い。
という事で決着させました。

皆様ありがとうございました。

で、作りたかったバッチは別途、公開しました。

0Like

Your answer might help someone💌