マクロは陰で使うもの。生産性を上げても給料は上がらず仕事が増えるだけなので仕事をサボろう!

Tera Term マクロのサブルーチン(自作関数)の作成・使用方法を解説

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)
  • 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つの要素に分割して記述することを推奨します。

マクロの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

まとめ

CHECK!
  • サブルーチンとは一連の処理の流れをひとまとめにした処理の定義で、マクロの部品のようなもの
  • サブルーチンの定義は「:<サブルーチン名>」で始まり「return」で終わる
  • サブルーチンを呼び出すときは call コマンドを使用する
  • メイン処理の最後には「end」を忘れずに
  • サブルーチンを作成して使用する場合、変数定義パート、メイン処理パート、サブルーチンパートの3要素に分けて記載しよう

Tera Term マクロ関連記事リスト


Amazon で買えるおすすめアイテム(アフィリエイト)

ブログ始めるなら 【アフィリエイトリンク】

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)