連載
» 2005年10月13日 00時00分 公開

Windows管理者のためのWindows Script Host入門:第10回 WSHスクリプトからのファイル操作(1) (2/3)

[海津 智宏,著]

 次に、ファイルの読み書きではなく、ファイルそのものを扱う方法について説明する。FSOオブジェクトを使うことで、ファイルをコピーしたり、移動したり、削除したりすることができる。これらの処理には、FSOオブジェクトを直接利用する方法と、Fileオブジェクトを作成して利用する方法の2通りがある。これらのうち、まずはFSOオブジェクトを直接利用する方法から見ていこう。以下はFSOオブジェクトのメソッドのうち、ファイルに関係するものの一覧である。

メソッド 機能
CopyFileメソッド ファイルをコピーする
MoveFileメソッド ファイルを移動する
DeleteFileメソッド ファイルを削除する
FileExistsメソッド ファイルが存在するかどうかを調べる
GetFileVersionメソッド ファイルのバージョン情報を取得する
OpenTextFileメソッド ファイルを開き、TextStreamオブジェクトを返す
CreateTextFileメソッド ファイルを作成し、TextStreamオブジェクトを返す
GetTempNameメソッド 一時ファイル用のランダムな名前を取得する
GetFileメソッド Fileオブジェクトを返す

ファイルのコピー

 ファイルのコピーにはCopyFileメソッドを用いる。CopyFileメソッドにコピー元のファイル名とコピー先のファイル名を渡すことで、ファイルをコピーすることができる。通常は、コピー先にすでにファイルがある場合はファイルを上書きするが、第3パラメータにFalseを指定すれば、ファイルを上書きせずにエラーを発生するようになる。

objFSO.CopyFile source , destination [, overwrite]

 コピー先には、ファイル名ではなく、フォルダ名を指定することもできる。フォルダを指定する場合は、第2引数のコピー先文字列を「\」記号で終わるようにする。コピー先にフォルダを指定した場合、コピー元と同じファイル名のまま、指定したフォルダの中にファイルがコピーされる。

 コピー元ファイル名にはワイルドカードを指定することもできる。「*」記号は任意の文字列を、「?」記号は任意の1文字を表す。例えば、「*.txt」はすべてのテキスト・ファイルを、「a???.txt」はaから始まり4文字の名前を持つテキスト・ファイルを表す。ただしワイルドカードを指定できるのはファイル名の部分のみで、パス部分には指定できない。ワイルドカードを指定した場合には、複数のファイルがコピーされる可能性があるので、コピー先はファイル名ではなくフォルダ名であると認識される。ワイルドカードで指定したコピー元ファイル名に一致するファイルがなかった場合には、エラーが発生する。

ファイルの移動

 ファイルの移動にはMoveFileメソッドを用いる。MoveFileメソッドにはファイル名と移動先を渡す。

objFSO.MoveFile source , destination

 CopyFileメソッドと同じように、移動先にはファイル名ではなくフォルダ名を指定することができる。また、移動するファイルをワイルドカードで指定することも可能だ。移動先にすでにファイルがあった場合、CopyFileメソッドとは異なり、常にエラーが発生する。エラーを発生させずに、既存ファイルを上書きするには、あらかじめ移動先のファイルを削除しておくか、移動ではなくコピーした後で元のファイルを削除するようにする。

 ファイル名を変更したい場合にもMoveFileメソッドが利用できる。具体的には、移動先として、元と同じフォルダ内の新しいファイル名を指定することでファイル名を変更できる。

ファイルの削除

 ファイルの削除にはDeleteFileメソッドを用いる。DeleteFileメソッドにはファイル名を渡す。DeleteFileメソッドでは、通常は読み取り専用属性を持つファイルは削除しないが、第2パラメータにTrueを指定すると、読み取り専用属性を持つファイルも削除する。

objFSO.DeleteFile filespec [, force]

 DeleteFileメソッドでもワイルドカードが利用できる。ただし、削除するファイルが1つもなければエラーとなる。またDeleteFileメソッドで削除したファイルはごみ箱に移動されるわけではなく、直接削除されるので、重要なファイルを誤って削除してしまわないように注意が必要である。

ファイルが存在するかどうかを調べる

 FileExistsメソッドは、ファイルが存在する場合にTrueを、存在しない場合にFalseを返すメソッドである。これまでに述べたとおり、ファイルのコピーや移動、削除などは、ファイルが存在しなければエラーとなるので、ファイルの存在が確実でない場合は、先にFileExistsメソッドで確認してから処理するとよい。ただし、FileExistsメソッドではワイルドカードは使用できないので、ワイルドカードにマッチするファイルが存在するかどうかは確認できない。

 次の例では、test.txtというファイルが存在していれば削除する。

1: Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")
2: If objFSO.FileExists("test.txt") Then
3:   objFSO.DeleteFile "test.txt"
4: Else
5:   WScript.Echo "test.txtは存在しません。"
6: End If

ファイルのバージョンを取得する

 GetFileVersionメソッドは、実行ファイルのバージョン情報を取得する。バージョン情報のないファイルを指定すると空文字列が返される。次の例ではcscript.exeのバージョン情報を取得し、表示している。

Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")
WScript.Echo objFSO.GetFileVersion("C:\WINDOWS\system32\cscript.exe")

 実行すると次のように「5.6.0.8820」というバージョン番号が表示された。

D:\WSH>cscript getfileversion.vbs
5.6.0.8820

D:\WSH>

ファイルを作成する

 前述したとおり、OpenTextFileメソッドの第3パラメータにTrueを指定すれば、ファイルが存在しない場合に、自動的に新しいファイルを作成することができる。しかしファイルの作成用にCreateTextFileという独立したメソッドも用意されている。CreateTextFileメソッドを呼び出すとファイルが作成され、そのファイルが書き込みモードで開かれる。CreateTextFileメソッドの戻り値はTextStreamオブジェクトである。いくつかの細かい違いを除けば、CreateTextFileメソッドはOpenTextFileメソッドとほぼ同じ機能を持つ。

Set objStream = objFSO. CreateTextFile(filename [, overwrite] [, unicode])

 パラメータは以下のとおりである。

パラメータ デフォルト 意味
第1パラメータ(filename) 文字列 作成するファイルの名前。省略不可
第2パラメータ(overwrite) Boolean False ファイルが存在する場合、Trueならばファイルを上書きする。Falseならばエラーが発生する
第3パラメータ(unicode) Boolean False ASCIIファイルを作成するならばFalse、Unicode(UTF-16)ファイルを作成するならばTrueを指定する

 第1パラメータでファイル名を指定する。第2パラメータでは、ファイルが存在する場合に上書きするかどうかを指定する。省略した場合やFalseを指定した場合は、すでにファイルが存在すればエラーとなる。第3パラメータは文字コードを指定する。OpenTextFileでは整数値による指定だったが、CreateTextFileでは「システム・デフォルトを用いる」という選択肢がなくなり、通常の真偽値となっている。CreateTextFileで開いたファイルは常に書き込みモードとなるため、OpenTextFileにあったモード指定はなくなっている。OpenTextFileメソッドとCreateTextFileを比較すると以下のようになる。

相違点 OpenTextFile CreateTextFile
モードの種類 読み取り、書き込み、追加書き込み 書き込みのみ(追加書き込みはできない)
ファイルが存在する場合 モードにより上書きもしくは追加書き込み 第2パラメータで上書きするかエラーにするかを指定
ファイルが存在しない場合 第3パラメータでファイルを作成するかエラーにするかを指定 ファイルを作成
文字コード ASCII、Unicode、システム・デフォルト ASCII、Unicode

 一時的なファイルを作成する場合には、GetTempNameメソッドをCreateTextFileと組み合わせて利用すると便利である。GetTempNameメソッドは、一時ファイル用に拡張子「.tmp」のファイル名をランダムに生成して返す。

Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")
strTempName = objFSO.GetTempName
Set objOutput = objFSO.CreateTextFile(strTempName)
WScript.Echo strTempName & "を生成しました。"
objOutput.Close
objFSO.DeleteFile(strTempName)
WScript.Echo strTempName & "を削除しました。"

 実行すると次のようなファイル名が生成された。

D:\WSH>cscript temp.vbs
rad98B74.tmpを生成しました。
rad98B74.tmpを削除しました。

D:\WSH>

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

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

メールマガジン登録

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