8.4.1. 終わらないループ
前回までに作ったマクロでは、外部ファイルであるlist.txtの最後まで到達しても、ループを終わらせる事ができませんでした。
今回は、ファイルの最後に到達したら、ループを終わらせるようなマクロを作ってみましょう。
8.4.1.1. 前回の振り返り
前回までに作成したマクロは以下のとおりです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 |
;================================= ;fileopenでlist.txtを開き、FHに格納 ;================================= fileopen FH 'list.txt' 0 ;================================= ;whileでループを開始する ;================================= while 1 ;================================= ;filereadlnでFHから読み出し ;LINEに格納 ;================================= filereadln FH LINE ;================================= ;LINEにIPアドレスが格納されたので、 ;LINEをIP_ADDRに代入する ;================================= IP_ADDR = LINE ;================================= ;変数格納 ;================================= PWD = 'cisco123' ;IPアドレスに必要なオプションを追加する strconcat IP_ADDR ':23 /nossh /T=1' ;================================= ;telnet接続、ログ保存ディレクトリ ;================================= connect IP_ADDR getdir DIR changedir DIR ;================================= ;ログ保存名の確定 ;================================= getdate DATE '%Y%m%d-%H%M%S.log' SHRUN = 'show_run_' SHLOG = 'show_log_' strconcat SHRUN DATE strconcat SHLOG DATE ;================================= ;show runのログを取得 ;================================= logopen SHRUN 0 0 wait 'Password:' sendln PWD wait '>' pause 3 sendln 'en' wait 'Password' pause 3 sendln PWD wait '#' pause 3 sendln 'terminal length 0' wait '#' pause 3 sendln 'show run' pause 5 sendln '' wait '#' logclose ;================================= ;show logのログを取得 ;================================= logopen SHLOG 0 0 sendln 'show log' pause 5 sendln '' wait '#' sendln 'exit' logclose ;================================= ;ここでループ元に戻る ;================================= endwhile ;================================= ;FHを無効化する ;================================= fileclose FH end |
もはや、マクロの解説をわざわざしなくても全く問題なく読めるようになっていると思いますので、ごちゃごちゃ書くことは避けます。
よくわからないポイントがある場合は、右のメニューから振り返っていただくといいかもしれません。
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を使うことになります。
1 2 3 4 5 |
if resultが1のとき then break(ループ終了) endif(resultが1のときはifも終わり) (elseは書かなくてもいい) 色々と処理 |
こういうふうに書くことで、ループを抜けることができるようになるはずです。
8.4.2. ループを終わらせる
ifを使えばループが終わることがわかりました。
では、実際にどういうふうに書くか考えてみましょう。
8.4.2.1. ifの位置を考える
実際にif文を考えてみると、
1 2 3 4 5 6 7 8 |
fileopen FH 'list.txt' 0 while1 filereadln FH LINE if result=1 then break endif hogehoge endwhile |
このような形になります。
そして、ifはfilereadlnの結果に対して処理をさせるわけですから、filereadln直下に入ってくるわけです。
8.4.2.2. 実際にマクロに入れてみる
実際にマクロに入れ込むとこうなります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 |
;================================= ;fileopenでlist.txtを開き、FHに格納 ;================================= fileopen FH 'list.txt' 0 ;================================= ;whileでループを開始する ;================================= while 1 ;================================= ;filereadlnでFHから読み出し ;LINEに格納 ;================================= filereadln FH LINE ;================================= ;ifを使って、ファイルの最後まで来たら、 ;マクロのループから抜ける ;================================= if result=1 then break endif ;================================= ;LINEにIPアドレスが格納されたので、 ;LINEをIP_ADDRに代入する ;================================= IP_ADDR = LINE ;================================= ;変数格納 ;================================= PWD = 'cisco123' ;IPアドレスに必要なオプションを追加する strconcat IP_ADDR ':23 /nossh /T=1' ;================================= ;telnet接続、ログ保存ディレクトリ ;================================= connect IP_ADDR getdir DIR changedir DIR ;================================= ;ログ保存名の確定 ;================================= getdate DATE '%Y%m%d-%H%M%S.log' SHRUN = 'show_run_' SHLOG = 'show_log_' strconcat SHRUN DATE strconcat SHLOG DATE ;================================= ;show runのログを取得 ;================================= logopen SHRUN 0 0 wait 'Password:' sendln PWD wait '>' pause 3 sendln 'en' wait 'Password' pause 3 sendln PWD wait '#' pause 3 sendln 'terminal length 0' wait '#' pause 3 sendln 'show run' pause 5 sendln '' wait '#' logclose ;================================= ;show logのログを取得 ;================================= logopen SHLOG 0 0 sendln 'show log' pause 5 sendln '' wait '#' sendln 'exit' logclose pause5 ;================================= ;ここでループ元に戻る ;================================= endwhile ;================================= ;FHを無効化する ;================================= fileclose FH end |
これで、IPアドレスのリストに対して、show run、show logを取りに行くマクロが完成しました。
17-23行目にifを入れ込むだけでOKです。
さらに、92行目には念のためPauseを5秒追加しています。
Pauseを入れる理由は、Loopへの戻りが早すぎてマクロがこけることがよくあるからです。マクロのエラーが毎回違う行で起きる場合は、Pauseを入れてみることをおすすめします。
ここまでで、基本的なマクロの解説は終わりです。
次回以降はここまでに作ったサンプルマクロを使って、もっと便利なマクロを作っていこうと思います。