連載
» 2008年05月15日 00時00分 公開

基礎解説 演習方式で身につけるチェック式WSH超入門:第17回 FileSystemObjectオブジェクトを利用する(2) (3/5)

[牟田口大介(Microsoft MVP Data Center Management - Admin Frameworks),著]

 まずは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    

 このスクリプト・ファイルに任意のファイルもしくはフォルダをドロップすると、以下のようにプロパティが表示される。

GetFileOrFolderInfo.vbsの実行例
「C:\script\はるのおと04仕上げ.mid」というファイルをドロップした場合の結果。

 このスクリプトでは、まず、スクリプトに渡されたコマンドライン引数を参照し(第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.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。