投稿者「Shunsuke Yoshikawa」のアーカイブ

8.4. 外部ファイルのループを抜ける

8.4.1. 終わらないループ

前回までに作ったマクロでは、外部ファイルであるlist.txtの最後まで到達しても、ループを終わらせる事ができませんでした。

今回は、ファイルの最後に到達したら、ループを終わらせるようなマクロを作ってみましょう。

 

8.4.1.1. 前回の振り返り

前回までに作成したマクロは以下のとおりです。

もはや、マクロの解説をわざわざしなくても全く問題なく読めるようになっていると思いますので、ごちゃごちゃ書くことは避けます。

よくわからないポイントがある場合は、右のメニューから振り返っていただくといいかもしれません。

 

8.4.1.2. ループの終わりを知る方法

さて、既にファイルを読み込んでループをさせるところまで行っていますので、特に詳しい解説もなく、ファイルの終わり方について行こうと思います。

ここで、一度久しぶりにTera Termのコマンドリファレンスを覗いてみたいと思います。

http://ttssh2.sourceforge.jp/manual/ja/macro/command/filereadln.html

確認しておきたいのは、filereadlnの部分です。

最後に達した場合、システム変数 result に 1 が格納される。それ以外の場合、result に 0 が格納される。
改行のみの場合は、文字列変数は空となり、result には 0 が格納される。

ファイルハンドルの説明について、以上のように書かれています。
今作っているマクロに読み替えると、こうなります。

・list.txt内にIPアドレスがあるうちはresult変数に0が格納される
・list.txtの最後に到達した場合、result変数に1が格納される

つまり、我々がマクロに対して出したい指示はこういうことです。

・resultに1が格納されたらbreakしろ(ループを抜けろ)
(それ以外の時はループを続けろ)

つまりのつまり、条件分岐ですね。

ですから、ifを使うことになります。

こういうふうに書くことで、ループを抜けることができるようになるはずです。

 

8.4.2. ループを終わらせる

ifを使えばループが終わることがわかりました。

では、実際にどういうふうに書くか考えてみましょう。

 

8.4.2.1. ifの位置を考える

実際にif文を考えてみると、

 

このような形になります。

そして、ifはfilereadlnの結果に対して処理をさせるわけですから、filereadln直下に入ってくるわけです。

 

8.4.2.2. 実際にマクロに入れてみる

実際にマクロに入れ込むとこうなります。

 

これで、IPアドレスのリストに対して、show run、show logを取りに行くマクロが完成しました。

17-23行目にifを入れ込むだけでOKです。

さらに、92行目には念のためPauseを5秒追加しています。

Pauseを入れる理由は、Loopへの戻りが早すぎてマクロがこけることがよくあるからです。マクロのエラーが毎回違う行で起きる場合は、Pauseを入れてみることをおすすめします。

 

ここまでで、基本的なマクロの解説は終わりです。

次回以降はここまでに作ったサンプルマクロを使って、もっと便利なマクロを作っていこうと思います。