【事故事例】マクロの二重実行によるログファイルの上書き
ネットワーク構築において現地作業を行う際に、機器ログを 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