Tera Term マクロでサブルーチンを使用する
Tera Term マクロのサブルーチンとは、一連の処理をひとまとめにした処理の定義です。他のプログラミング言語でいうと、プロシージャ、関数、メソッドなどと同じような位置付けのものになります。
この記事ではサブルーチンの作成方法と使用法の基礎について説明します。
動作確認環境
- Tera Term Version 4.104
サブルーチンのイメージ
サブルーチンはマクロ処理の部品のようなイメージです。
サブルーチンを使用しない場合、マクロ処理は全体で一つの一連の処理の流れになります。

サブルーチンを使用する場合、マクロの一連の処理はいくつかのサブルーチンに分割され、メイン処理からサブルーチンを呼び出して処理を実行します。

サブルーチンを使用するメリット
処理の流れが分かりやすくなり保守性が向上する
処理内容の多いマクロを作成する場合、サブルーチンを使用しない場合行数が長くなり、処理の流れが分かりにくくなります。そうすると保守性が低くなります。サブルーチンを使用して処理を分割することで処理の流れが分かりやすくなります。
処理の再利用が容易になる
ある機能を持つ一連の処理をサブルーチン化することで処理の再利用をすることができるようになります。行数の多い処理もサブルーチンを呼び出す記述をするだけで同じ処理を繰り返すことができます。特に、パラメータが違うだけの同じ処理を繰り返し行う場合にサブルーチンは効果を発揮します。
サブルーチンの作成方法と呼び出し方法
サブルーチンの作成方法
サブルーチンは以下の形式で作成します。
- :<サブルーチン名>
- <一連の処理内容を記述>
- return
- サブルーチンの最初の行は行頭にコロン「:」を記載した後にサブルーチン名を記載します
- サブルーチンの処理の終わりには「return」と記載します
以下は SSH 接続するサブルーチンです。
;;=========================================
;; SSH接続用サブルーチン
;;=========================================
:sshlogin
sprintf2 concom '%s:22 /ssh /2 /auth=password /user=%s /passwd=%s /nosecuritywarning' address username userpass
connect concom
return
サブルーチンの呼び出し方法
メイン処理からサブルーチンを呼び出すためには call コマンドを使用します。
- call <サブルーチン名>
以下は SSH 接続するサブルーチン sshlogin を呼び出すマクロです。
call sshlogin
end
;;=========================================
;; SSH接続用サブルーチン
;;=========================================
:sshlogin
sprintf2 concom '%s:22 /ssh /2 /auth=password /user=%s /passwd=%s /nosecuritywarning' address username userpass
connect concom
return
サブルーチンへの引数の渡し方
他のプログラミング言語を習得している人は、サブルーチンに対して処理で使用する値(引数)を渡すことを考えると思います。
Tera Term マクロではサブルーチンに対して引数を設定するような仕組みはありません。代わりに、サブルーチン内で使用する変数に対して値を設定してからサブルーチンを呼び出すという手法を採ります。
以下のマクロ例では SSH 接続を行うサブルーチンを呼び出す際、サブルーチン内で使用する変数に対して値を設定してからサブルーチンの呼び出しを行うことでサブルーチンに実質的に引数を与えています。
address = '10.1.1.1'
username = 'admin'
userpass = 'admin'
call sshlogin
end
;;=========================================
;; SSH接続用サブルーチン
;;=========================================
:sshlogin
sprintf2 concom '%s:22 /ssh /2 /auth=password /user=%s /passwd=%s /nosecuritywarning' address username userpass
connect concom
return
他のプログラミング言語における関数の「戻り値」にあたる機能も Tera Term マクロのサブルーチンには存在しません。サブルーチンでの計算結果をメイン処理に引き継ぎたい場合は、サブルーチン内で変数に値を格納し、メイン処理でその変数の値を参照するという手法を採ります。
サブルーチン作成時はメイン処理の最後に「end」を記載する
サブルーチン作成時の注意点として、メイン処理の最後に「end」を記載します。マクロを実行するとマクロファイルに記載されている処理が上から下に向かい順に実行されますが、メイン処理の最後に「end」がない場合、その下に記載されているサブルーチンが実行されてしまうためです。
サブルーチン使用時の変数のスコープについて
変数のスコープとは、マクロ処理の中のどの範囲で変数を参照・使用できるかということです。他のプログラミング言語では、どの関数からでも参照・使用できる変数は「グローバル変数」、特定の関数内でのみ参照・使用できる変数は「プライベート変数」などと呼ばれ、変数にスコープが存在します。
一方、Tera Term マクロの変数には「スコープ」にあたる概念は存在せず、すべての変数はどこからでも参照・使用できます。このためメイン処理・各サブルーチンで同名の変数を使用すると予期しない値の書き換えが起こる可能性があります。各変数がどこで使用されているかを考慮しつつマクロを作成する必要があります。
サブルーチン作成時のマクロの構成
サブルーチンを作成して使用する場合、当サイトではマクロを以下の3つの要素に分割して記述することを推奨します。
- 変数定義パート
- メイン処理パート
- サブルーチンパート

マクロを再利用する際に変数定義パートの変数値のみ変えれば良い設計にしておけば保守性の高いマクロになります。
【マクロ例】Cisco 機器への SSH 接続
以下は、①SSH接続、②ログ保存開始、③特権EXECモードへの移行の3つのサブルーチンを使用した Cisco 機器ログインマクロの例です。
;;=========================================
;; (1)変数定義パート
;;=========================================
hostname = 'MyRouter'
address = '10.1.1.1'
username = 'admin'
userpass = 'admin'
enablepass = 'admin'
sprintf2 prompt_user '^%s.*>' hostname
sprintf2 prompt_privilege '^%s.*#' hostname
;;=========================================
;; (2) メイン処理パート
;;=========================================
call sshlogin
call startlogging
call becomeprivilege
end
;;=========================================
;; (3)サブルーチンパート
;;=========================================
;;-----------------------------------------
;; SSHログイン用サブルーチン
;;-----------------------------------------
:sshlogin
sprintf2 concom '%s:22 /ssh /2 /auth=password /user=%s /passwd=%s /nosecuritywarning' address username userpass
connect concom
return
;;-----------------------------------------
;; ログ取得開始用サブルーチン
;;-----------------------------------------
:startlogging
loginfo logfilename
if result <> -1 logclose
getdir logfilepath
gettime timestr '%Y%m%d-%H%M%S.log'
sprintf2 logfilepath '%s\%s_%s' logfilepath hostname timestr
logopen logfilepath 0 0
return
;;-----------------------------------------
;; 特権EXECモードに移行用サブルーチン
;;-----------------------------------------
:becomeprivilege
sendln
waitregex prompt_user
flushrecv
sendln 'enable'
wait 'Password:'
flushrecv
sendln enablepass
waitregex prompt_privilege
return
まとめ
- サブルーチンとは一連の処理の流れをひとまとめにした処理の定義で、マクロの部品のようなもの
- サブルーチンの定義は「:<サブルーチン名>」で始まり「return」で終わる
- サブルーチンを呼び出すときは call コマンドを使用する
- メイン処理の最後には「end」を忘れずに
- サブルーチンを作成して使用する場合、変数定義パート、メイン処理パート、サブルーチンパートの3要素に分けて記載しよう
- 基礎知識
- コマンド解説
- ログイン
- コマンド実行
- ログ保存
- ファイル・フォルダ操作
- 文字列操作
- 変数関連
- マクロのモジュール化
- テクニック
- サブルーチン
- オリジナルマクロ
コメント