バッチファイルのIFではまる?
Windowsのバッチファイルでも、状態によって処理を分岐させたいときにIF文(IFコマンド)が使用できます。以下の以下のコードはコマンドライン引数があるかどうかで分岐させるサンプルです。
ifsample.bat
@echo off IF {%1}=={} ( echo 引数がありません ) else ( echo 第1引数は%1ですね )
いろいろな分岐を書くことができます。しかし、バッチファイルでIF文を書くときは注意が必要です。
C:\>ifsample.bat
引数がありません
C:\>ifsample.bat OK
第1引数はOKですね
スペース
さて、次のコードの実行するとどうなるでしょう?
@echo off IF {%1}=={}( echo 引数がありません ) else ( echo 第1引数は%1ですね )
C:\>ifsample.bat コマンドの構文が誤っています。
実は「条件式」と「(」にスペースがないだけでこのようなエラーになってしまいます。しかも、このエラーメッセージだと何が「誤って」いるのかわからないですね。
elseと(の間ににスペースがない場合も
C:\>ifsample.bat
else( の使い方が誤っています。
のようにエラーになります。
::コメント
また、バッチファイルでコメントを書くときは、、
rem コメント1
のほかに
:: コメント2
も使えます。remはかっこ悪いので、「::」のコメントを使いたくなります。
しかし、ここで注意が必要です。
@echo off IF {%1}=={} ( echo 引数がありません :: echo 引数を入れてください ) else ( echo 第1引数は%1ですね )
このコードを実行すると、
>ifsample.bat ) の使い方が誤っています。
というエラーになってしまうのです。IF文の)の前の行に::コメント行があるとエラーになります。IFやFORの中で::は使わない方がよさそうです。
このことを知っている場合も、注意が必要です。このことを知っていると新規にバッチファイルのコードを作成する場合は「IFやFORの中で::を使わない。」というルールを守って作成すると思います。
しかし、既存のバッチファイルのコードを修正・リファクタリングする場合、
- コメントアウトとして::を先頭につける
- 新たにIF文を追加する場合に囲まれる部分に::コメントがある
を行うと、上記のエラーになってしまうかもしれません。
しかもエラーメッセージの内容が
>ifsample.bat ) の使い方が誤っています。
なので、本当の原因がわかりにくいです。このようなエラーに遭遇したときはこIFやFORの中に::コメント行がないか確かめてみてください。