【Batch】「・ソ」の謎
Batchファイルを起動すると最初のコマンドの先頭に付く「・ソ」の謎を解き明かしたい!
概要
今回の記事では、Batchファイルを起動すると最初のコマンドの先頭に付く「・ソ」の謎について掲載する。
環境
- Windows 10 Home 22H2 (OSビルド19045.3086)
手順書
ある日、下記のようなどシンプルなBatchファイルを実行したところ
@echo off
rem なにやら物凄い処理
@echo off
の先頭に謎の「・ソ」が付いてコマンドの実行に失敗する。
'・ソ@echo' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。
「・ソ」
ちなみにその後の「なにやら物凄い処理」は問題なく実行される。
下記の記事の時は様子が違うけども、同じように文字化けの気配が!
しかし、Batchファイルってただのテキストファイルなのに、なぜエディタで見えない文字が勝手に挿入されるんだ!?
霊魂の類か!
原因
テキストファイルでもエディタで見えない文字?があった!
ファイルの先頭にBOM(Byte Order Mark)が付いてるテキストファイルがあって、Unicodeとかでエンコードされてるテキストファイルがそうだったりする。
BOMの目的はByte Order Markってあるとおりでバイトの並び方をファイルの先頭で教えてる。
下記はUTF-8とUTF-16の例。
BOMの種類 | BOM(16進数) |
---|---|
UTF-8 | EF BB BF |
UTF-16LE | FF FE |
UTF-16BE | FE FF |
UTF-32LE | 00 00 FF FE |
UTF-32BE | FE FF 00 00 |
LEはリトルエンディアンで後ろのバイトから並べてく。BEはビッグエンディアンで逆に前からバイトを並べてく。
実際に該当のBatchファイルをバイナリエディタ(Stirling)で開いて確認してみると
「・ソ」があった!
今回は意図せずにBOM付きのUTF-8でBatchファイルを作って動かそうとしていたので「・ソ」が付いたと。日頃このBOMを意識してBatchファイルを作ったことがなかっんだけども、どこでBOMが付いたのか。
このBatchファイルなんだけども、Visual Studioの新規追加から作った際に間違って、テキスト以外のJSX(うろ覚え)を選択してしまって、後からbatch.bat
みたいな感じでリネームして使ってて、この選択したプリセット的なものにBOMが付いていたんだと思われ。
解決方法
このBatchファイルを正常に動くようにするには
- バイナリエディタでBOMの部分を削る。
もしくは
- Visual Studioの場合はテキストファイルのプリセットから作り直す。
Visual Studio Codeやエクスプローラーの新規作成でファイルを作る場合はBOMが付かないので意識する必要ない。
まとめ(感想文)
蘇(ソ)。