第17回 FileSystemObjectオブジェクトを利用する(2):基礎解説 演習方式で身につけるチェック式WSH超入門(3/5 ページ)
ファイル/フォルダのプロパティの参照や属性の設定、オブジェクトとコレクションを利用したきめ細かいファイル操作の手法などについて解説する。
まずはFileオブジェクトもしくはFolderオブジェクトを取得し、これらのプロパティを参照する例を示そう。
※ファイル:GetFileOrFolderInfo.vbs
Option Explicit
Dim objFSO
Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")
Dim strArgument
Dim objItem
Dim strName, strShortName, strPath, strShortPath, strParentFolder, _
strDrive, lngSize, strType, strAttributes, _
dtmCreated, dtmLastAccessed, dtmLastModified
If WScript.Arguments.Count > 0 Then 'コマンドライン引数が存在すれば
strArgument = WScript.Arguments(0) '1つ目の引数を取る
'もし引数がファイルなら
If objFSO.FileExists(strArgument) Then
'Fileオブジェクト取得
On Error Resume Next
Set objItem = objFSO.GetFile(strArgument)
If Err.Number <> 0 Then
Set objItem = Nothing
End If
On Error Goto 0
'もし引数がフォルダなら
ElseIf objFSO.FolderExists(strArgument) Then
'Folderオブジェクト取得
On Error Resume Next
Set objItem = objFSO.GetFolder(strArgument)
If Err.Number <> 0 Then
Set objItem = Nothing
End If
On Error Goto 0
Else
'いずれでもない場合は
Set objItem = Nothing
End If
If Not objItem Is Nothing Then 'objItemがNothingでないなら
On Error Resume Next
strName = objItem.Name '名前
strShortName = objItem.ShortName 'DOSでの名前(8+3)
strPath = objItem.Path 'パス
strShortPath = objItem.ShortPath 'DOSでのパス
strParentFolder = objItem.ParentFolder '親フォルダのパス
strDrive = objItem.Drive 'ドライブのパス
lngSize = objItem.Size 'サイズ(byte)
strType = objItem.Type 'ファイルの種類
'属性。GetAttributes関数を呼び出している
strAttributes = GetAttributes(objItem.Attributes)
dtmCreated = objItem.DateCreated '作成日時
dtmLastAccessed = objItem.DateLastAccessed 'アクセス日
dtmLastModified = objItem.DateLastModified '更新日時
On Error Goto 0
MsgBox strName & vbCrLf & "(" & strPath & ")" & vbCrLf & vbCrLf & _
"種類 : " & strType & vbCrLf & _
"場所 : " & strParentFolder & vbCrLf & _
"サイズ : " & FormatNumber(lngSize, 0) & "byte" & vbCrLf & vbCrLf & _
"MS-DOS ファイル名 : " & strShortName & vbCrLf & "(" & strShortPath & ")" & vbCrLf & vbCrLf & _
"作成日時 : " & dtmCreated & vbCrLf & _
"更新日時 : " & dtmLastModified & vbCrLf & _
"アクセス日 : " & dtmLastAccessed & vbCrLf & vbCrLf & _
"属性 : " & strAttributes, _
, strName & "のプロパティ"
End If
End If
Set objItem = Nothing
Set objFSO = Nothing
'属性を示す数字が与えられると、その属性名を返す
Function GetAttributes(lngAttribute)
Const Normal = 0 '標準ファイル
Const ReadOnly = 1 '読み取り専用ファイル
Const Hidden = 2 '隠しファイル
Const System = 4 'システム・ファイル
Const Volume = 8 'ディスク・ドライブ・ボリューム・ラベル。値の取得のみ可能
Const Directory = 16 'フォルダまたはディレクトリ。値の取得のみ可能
Const Archive = 32 'アーカイブ
Const Alias = 1024 'リンクまたはショートカット。値の取得のみ可能(古い環境では64)
Const Compressed = 2048 '圧縮ファイル。値の取得のみ可能(古い環境では128)
If (lngAttribute And ReadOnly) = ReadOnly Then GetAttributes = GetAttributes & "読み取り専用 "
If (lngAttribute And Hidden) = Hidden Then GetAttributes = GetAttributes & "隠しファイル "
If (lngAttribute And System) = System Then GetAttributes = GetAttributes & "システム "
If (lngAttribute And Directory) = Directory Then GetAttributes = GetAttributes & "フォルダ "
If (lngAttribute And Archive) = Archive Then GetAttributes = GetAttributes & "アーカイブ "
If (lngAttribute And Compressed) = Compressed Then GetAttributes = GetAttributes & "圧縮 "
End Function
このスクリプト・ファイルに任意のファイルもしくはフォルダをドロップすると、以下のようにプロパティが表示される。
このスクリプトでは、まず、スクリプトに渡されたコマンドライン引数を参照し(第10回参照)、それがファイルであるか(FileExistsメソッドの戻り値がTrueであるか)、フォルダであるか(FolderExistsメソッドの戻り値がTrueであるか)、あるいは別の何かであるかに基づいて、条件分岐をしている。ファイルならGetFileメソッドの引数に渡してFileオブジェクトを取得し、フォルダならGetFolderメソッドの引数に渡してFolderオブジェクトを取得している。なお引数には絶対パス表記のほかに相対パス表記も可能である。いずれでもない場合はNothingを代入している(エラーが発生した場合も同様)。この後FileオブジェクトとFolderオブジェクトのプロパティを参照するが、どちらにも共通のプロパティを参照するので、同じ変数objItemに格納している。
objItem変数にはFolderオブジェクト、Fileオブジェクト、Nothingのいずれかが格納されているが、Nothingの場合は処理しないのでIfステートメントで場合分けしている。この際、オブジェクトの比較は=演算子ではなくIs演算子を使うことに注意していただきたい。
続いてobjItemのプロパティを参照しているが、例えばFolderオブジェクトのSizeプロパティ参照は環境によってエラーになったり(筆者は逆にエラーにならない環境を知らないが)、DateLastModifiedプロパティが「(不明)」の場合にエラーになったりなど、エラーが発生する可能性があるので、On Errorステートメントを用いる。あとは通常のプロパティ参照と同様である。
ただしAttributesプロパティだけは少し特殊で、このプロパティはファイルまたはフォルダの属性を示すビットの合計値である。そのため、実際の属性名を取り出すには、属性の「ビット演算」をしなくてはならない。この処理は別途GetAttributes関数を用意して、その中で処理している。この関数は属性を表す数値から、属性名をスペース区切りで返す。ある数値から目的とするビットが立っているかどうかを調べるにはビット演算子であるAnd演算子を用いる(注:VBScriptでは、And演算子は論理演算子でもある)。
Copyright© Digital Advantage Corp. All Rights Reserved.