FileSystemObjectはファイル操作のための基本オブジェクトだ。WSHでファイルやフォルダをコピーしたり、移動、削除する方法について解説する。
前回までは、WSHのオブジェクト(WScriptオブジェクト、WshShellオブジェクト、WshNetworkオブジェクト)について解説してきた。
今回からは、主にファイル操作を行うためのオブジェクトであるFileSystemObjectオブジェクトと、そこから呼び出し可能な各オブジェクトについて解説していく(これらのオブジェクトは、WSH 5.6が含まれるWindows Script 5.6のパッケージに含まれている)。
■連載目次
第1回 WSHを始めよう
第2回 VBScript基本(1)文字列の入出力
第3回 VBScript基本(2)計算と分岐処理
第4回 関数を使いこなす:文字列、数値、日付
第5回 データ型について理解を深めよう
第6回 VBScriptの配列を極める
第7回 Subプロシージャで処理を定義
第8回 Functionプロシージャで関数を定義
第9回 VBScriptのオブジェクトを使いこなす
第10回 WScriptオブジェクト(1)
第11回 WScriptオブジェクト(2)
第12回 WshShellオブジェクト(1)
第13回 WshShellオブジェクト(2)
第14回 WshShellオブジェクト(3)
第15回 WshNetworkオブジェクト
第16回 FileSystemObjectオブジェクト(1)
第17回 FileSystemObjectオブジェクト(2)
第18回 FileSystemObjectオブジェクト(3)
第19回 TextStream/Dictionaryオブジェクト
FileSystemObjectオブジェクトは、WSH 5.6やVBScript 5.6などを含むWindows Script 5.6パッケージの中の1つ、Windows Script Runtime 5.6ライブラリに含まれるオブジェクトである。WSH 5.6には、スクリプト・ホスト実行ファイルwscript.exe、cscript.exeのほか、WScriptオブジェクト、WshShellオブジェクト、WshNetworkオブジェクト、本連載では取り上げなかったがWshController/WshRemoteオブジェクトが含まれている。
第1回ではFileSystemObjectオブジェクトを便宜上、WSH内部オブジェクトとして紹介したが、厳密にいうと、「WSHの含まれるパッケージに含まれるオブジェクト」である。また、WSH以外でもASP(Active Server Pages)、Visual Basic 6.0などでも用いられている。しかしながらWSHを使ってファイル操作を行うにはFileSystemObjectオブジェクトは必須であり、WSHがインストールされている環境には必ず含まれているので、ほぼWSHのセットとして考えて差し支えない。
FileSystemObjectはProgIDが“Scripting.FileSystemObject”であり、文字どおりファイル・システムにアクセスするためのオブジェクトである。このオブジェクトを使うことでファイルやフォルダの移動/コピー/削除や、ファイルの拡張子名や親フォルダ・パスの取得などが行える。
また、ドライブ、フォルダ、ファイルをオブジェクトとして取得するメソッドがあり、それぞれDriveオブジェクト、Folderオブジェクト、Fileオブジェクトに対応する。これらのオブジェクトはファイル(フォルダ、ドライブ)名やファイル(フォルダ)属性、最終更新日時などのプロパティを持ち、取得/設定が可能である。また、Drive、Folder、FileオブジェクトのコレクションであるDrivesコレクション、Foldersコレクション、Filesコレクションというのも存在し、それぞれ対応するオブジェクトを要素として持つ。これらのコレクションは主に親オブジェクトのメソッドやプロパティから取得可能である。(例えばFilesコレクションなら当該フォルダのFolderオブジェクトのFilesプロパティから取得可能であり、当該フォルダに含まれるすべてのファイルの集合のインスタンスに対応している)。
さらに、テキスト・ファイルをテキスト・ストリーム(TextStream)オブジェクトとして取得し、文字列を読み書き可能なメソッドも存在する。
今回はこのうち、FileSystemObjectオブジェクト直下のメンバを取り上げ、解説していく。次回以降にFileオブジェクトやTextStreamオブジェクトなど、FileSystemObjectオブジェクトから生成可能なインスタンス、およびDictionaryオブジェクトについて解説する予定である。
FileSystemObjectオブジェクトのメンバは以下の4つに大別できる。
1.ファイル/フォルダ/ドライブの情報を取得するもの | ||
BuildPathメソッド | パスに新しくフォルダ名あるいはファイル名を付け足したものを返す | |
DriveExistsメソッド | ドライブが存在するとTrueを返す | |
FolderExistsメソッド | フォルダが存在するとTrueを返す | |
FileExistsメソッド | ファイルが存在するとTrueを返す | |
GetAbsolutePathNameメソッド | フルパスを返す | |
GetFileNameメソッド | ファイル名あるいはフォルダ名を返す | |
GetBaseNameメソッド | 拡張子を除いたファイル名を返す | |
GetDriveNameメソッド | ファイルの存在するドライブ名を返す | |
GetExtensionNameメソッド | ファイルの拡張子名を返す | |
GetFileVersionメソッド | ファイルのバージョン情報を返す | |
GetParentFolderNameメソッド | 親フォルダのフルパスを返す | |
GetTempNameメソッド | 一時的なファイル名(.tmp)を生成して返す | |
2.ファイル/フォルダの操作(コピー、削除など)を行うもの | ||
CreateFolderメソッド | フォルダを作成し、Folderオブジェクトを返す | |
CopyFileメソッド | ファイルをコピーする | |
CopyFolderメソッド | フォルダをコピーする | |
MoveFileメソッド | ファイルを移動する | |
MoveFolderメソッド | フォルダを移動する | |
DeleteFileメソッド | ファイルを削除する | |
DeleteFolderメソッド | フォルダを削除する | |
3.ファイル/フォルダ/ドライブをオブジェクトとして取得するもの | ||
Drives プロパティ | Drivesコレクションを返す | |
GetDriveメソッド | Driveオブジェクトを返す | |
GetFolderメソッド | Folderオブジェクトを返す | |
GetSpecialFolderメソッド | 特殊フォルダのFolderオブジェクトを返す | |
GetFileメソッド | Fileオブジェクトを返す | |
4.テキスト・ファイルをオブジェクトとして取得するもの | ||
CreateTextFileメソッド | テキスト・ファイルを作成し、TextStreamオブジェクトを返す | |
OpenTextFileメソッド | TextStreamオブジェクトを返す | |
FileSystemObjectオブジェクトのメンバ |
今回はこのうち、1.と2.のメンバについて取り上げる。
ファイルなどの情報を取得するには、主に「Get〜」で始まるメソッドを用いて取得する。
※ファイル:GetFileInfo.vbs
Option Explicit
Dim objFSO, objWshShell
Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")
Set objWshShell = WScript.CreateObject("WScript.Shell")
'環境変数comspecを展開
Dim strFileName
strFileName = objWshShell.ExpandEnvironmentStrings("%comspec%")
'ここにファイル存在確認のコードを入れてもよい
Dim strInfo
strInfo = "ファイル名=" & _
objFSO.GetFileName(strFileName) & vbCrLf & _
"フルパス=" & _
objFSO.GetAbsolutePathName(strFileName) & vbCrLf & _
"親フォルダ名=" & _
objFSO.GetParentFolderName(strFileName) & vbCrLf & _
"ドライブ名=" & _
objFSO.GetDriveName(strFileName) & vbCrLf & _
"拡張子=" & _
objFSO.GetExtensionName(strFileName) & vbCrLf & _
"拡張子を除いた名前=" & _
objFSO.GetBaseName(strFileName) & vbCrLf & _
"ファイルバージョン=" & _
objFSO.GetFileVersion(strFileName)
MsgBox strInfo
Set objFSO = Nothing
Set objWshShell = Nothing
これは、コマンド・プロンプトの実行ファイルcmd.exeのファイル情報を得るスクリプトである。このスクリプトを実行すると、例えば次のように表示される。
なお注意すべきなのは、これらのメソッドはすべて、ファイルが実際に存在してもしなくても実行可能である点だ。これらのメソッドはただ単に引数に渡された文字列を解析して、ドライブ名や拡張子などを返すだけである。試しにこのスクリプトの
strFileName = objWshShell.ExpandEnvironmentStrings("%comspec%")
の部分を、
strFileName = objFSO.BuildPath("C:\kyonko",objFSO.GetTempName())
としてもらいたい。GetTempNameメソッドは拡張子が「〜.tmp」になるランダムなファイル名を文字列として返すメソッドである。またBuildPathメソッドは、引数に与えられた2つのパスに対し、適切なパス区切り文字“\”を補うか、あるいは(余分なら)削除して連結し、正しいパスにするメソッドである(*)。実行してみよう。
このように、ファイル自体が存在しなくても、パスの形式を取った文字列ならば、ドライブ名や親フォルダ名などが返される。またファイルだけではなく、フォルダの場合も同様に取得可能である。
*フォルダ名とファイル名の連結
フォルダ名(例えば“C:\新しいフォルダ\”)とファイル名(例えば“ファイル.txt”)を単純に連結する場合、
"C:\新しいフォルダ\" & "ファイル.txt"
のようにすれば“C:\新しいフォルダ\ファイル.txt”が得られると思うだろう。だが例えば、フォルダ名として“C:\新しいフォルダ”、ファイル名として“ファイル.txt”が与えられている場合は適切に“\”を加えないといけないし、フォルダ名として“C:\新しいフォルダ\”、ファイル名として“\ファイル.txt”が与えられている場合は“\”を削るコードを書かなければならない。実際にファイル操作を行う際は往々にしてこのようなケースが起こるので、それらを適切に処理してくれるBuildPathメソッドは有用である。
ファイルが存在しない場合はファイル情報を取得しない、といったコードを書きたければ、先ほどのサンプル・ファイルGetFileInfo.vbsの、
'ここにファイル存在確認のコードを入れてもよい
という部分に、次のコードを入れるとよい。
'FileExistsメソッドは引数のファイルが存在するとTrueを返す。
If Not objFSO.FileExists(strFileName) Then
MsgBox strFileName & "というファイルは存在しません。"
WScript.Quit
End If
こうすることで、引数のファイルが存在しない場合はスクリプトを終了させることができる。FileExistsメソッドは、引数に与えられたパスのファイルが存在する場合はTrueを、存在しない場合はFalseを返す。よく使うメソッドなので覚えておくとよいだろう。また同じ種類のメソッドとして、ドライブの存在を確認するDriveExistsメソッド、フォルダの存在を確認するFolderExistsメソッドがある。
ここで問題を1つ出そう。スクリプトが存在するフォルダにランダムな名前のファイルを作成することを想定し、そのフルパスを取得するところまでをコード化してもらいたい。
マーカーで隠れたところを選択してチェックしてみよう。
Option Explicit
Dim objFSO
Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")
Dim strTempFilePath, strParentFolderPath
'スクリプトのあるフォルダの親フォルダのパスを取得
strParentFolderPath = objFSO.GetParentFolderName(WScript.ScriptFullName)
'ランダムな名前のファイルのフルパスを取得
strTempFilePath = objFSO.BuildPath(strParentFolderPath, objFSO.GetTempName())
MsgBox strTempFilePath
Set objFSO = Nothing
スクリプトの置かれている場所にあるファイルやフォルダを扱うことは多いので、この例は丸ごと覚えておくとよいだろう。
Copyright© Digital Advantage Corp. All Rights Reserved.