連載
» 2008年04月09日 00時00分 公開

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

FileSystemObjectはファイル操作のための基本オブジェクトだ。WSHでファイルやフォルダをコピーしたり、移動、削除する方法について解説する。

[牟田口大介(Microsoft MVP Data Center Management - Admin Frameworks),著]
基礎解説 演習方式で身につけるチェック式WSH超入門
Windows Server Insider


「基礎解説 演習方式で身につけるチェック式WSH超入門」のインデックス

連載目次

 前回までは、WSHのオブジェクト(WScriptオブジェクト、WshShellオブジェクト、WshNetworkオブジェクト)について解説してきた。

 今回からは、主にファイル操作を行うためのオブジェクトであるFileSystemObjectオブジェクトと、そこから呼び出し可能な各オブジェクトについて解説していく(これらのオブジェクトは、WSH 5.6が含まれるWindows Script 5.6のパッケージに含まれている)。

FileSystemObjectオブジェクトとは

 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オブジェクトのメンバ

 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のファイル情報を得るスクリプトである。このスクリプトを実行すると、例えば次のように表示される。

GetFileInfo.vbsの実行例
FileSystemObjectオブジェクト直下のメソッドで取得できる情報には、このようなものがある。

 なお注意すべきなのは、これらのメソッドはすべて、ファイルが実際に存在してもしなくても実行可能である点だ。これらのメソッドはただ単に引数に渡された文字列を解析して、ドライブ名や拡張子などを返すだけである。試しにこのスクリプトの

strFileName = objWshShell.ExpandEnvironmentStrings("%comspec%")

の部分を、

strFileName = objFSO.BuildPath("C:\kyonko",objFSO.GetTempName())

としてもらいたい。GetTempNameメソッドは拡張子が「〜.tmp」になるランダムなファイル名を文字列として返すメソッドである。またBuildPathメソッドは、引数に与えられた2つのパスに対し、適切なパス区切り文字“\”を補うか、あるいは(余分なら)削除して連結し、正しいパスにするメソッドである(*)。実行してみよう。

objFSO.GetTempName()を使った場合の実行例
ファイル自体が存在しなくても、Get系のメソッドでファイル情報が取得できる。

 このように、ファイル自体が存在しなくても、パスの形式を取った文字列ならば、ドライブ名や親フォルダ名などが返される。またファイルだけではなく、フォルダの場合も同様に取得可能である。

*フォルダ名とファイル名の連結

 フォルダ名(例えば“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つ出そう。スクリプトが存在するフォルダにランダムな名前のファイルを作成することを想定し、そのフルパスを取得するところまでをコード化してもらいたい。

CHECK!

マーカーで隠れたところを選択してチェックしてみよう。


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

 スクリプトの置かれている場所にあるファイルやフォルダを扱うことは多いので、この例は丸ごと覚えておくとよいだろう。


       1|2 次のページへ

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

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

メールマガジン登録

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