Tera Term マクロでテキストファイルを読み込む
Tera Term マクロでは、テキストファイルの内容を1行ずつ読み込み処理することができます。これにより接続対象機器情報や実行コマンドリストをテキストファイルから読み込むといったことができます。
動作確認環境
- Tera Term Version 4.104
Tera Term マクロでテキストファイルを読み込む方法
テキストファイルを読み込む場合は以下の順に処理を行います。
- テキストファイルを開く
- 以下を繰り返す
- テキストファイルから1行ずつ内容を読み込む
- 1行読み込むごとに必要な処理を行う
- テキストファイルの末尾まで読み込んだらテキストファイルを閉じる
① テキストファイルを開く【fileopen】
テキストファイルを開くためには fileopen コマンドを使用します。
- fileopen <変数名> <ファイルパス> <append flag> [<readonly flag>]
- <変数>:ファイルハンドルが格納される変数。任意の変数名を指定
- <ファイルパス>:開く対象のファイルパス。絶対パスまたはマクロファイル格納フォルダからの相対パスで指定可能
- 指定したファイルが存在しない場合、指定した名前のファイルが作成されて開かれる
- <append flag>:ファイルポインタの位置を「0」か「0 以外の整数」で指定
- 0 ⇒ ファイルポインタはファイルの最初になる
- 0以外 ⇒ ファイルポインタはファイルの最後になる
- 読み込み目的で開く場合は「0」を指定する
- <readonly flag>:オプション。読み書きモード(デフォルト)の場合は「0」、読み取り専用モードの場合は「0以外の整数」を指定する。
- バージョン 4.85 以降から使用可能なオプション。読み取り専用モードにする必要がある場合以外は指定しない方が安全
- 対象ファイルが正しく開けなかった場合、システム変数 result に「-1」が格納される
以下は、マクロファイルと同じフォルダに格納された「sample.txt」を開く場合の記述例です。ファイルハンドルを格納する変数名 fhandle としています。
filename = 'sample.txt'
fileopen fhandle filename 0
ファイルの存在チェックを行う
上記の説明の通り fileopen コマンドでは指定したファイルが存在しない場合でもエラーにはならず、新規にファイルが作成されてそれが開かれます。ファイル読み込みを目的とするマクロとしてはこれは避けるべき動作となります。
当サイトでは読み込み目的でファイルを開く前に対象ファイルの存在チェックを行うことを推奨します。ファイルの存在チェックは filesearch コマンドで行います。
- filesearch <ファイルパス>
- <ファイルパス>:存在チェック対象のファイルパス。絶対パスまたはマクロファイル格納フォルダからの相対パスで指定可能
- 対象ファイルが存在する場合システム変数 result に「1」が、存在しない場合は「0」が格納される
以下は「sampleee.txt」という名前のテキストが存在するかどうかをチェックし、存在しない場合はマクロ処理を終了するマクロです。
filename = 'sampleee.txt'
filesearch filename
if result = 0 then
sprintf2 message '%sが存在しません。処理を中止します。' filename
messagebox message 'エラー'
end
endif
ファイルが正しく開けたかチェックを行う
fileopen を実行した結果として対象ファイルが正しく開けなかった場合、システム変数 result に「-1」が格納されます。この仕様を利用してファイルが正しく開けなかった場合にエラーとしてマクロ処理を終了させることができます。
fileopen fhandle filename 0
if result = -1 then
sprintf2 message '%sを正しく開けませんでした。処理を中止します。' filename
messagebox message 'エラー'
end
endif
当サイトではファイルが正しく開けたかチェックを行うことを推奨します。
② テキストファイルから1行ずつ読み込む【filereadln】
テキストファイルを開いたら filereadln コマンドを使用して1行ずつ内容を読み込みます。
- filereadln <ファイルハンドル変数名> <格納変数名>
- <ファイルハンドル変数名>:開いたファイルのファイルハンドルが格納された変数
- <格納変数名>:読み込まれた1行分の文字列を格納する変数
- ファイルの最後に達した場合、システム変数 result に「1」が格納される。それ以外の場合は「0」が格納される
以下はファイルハンドルを格納した変数 fhandle を使用して対象ファイルから1行読み込み変数 readline に格納することをファイルの最後に達するまで繰り返すマクロです。
while 1
filereadln fhandle readline
if result = 1 break
messagebox readline 'ファイル内容'
endwhile
ファイルを全行読み込むためには上記マクロ例のように while 文を使用して繰り返し filereadln を実行します。filereadln 実行後に result が「1」になっている場合、ファイルの最後に達したことを意味するため break で while 文を抜けるようにしています。
③ テキストファイルを閉じる【fileclose】
ファイル内容の読み込みが完了したら fileclose コマンドでファイルを閉じます。
- fileclose <ファイルハンドル変数名>
- <ファイルハンドル変数名>:開いたファイルのファイルハンドルが格納された変数
fileclose fhandle
【マクロ例】ファイルから読み込んだ値を配列に格納する
以下のような IP アドレスのリストが記載されたテキストファイル「sample.txt」があります。
192.168.1.1
192.168.1.2
192.168.1.3
192.168.1.4
192.168.1.5
このファイルを読み込み、各IPアドレスを配列に格納するマクロは以下のように記述できます。
;; 変数定義
filename = 'sample.txt'
strdim ipaddress 10
;; ファイル存在チェック
filesearch filename
if result = 0 then
sprintf2 message '%sが存在しません。処理を中止します。' filename
messagebox message 'エラー'
end
endif
;; ファイルオープン
fileopen fhandle filename 0
if result = -1 then
sprintf2 message '%sを正しく開けませんでした。処理を中止します。' filename
messagebox message 'エラー'
end
endif
;; ファイルから行を読み込み配列に値を格納
i = 0
while 1
filereadln fhandle readline
if result = 1 break
ipaddress[i] = readline
i = i + 1
endwhile
;; ファイルクローズ
fileclose fhandle
このマクロを実行すると、以下のようにファイルの内容が配列に格納されます。
- ipaddress[0] ← 192.168.1.1
- ipaddress[1] ← 192.168.1.2
- ipaddress[2] ← 192.168.1.3
- ipaddress[3] ← 192.168.1.4
- ipaddress[4] ← 192.168.1.5
まとめ
- Tera Termマクロではファイルオープンは fileopen、1行読み込みは filereadln、ファイルクローズは fileclose で行う
- ファイルオープン時はエラーチェックをすることが当サイトの推奨
- ファイルから機器情報や実行コマンドリストを読み込むといった活用ができる
- 基礎知識
- コマンド解説
- ログイン
- コマンド実行
- ログ保存
- ファイル・フォルダ操作
- 文字列操作
- 変数関連
- マクロのモジュール化
- テクニック
- サブルーチン
- オリジナルマクロ
コメント