batファイルは日本語windows環境で実行する場合、デフォルト文字コードMS932つまりshiftjisです。
utf8にしたら、制御コードでてきたらbat解析がおかしくなって動きが変になります。どうしてもutf8にしたい場合、文字コードを設定で対応できます。以下の1行を最初に設定したらいろいろ直ると思います。
chcp 65001
バッチで、outlookにスケジュールを登録するための.icsファイルを作成しようとしてます。
で、いつものように、SJISのバッチで作ったら、リダイレクト出力した.icsファイルもSJISになる。
でも、.icsファイルって、UTF-8でないと日本語が化けてしまうんですね。
SJIS形式のファイルを、powershellでUTF-8に変換しても良いのだが、そもそも、バッチファイルを
UTF-8形式にすれば、リダイレクトで作成するファイルがUTF-8になることが分かったので、
バッチをUTF-8で作成しました。
動きはしたのですが、怪奇現象が起きます。
remが途中からコマンドに解釈されて、エラーというか、警告がでる。
(停止はしないです。)
最後の行のコマンドが実行されない。
とりあえず、このままではリリースできないので、
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のバッチファイルとして保存します。
実行すると、rem goto :start以降のremの一部がエラー表示されます。
goto のremを外すとエラーはなくなりますが、その状態で、色々な行に移すと、色々なところでエラーが出ます。
VS Codeの最後の、おしまいの後の改行を削除すると、おしまいが表示されなくなります。
これは、eof(End of File)の関係かとも思いますが、SJISとETF-8で何か違うんですかね。
batファイルは日本語windows環境で実行する場合、デフォルト文字コードMS932つまりshiftjisです。
utf8にしたら、制御コードでてきたらbat解析がおかしくなって動きが変になります。どうしてもutf8にしたい場合、文字コードを設定で対応できます。以下の1行を最初に設定したらいろいろ直ると思います。
chcp 65001
@matub-ken
Questionerありがとうございます。@echo offの次に入れたけど、ダメでした。
@matub-ken
Questionerありがとうございます。上の方にあるのがソースです。
ファイルを添付って出来るのでしたっけ?
なるほど、コメント欄で添付できないとわかりました。
貼り付けられたソースを試してみましたが、確かに不思議な現象ですね。
以下の記事をみつかりました。
文字コード混在という一説です。また解決方法を提示されています。
※まだ自分が試したことがありません。参考のみ。
https://prtn-life.com/blog/batch-garble
https://happy-nap.hatenablog.com/entry/2022/09/26/202008
@matub-ken
Questioner最初は、shift-JISで作成していたので、もしかしたら文字コードが混在してるのかもしれないですね。
といっても見た目で分からないからたちが悪いですね。
今回は、remは""でくくるという方法で逃げることにしました。
いろいろと、調べていただきありがとうございました。
てきとーにググって見つかったブログ
手元に環境がないので未確認だけど、
chcp 65001
が効果ありそうに見える
@matub-ken
Questionerありがとうございました。
3番目ので解決しました。
日本語文字コードが、何か意味のある文字列に見えてしまうのでしょうね。
コードページをUTF-8にしてから作ったプロセスではこの現象は起きませんよ。
chcp 65001
を実行してからバッチファイル自身をcallしてサブシェルにすると日本語を""でくくるといった対策もいらないはずです。
@matub-ken
Questionerなるほど、s-jisで作ったバッチから、chcp 65001で文字コードを変えて、そこからコールすれば文字化けしないのですね。
ちょっと面倒だけど、"日本語"よりもスマートですね。
ありがとうございます。
@echo off
chcp 65001
call %1
みたいなの、一つ作っておくとよいかもしれませんね。
お二人に教えていただいたところを見てみます。
ありがとうございました。
結局、utf-8でバッチを作った場合、日本語のremは""でくくるのが良い。
という事で決着させました。
皆様ありがとうございました。
で、作りたかったバッチは別途、公開しました。