今回はTeraTermマクロの仕様上回避のしようがないので、コーディングする側が気をつけましょう、という話です。
追記(2016年3月5日)
2016年3月5日リリースされたTera Term 4.90で仕様が変更されたため、4.90以降はこの問題に該当しません。
if文は皆さんご存じの通り、条件判定により「もし〜だったら」という処理をおこないます。では、つぎのマクロはどのような動作をするでしょうか。
code = 100 if code != 100 messagebox 'codeの値が100ではありません!' 'error' goto error else messagebox 'codeの値は100です!!' 'OK' endif :error end
実行結果はつぎのようになります。
おかしいですね。codeの値は100で間違いありません。
if文の書き方
TeraTermマクロのif文は2通りの書き方があります。まず最初は「if 〜 then 〜 endif」形式です。
if <条件> then 条件がマッチした際の処理 endif
もうひとつの書き方は「if 〜 マッチした際の処理」形式です。
if <条件> <条件にマッチした際の処理>
そう、if文には「then」がある場合とない場合の2パターンの書き方があります。
最初に掲載したサンプルマクロは「then」がありません。TeraTermマクロの仕様では「then」がない場合、条件にマッチした際の処理コードを書かなくても構文エラーになりません。そのため、条件に関わらず次の行へ進みます。ですから、codeの値が100だろうが200だろうが関係なく「codeの値が100ではありません!」というメッセージボックスが表示されてしまいます。
訂正(2016年2月19日)
「then」がない場合は次にTTLコマンドが来ることをTeraTermマクロは期待していますが、if文の条件に一致しない場合はTTLコマンドが実行されないため、次の行へ進みます。今回のサンプルでいうと4行目の「codeの値が100ではありません!」というメッセージを表示する箇所です。逆にif文の条件に一致した場合はTTLコマンドを実行しようとしますがTTLコマンドを記述していないためシンタックスエラーとなります。
thenの書き忘れに注意
これまで、本サイトではif文の使い方として、あえてthenを書かない方法を紹介しませんでした。それは今回のようばバグが発生してしまう可能性があるからです。ぼくの個人的な意見ですが、thenを書かない方式は使わず、常にthenを使う事をオススメします。そうすれば、if文を検索してthenの有無をチェックする事でバグを見つけやすくなるからです。
Tera Term 4.90以降はシンタックスエラーになる
2016年3月5日リリースされたTera Term 4.90へアップデートすると、thenの書き忘れはシンタックスエラーで処理が停止します。
次のリリース(v4.90)で、thenがないif文はエラーとする予定です。
https://osdn.jp/ticket/browse.php?group_id=1412&tid=35277
ありがとうございます。v4.90のリリースで修正を確認後、記事を更新します。