投入するコマンドをマクロ本体に書いてしまうと、コマンドを変えるたびにマクロを修正することになります。コマンドを別のテキストファイルに分けておけば、マクロは触らずに投入内容だけ差し替えられます。
ファイル構成
マクロと同じフォルダに command.txt を置きます。
macro.ttl
command.txt
command.txt の中身
show version
get system status
show running-config
1行に1コマンドを書きます。
コード
EnPrompt = 'test-FW#'
getdir Dir
command_file_path = ''
strconcat command_file_path Dir
strconcat command_file_path '\command.txt'
; 読み取り専用で開く
fileopen fh2 command_file_path 0 1
:freadloop
filereadln fh2 com
if result goto breakloop
sendln com
wait EnPrompt
goto freadloop
:breakloop
fileclose fh2
各コマンドの役割
| コマンド | 役割 |
|---|---|
fileopen fh2 <パス> 0 1 |
ファイルを読み取り専用で開く |
filereadln fh2 com |
1行読み込んで変数 com に入れる |
if result goto breakloop |
ファイル末尾に達したらループを抜ける |
sendln com |
読み込んだコマンドを送信する |
wait EnPrompt |
プロンプトが返るまで待つ |
fileclose fh2 |
ファイルを閉じる |
filereadln はファイル末尾に達すると result に1を返します。これを終了条件に使っています。
waitが重要な理由
wait を入れずに sendln を連続させると、前のコマンドの出力が終わる前に次のコマンドが送られます。タイミングによっては、コマンドが実行されないまま次に進んでしまいます。
; 悪い例:結果が取れないことがある
sendln 'show version'
sendln 'show running-config'
; 良い例:プロンプトを待ってから次へ
sendln 'show version'
wait EnPrompt
sendln 'show running-config'
wait EnPrompt
ページャを無効にしておく
出力が長いコマンドでは、機器側が --More-- で止まります。この状態で wait を掛けるとプロンプトが返らず、マクロが固まります。
接続直後にページャを無効化してください。
; Cisco IOS
sendln 'terminal length 0'
wait EnPrompt
; Fortigate
sendln 'config system console'
wait '#'
sendln 'set output standard'
wait '#'
sendln 'end'
wait EnPrompt
これを忘れると「途中でマクロが止まる」という現象になります。原因が分かりにくいので、最初に入れておくことをおすすめします。
waitにタイムアウトを設定する
プロンプトが返らないケースに備え、タイムアウトを設定しておくと安全です。
timeout = 30
sendln com
wait EnPrompt
if result = 0 then
messagebox "コマンドの応答がありませんでした" "タイムアウト"
endif
timeout に秒数を設定すると、wait はその時間で打ち切られ、result に0が返ります。