見出し画像

Tera Termマクロでファイルの存在を確認する方法

マクロ実行時にファイルが存在するのか確認したい場合があります。今回はファイルが存在するのかマクロで確認する方法を解説します。


ファイルステータスを取得するコマンド

filestatはTera Term 4.66以降で使用できるコマンドです。このコマンドは、ファイルのサイズや最終変更時刻、ドライブ番号を取得します。

使い方は次のようになります。

filestat <filename> <size> [<mtime>] [<drive>]

  filenameにステータスを取得したいファイル名、sizeはファイルサイズが格納される変数です。mtimedriveは指定しなくても大丈夫です。

このコマンドは、ァイルステータスの取得に失敗するとシステム変数resultに「-1」が格納されます。 マクロでファイルの存在確認をするサンプルコードは次のとおりです。

;ファイルの存在を確認するサンプル

; 存在確認するファイル
filename = 'hoge.txt'
size = 0
filestat filename size
if result == -1 then
    messagebox 'ファイルが存在しない' size
else
    messagebox 'ファイルが存在する' size
endif

もしもディレクトリだったら?

filestatはファイルでなくディレクトであった場合でもシステム変数resultは「-1」にならず、ファイルが存在するときと同様に「0」が格納されます。

ファイルとディレクトリを一発で判別する正しい方法

ファイルとディレクトリを判別するにはgetfileattrを使います。

name = "C:\test"

getfileattr name

if result < 0 then
    messagebox "not found" name
elseif result & $10 then
    messagebox "directory" name
else
    messagebox "file" name
endif

getfileattrはTera Term 4.69以降で使うことができるTTLコマンドで、次のように使います。

getfileattr <filename>

これでfilenameで指定したファイルの属性を取得します。

属性の取得に失敗した場合はシステム変数resultに「-1」が格納されます。成功すると、属性値がシステム変数resultへ格納されます。

※属性値の頭に「$」が付いているのは16進数という意味です。

  • $1 … 読み取り専用

  • $2 … 隠しファイルまたは隠しディレクトリ

  • $4 … オペレーティングシステムの一部、またはオペレーティングシステム専用

  • $10 … ディレクトリ

  • $20 … アーカイブ

  • $80 … 特に属性はない

  • $100 … 一時ファイル

  • $200 … スパースファイル

  • $400 … 再解析ポイントが関連付けられているか、シンボリックリンク

  • $800 … 圧縮されている

  • $1000 … オフラインの記憶装置へ物理的に移動された(Windows 2000 以降)

  • $2000 … インデックスサービスの対象になっていない(Windows 2000 以降)

  • $4000 … 暗号化されている

これらの属性値を使ってファイル属性を判別します。さきほどのサンプルコードで属性値を次のように判別していました。

elseif result & $10 then

この「&」はビット演算子です。ビット演算子はTera Term 4.53以降で使うことができます。

ファイルは複数の属性を持つ場合があるため「==」で比較するのではなくビット演算子でフラグが立っているのか確認しています。

たとえば読み取り専用か知りたければ「result & $1」で調べる事ができます。

この記事が気に入ったらサポートをしてみませんか?