第17回 FileSystemObjectオブジェクトを利用する(2):基礎解説 演習方式で身につけるチェック式WSH超入門(5/5 ページ)
ファイル/フォルダのプロパティの参照や属性の設定、オブジェクトとコレクションを利用したきめ細かいファイル操作の手法などについて解説する。
ファイルをコピーするCopyメソッド
続いてファイル/フォルダ操作のメソッドを呼び出す例を取り上げよう。FileSystemObjectオブジェクト直下のメソッド(CopyFilleメソッドなど)でも、ファイル/フォルダの操作(移動、コピー、削除)は可能だったが、FileオブジェクトやFolderオブジェクトのインスタンスのメソッド(Copyメソッドなど)を使うことでも可能である。
どちらを使うかは状況によるが、対象とするFileオブジェクトがすでにある場合は(Filesコレクションの要素として取り出した場合などは)Fileオブジェクトのメソッドを、そうでない場合は(あるいはワイルドカードを使いたい場合)、Fileオブジェクトのインスタンスを作成する必要のないFileSystemObjectオブジェクト直下のメソッドを呼び出すのが効率的だろう。ただしここではまだFilesコレクションについて説明していないので、インスタンスをGetFileメソッドで作成してからCopyメソッドなどを呼び出す例を取り上げる。前回と同様に、これらのメソッドはほとんど同じ呼び出し方なので、スクリプトを1つ取り上げ、あとは一部を改変して説明する。
※ファイル:CopyFile.vbs
Option Explicit
Dim objFSO, objFile, strArgument, strDestination
Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")
If WScript.Arguments.Count > 0 Then 'コマンドライン引数が存在すれば
strArgument = WScript.Arguments(0) '1つ目の引数を取る
'もし引数がファイルなら
If objFSO.FileExists(strArgument) Then
On Error Resume Next
'Fileオブジェクト取得
Set objFile = objFSO.GetFile(strArgument)
strDestination = InputBox( _
"ファイルのコピー先パスを入力してください。" & vbCrLf & _
"現在のファイル・パスは " & vbCrLf & _
objFile.Path & vbCrLf & _
"です。", , objFile.Path)
If strDestination <> "" Then
objFile.Copy strDestination 'ファイルのコピー
If Err.Number <> 0 Then
MsgBox Err.Number & ": " & Err.Description, vbCritical
End If
On Error Goto 0
End If
End If
End If
Set objFile = Nothing
Set objFSO = Nothing
このスクリプト・ファイルに任意のファイルをドロップするか、コマンドライン引数を付けてコマンド・プロンプトなどから「CopyFile.vbs filename.txt」のように実行すると、コピー先のファイル・パスかフォルダ・パスを指定するダイアログが表示される。
[OK]をクリックすると実際にファイルがコピーされる。指定するパスは相対パスでも絶対パスでもよいし、ファイル・パスでもフォルダ・パスでもよい(後者の場合、「\」を末端に付ける必要がある。これはCopyFileメソッドと同じである。またこの場合、ファイル名は元のファイル名のままになる)。Copyメソッドはこのように、Fileオブジェクトの示すファイルを第1引数のパスにコピーするものである。また省略可能なブール値を取る第2引数もあり、Falseを指定すると既存ファイルを上書きしようとするとエラーが発生する。省略時はTrueで、既存ファイルを上書きする。CopyメソッドはFolderオブジェクトにも存在し、使い方は同じである。FileExistsメソッドとGetFileメソッドを使っている部分を、FolderExistsメソッドとGetFolderメソッドに変更すればよい。
ファイルを移動するMoveメソッド
また、同じような使い方をするMoveメソッドもある。これは文字どおりファイルを移動するものである。
objFile.Copy strDestination 'ファイルのコピー
を、
objFile.jMove strDestination 'ファイルの移動
と変更するとよい。
ただしMoveメソッドには第2引数が存在せず、常に既存ファイルを上書きするので注意が必要である。既存ファイルを上書きしたくない場合は、新しいパス文字列を作り、FileExistsメソッドの引数に渡して条件判別する必要がある。
なお、Moveメソッドは、Folderオブジェクトにもある。
さて、ファイルを削除するDeleteメソッドだが、これは移動先やコピー先を指定する必要はないので、単に削除するか否かの確認ダイアログを表示させるだけに変えてみよう。これを例題としたい。まだ説明していないメソッドだが、引数が省略可能、ということで考えてみてほしい。
マーカーで隠れたところを選択してチェックしてみよう。
※ファイル:DeleteFile.vbs
Option Explicit
Dim objFSO, objFile, strArgument, intYesNo
Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")
If WScript.Arguments.Count > 0 Then 'コマンドライン引数が存在すれば
strArgument = WScript.Arguments(0) '1つ目の引数を取る
'もし引数がファイルなら
If objFSO.FileExists(strArgument) Then
On Error Resume Next
'Fileオブジェクト取得
Set objFile = objFSO.GetFile(strArgument)
intYesNo = MsgBox( _
objFile.Path & vbCrLf & _
"を削除しますか?",vbYesNo + vbQuestion)
If intYesNo = vbYes Then
objFile.Delete 'ファイルの削除
If Err.Number <> 0 Then
MsgBox Err.Number & ": " & Err.Description, vbCritical
End If
On Error Goto 0
End If
End If
End If
Set objFile = Nothing
Set objFSO = Nothing
このスクリプト・ファイルの使い方はCopyFile.vbsと基本的に同じだが、パスを入力する代わりに以下のように削除確認ダイアログが表示される。
ここで[はい]をクリックすると、ファイルが削除される。実際はDeleteメソッドを呼び出しているだけである。Deleteメソッドには省略可能な1つのブール値の引数があり、Trueを指定すると読み取り専用ファイルも削除される(デフォルトはFalseで、削除しようとするとエラーが発生する)。
FolderオブジェクトにもDeleteメソッドが存在し、これを利用するとフォルダごと削除する。中にファイルやサブフォルダがあるかどうかは無関係に削除されるうえ、ごみ箱にも入らないので注意が必要である。
今回はFileSystemObjectオブジェクトのオブジェクト・モデルを概観し、FileオブジェクトとFolderオブジェクトの使い方について述べた。次回はDriveオブジェクトやそのほかのコレクションを用いたファイル処理について解説する。
Copyright© Digital Advantage Corp. All Rights Reserved.