【Tera Term】マクロの二重実行によるログファイルの上書きを防止する方法

マクロ

【事故事例】マクロの二重実行によるログファイルの上書き

ネットワーク構築において現地作業を行う際に、機器ログを Tera Term のマクロを使用して取得するということはよくあります。

例えば、マクロの設計として保存するログファイルの名前を以下のような固定の名前としているケースを考えます。

;ログ保存開始
logopen "C:\Users\user01\Desktop\作業ログ\ログファイル名.log" 0 0

この場合、マクロを実行すると「ログファイル名.log」という名前のファイルが作成されます。

ここで、一度当該マクロを実行してログを取得した後、誤って同じマクロをもう一度実行してしまった場合、既存のログファイルが上書きされてしまいます。

過去に戻って過去の状態におけるログを取得することはできないため、これは場合によっては重大な事故とみなされてしまう場合があります。

このような事態は避ける必要があります。

最もシンプルで有益な回避策【タイムスタンプを入れる】

この事態を回避するための最もシンプルで有益な回避策は、ログファイル名にマクロ実行タイミングにおける現在時刻を付け加えることです。秒単位まで含めれば誤ってログファイルを上書きするということはまず発生しません。

また、ログを取得した時刻というのは重要な情報のため、ログファイル名にタイムスタンプを含めておくことは有益と言えます。

この意味で一石二鳥の方法と言えます。

Tera Term マクロで現在時刻を取得する方法

Tera Term マクロで現在日時を取得する関数は gettime です。

  • gettime <変数名> [<フォーマット>]
    • <変数名> で指定した変数に <フォーマット> で指定した形式で日時が格納される
    • <フォーマット>を指定しない場合は "HH:MM:SS" の形式となる
    • <フォーマット> での日時指定方法は以下の通り
      • %Y → yyyy (西暦年)
      • %m → mm (月)
      • %d → dd (日)
      • %H → HH (時)
      • %M → MM (分)
      • %S → SS (秒)

実行例:

;現在日時取得
gettime timestr "%Y/%m/%d %H:%M:%S"

;取得した日時をメッセージボックスで表示
messagebox timestr "gettime"

上のマクロを実行すると以下のようなメッセージボックスが表示されます。

現在日時を取得できていることが分かります。

ログファイル名となる文字列を構築する

gettime 関数を使用して、Tera Term マクロでログ取得を開始する際に指定するログファイル名を構築します。

例として、ログファイル名を次の名前とします。

  • <マクロファイル格納フォルダ>\<ホスト名>_yyyymmdd_hhmmss.log

上の文字列を構築するためのマクロは以下の通りです。

;機器に SSH 接続
connect "10.1.10.1 /ssh /auth=password /user=admin /passwd=hogepiyo"

;ホスト名を取得
gethostname logfileName

;現在日時を取得しつつ、ファイル名の一部を構築
gettime timestr "_%Y%m%d_%H%M%S.log"

;文字列を連結してファイル名を構築
strconcat logfileName timestr

;マクロファイル格納フォルダのパスを取得
getdir logfilePath

;文字列を連結してファイルパスを構築
strconcat logfilePath "\"
strconcat logfilePath logfileName

上のマクロを実行すると以下のような文字列が変数 logfilePath に格納されます。

C:Users\user01\Desktop\10.1.10.1_20220219_192300.log

ログファイル名となる文字列を構築できたら、あとはそれを logopen で使用するだけです。

;ログ取得を開始する
logopen logfilePath 0 0

;任意のコマンドを実行する(コマンド実行する命令文をここに追記)

;ログ取得を終了する
logclose

関数 gethostname は、connect 関数の接続先で指定した値を取得します。

  • gethostname <変数名>
    • <変数名>で指定した変数に値が格納されます

関数 strconcat は、文字列変数に文字列を連結する関数です。

  • strconcat <変数名> "文字列"
    • 指定した変数の値が 元の変数の値 + 指定した文字列 になります

関数 getdir は、マクロファイルの格納先フォルダパスを取得します。

  • getdir <変数名>
    • <変数名>で指定した変数にフォルダパスが格納されます

参考資料

https://ttssh2.osdn.jp/manual/4/ja/macro/command/gettime.html

タイトルとURLをコピーしました