TeraTermマクロの正規表現について (2017/12/16) [Windows]
※2018/2/23 文章が読みにくかった点を修正しました
TeraTermのマクロは制御に失敗して暴走することが多々あるので、私はwait命令でガチガチに固めて制御しています。誤解の無いように言っておきますが、暴走するのはTeraTermの仕様のせいではなく、適切なタイミングでコマンド発行できていない(つまり、それが暴走というやつです)マクロの中身の問題です。
装置からのプロンプトの表示をコマンド入力のトリガとするのが基本です。ですが、コマンドの出力結果にホスト名や$や#、>といった文字列が含まれてしまうと、入力可能な状態になっていないにもかかわらず「プロンプトが表示された」と誤解し、次の処理へ行ってしまうため、結果として暴走します。
私は正規表現の使えるwaitregexを多用しています。より正確に精度良くマッチさせることができるからです。
しかし、新しく作ったマクロがどうやら暴走していることに気付きました。
1)ホスト名をファイルから取得し、変数var_hostnameに入れる
2)プロンプト文字列が権限によって、>、$に切り替わるので、その部分を正規表現で表現
基本的な構造は下記のような感じ。
暴走する原因を切り分けたら、どうやら'[>|#]'の部分が全く効いていないことが分かりました。さらに切り分けたところ、waitregexには上記のような文法は使えず、正規表現を含めて変数内に埋め込む必要があることが分かりました。
つまり、こうやるのが正しいっぽいです。
TeraTermのマクロは制御に失敗して暴走することが多々あるので、私はwait命令でガチガチに固めて制御しています。誤解の無いように言っておきますが、暴走するのはTeraTermの仕様のせいではなく、適切なタイミングでコマンド発行できていない(つまり、それが暴走というやつです)マクロの中身の問題です。
装置からのプロンプトの表示をコマンド入力のトリガとするのが基本です。ですが、コマンドの出力結果にホスト名や$や#、>といった文字列が含まれてしまうと、入力可能な状態になっていないにもかかわらず「プロンプトが表示された」と誤解し、次の処理へ行ってしまうため、結果として暴走します。
私は正規表現の使えるwaitregexを多用しています。より正確に精度良くマッチさせることができるからです。
しかし、新しく作ったマクロがどうやら暴走していることに気付きました。
1)ホスト名をファイルから取得し、変数var_hostnameに入れる
2)プロンプト文字列が権限によって、>、$に切り替わるので、その部分を正規表現で表現
基本的な構造は下記のような感じ。
var_hostname = 'ホスト名' sendln 'show running-config' waitregex var_hostname'[>|#]'
暴走する原因を切り分けたら、どうやら'[>|#]'の部分が全く効いていないことが分かりました。さらに切り分けたところ、waitregexには上記のような文法は使えず、正規表現を含めて変数内に埋め込む必要があることが分かりました。
つまり、こうやるのが正しいっぽいです。
var_hostname = 'ホスト名[>|#]' sendln 'show running-config' waitregex var_hostname
タグ:TeraTerm
コメント 0