Windowsのバッチファイルは、特定の文字コードや改行コードを使用しないと正常に動作しません。
具体的には、以下の文字コードや改行コードを用いる必要があります。
・文字コードは「SJIS」を使用する(chcpコマンドで文字コードを変更しない場合)
・改行コードは「CRLF」を使用する
既存のファイルをコピーしてそれをベースにバッチファイルを作成するような時に、文字コードを誤ってしまうことが多いです。
また、FTP(FFFTP)やGitを用いてサーバ間でファイルのやりとりをする時に、意図せずに改行コードが変わってしまうことも多いです。
既存のファイルをコピーしたり、サーバからバッチファイルを落としてきたりする場合には注意する必要があります。
以下では、文字コードや改行コードを誤るとどのように挙動が変わるのかを見ていきます。
文字コードを誤ると、2バイト文字(日本語等)の部分が文字化けします。フォルダ名やファイル名に2バイト文字が含まれていたり、データに2バイト文字が含まれていたりするような場合は、正常に動作しなくなります。
また、改行コードを誤ると、改行が無視されてコマンドが実行されます。通常のバッチファイルでは改行でコマンドを区切るため、コマンドを上手く区切られなくなり、正常に動作しなくなります。
【サンプル】
1 2 3 |
@echo off echo こんにちは世界! pause |
【文字コード・改行コードが正しい場合の動作】
1 2 |
こんにちは世界! 続行するには何かキーを押してください . . . |
【文字コードが「UTF-8」の場合の動作】
1 2 |
縺薙s縺ォ縺。縺ッ荳也阜・・ 続行するには何かキーを押してください . . . |
【改行コードが「LF」の場合の動作】
1 2 3 |
'ノちは世界!' は、内部コマンドまたは外部コマンド、 操作可能なプログラムまたはバッチ ファイルとして認識されていません。 続行するには何かキーを押してください . . . |
いかがでしたでしょうか?
今回は、Windowsバッチが正常に動作しない理由として、ありがちな2つの理由を紹介しました。
(現在私が担当している案件でも、Gitの設定の問題でサーバから落としてきたバッチファイルが動かなくなるという問題に出くわしていました。本当によくあることです。)
今回紹介したように、文字コードや改行コードを誤るとHello Wolrdすら正常に動作しなくなるので、簡単なスクリプトすら動作しなくなることをもって原因調査であたりをつけることができます。
正常に動作しない場合は、コメントアウトやexitコマンドを入れて簡単なコードに書き変えてみて原因を探ると良いでしょう。
(ちなみに、Windowsバッチに限らず、この手の誤りはスクリプト言語全般にありがちです)
原因調査に時間を取られる人が一人でも減れば幸いです!
コメント