さて、これまでにフォルダとフォルダのセットを表すFolderオブジェクト/Foldersコレクション、ファイルとファイルのセットを表すFileオブジェクト/Filesコレクションを見てきたが、それらに対応する形でドライブを表すDriveオブジェクト/Drivesコレクションも存在する。
まずDriveオブジェクトだが、Fileオブジェクト/Folderオブジェクトとはメンバの様相がまったく異なる。ここで別項目として取り上げた理由もそれである。まずはメンバを見てもらいたい。
メンバ(プロパティ) | 用途 |
---|---|
DriveLetterプロパティ | ドライブ・レター(アルファベット1文字) |
DriveTypeプロパティ | ドライブの種類(HDD、CD-ROM、RAM、Removable、Network) |
FileSystemプロパティ | ファイル・システム(FAT、FAT32、NTFS、CDFSなど) |
IsReadyプロパティ | ドライブが準備できていたらTrueを返す |
VolumeNameプロパティ | ボリューム・ラベル(値の設定可) |
ShareNameプロパティ | ネットワークでの共有名(UNCパス) |
SerialNumberプロパティ | シリアル・ナンバー |
AvailableSpaceプロパティ | 空きディスク領域のうち使用可能な領域(bytes) |
FreeSpaceプロパティ | 空きディスク領域(bytes) |
TotalSizeプロパティ | ドライブの容量(bytes) |
RootFolderプロパティ | ドライブのルート・フォルダのFolderオブジェクトを返す |
Pathプロパティ | ドライブのパスを返す |
Driveオブジェクトのメンバ |
このように、Driveオブジェクトにはドライブの情報を表すプロパティが存在する。この中でVolumeNameプロパティだけは、値の設定も可能である(つまりスクリプトでボリューム・ラベルを変更できる)。メソッドは存在しない。DriveオブジェクトはFileSystemObjectオブジェクトのGetDriveメソッドを用いて取得するか、後述するDrivesコレクションの一要素として取り出すことで使用可能となる。GetDriveメソッドを用いる場合は、FileSystemObjectオブジェクトのDriveExistsメソッドを用いてドライブが存在するかどうかを前もって調べる必要がある。
以上を踏まえて、C:ドライブの情報を表示するスクリプトを例示する(システムにC:ドライブがない場合などは適宜ほかのドライブに変更のこと)。
※ファイル:showDriveInfo.vbs
Option Explicit
Dim objFSO
Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")
'Driveオブジェクトとドライブ名を格納する変数宣言
Dim objDrive, strDrive
strDrive = "C:" 'ドライブ名(適宜変更のこと)
'ドライブが存在するかどうかチェックし、存在する場合のみ処理を行う
If objFSO.DriveExists(strDrive) Then
'Driveオブジェクトの取得と変数への格納
Set objDrive = objFSO.GetDrive(strDrive)
'Driveオブジェクトのプロパティを格納する変数宣言
Dim strDriveTypeName, strSerialNumber, strSerialHexNumber ,strFileSystem, strVolumeName, strUsedSize, strAvailableSize, strTotalSize, strIsReadyMessage
'DriveTypeプロパティを参照し、ドライブの種類を文字列化する
Select Case objDrive.DriveType
Case 0 strDriveTypeName = "不明"
Case 1 strDriveTypeName = "リムーバブルドライブ"
Case 2 strDriveTypeName = "ハードディスク"
Case 3 strDriveTypeName = "ネットワークドライブ"
Case 4 strDriveTypeName = "CD-ROM"
Case 5 strDriveTypeName = "RAMドライブ"
End Select
'IsReadyプロパティがTrueかFalseかで条件分岐する
If objDrive.IsReady Then
strIsReadyMessage = "(このドライブは準備ができています)"
strSerialNumber = objDrive.SerialNumber
strSerialHexNumber = Hex(CLng(strSerialNumber))
strFileSystem = objDrive.FileSystem
strVolumeName = objDrive.VolumeName
strAvailableSize = ModifySize(objDrive.FreeSpace)
strTotalSize = ModifySize(objDrive.TotalSize)
strUsedSize = ModifySize(objDrive.TotalSize - objDrive.FreeSpace)
Else
strIsReadyMessage = "(このドライブは準備ができていません)"
strSerialNumber = ""
strSerialHexNumber = ""
strFileSystem = ""
strVolumeName = ""
strAvailableSize = ""
strTotalSize = ""
strUsedSize = ""
End If
MsgBox "ドライブ " & objDrive.DriveLetter & vbCrLf & vbCrLf & _
"ボリュームラベル : " & strVolumeName & vbCrLf & _
"種類 : " & strDriveTypeName & vbCrLf & _
"ファイルシステム : " & strFileSystem & vbCrLf & _
"シリアルNO : " & strSerialNumber & " (" & strSerialHexNumber & ")" & vbCrLf & _
"パス : " & objDrive.Path & vbCrLf & _
"共有名 : " & objDrive.ShareName & vbCrLf & _
"使用領域 : " & strUsedSize & vbCrLf & _
"空き領域 : " & strAvailableSize & vbCrLf & _
"容量 : " & strTotalSize & vbCrLf & _
strIsReadyMessage
End If
Function ModifySize(numSize)
If numSize >= 1073741824 Then
ModifySize = FormatNumber(numSize / 1073741824, 2) & "GB"
ElseIf numSize >= 1048576 Then
ModifySize = FormatNumber(numSize / 1048576, 2) & "MB"
ElseIf numSize >= 1024 Then
ModifySize = FormatNumber(numSize / 1024, 2) & "KB"
Else
ModifySize = FormatNumber(numSize, 0) & "バイト"
End If
End Function
このスクリプトを実行すると、例えば次のようなダイアログが表示される。
このように、Driveオブジェクトの各プロパティの値を参照して、C:ドライブの情報を得ることができた。
このスクリプトは、先ほども述べたようにまずDriveExistsメソッドでドライブの存在を確認した後、GetDriveメソッドでDriveオブジェクトを取得し、プロパティを参照している。ただし、Driveオブジェクトのプロパティから実際のドライブ情報を得るにはいくつかのポイントがある。
まず、ドライブの種類を表すプロパティはDriveオブジェクトのDriveTypeプロパティであるが、これは種類名を文字列で返すのではなく、種類を表すLong型の数値を返す(数値と種類の対応についてはヘルプを参考のこと)。対象となるドライブがHDDなら以下の処理を実行する……、などの使用には向いているが、未知のドライブから種類名を取り出すには、ソース中にあるように、DriveTypeプロパティが返す数値を基に、文字列を割り当てる必要がある。
次に、IsReadyプロパティの値がTrueかFalseかによって条件分けを行う必要がある。IsReadyプロパティはドライブが使用可能か否かを表すプロパティだ。IsReadyプロパティがFalse、すなわちドライブが使用可能でない場合(例えばCD-ROMドライブにメディアが挿入されていないときなど)、いくつかのプロパティを参照しようとするとエラーになる。そこで、エラーが発生する恐れのあるプロパティだけはここで条件分岐して参照できる場合のみ参照するようにする。
また、ディスク容量を表すTotalSizeプロパティおよび空き容量を表すFreeSpaceプロパティは存在するが、ディスク使用量を表すプロパティは存在しない。だが、少し考えれば分かるが、ディスク容量(TotalSizeプロパティ)から空き容量(FreeSpaceプロパティ)を引けばディスク使用量が求められる。
SerialNumberプロパティはドライブのシリアル番号を返すのだが、この値をHex関数に渡すことで16進表記のシリアル番号を取得することができるのもポイントだ。
ところで、TotalSizeプロパティとFreeSpaceプロパティはbytes数を数値型で返す(型は容量によって変化する)。空き容量が何bytes以下なら……する、のようなソースを書く場合は便利だが、実際の容量を目で確認したい場合はKB、MB、GBなどの表記を用いた方がよい場合もある。そこでModifySizeというヘルパ関数を用意した。この関数にバイト数を引数として与えると、容量に応じて「バイト」「KB」「MB」「GB」の表記を行う。この関数については本題とは外れるので詳説しないが、bytes数を1024倍するとKB→MB→GBと変化していくことを理解していれば難しくはない。
ちなみに、ディスク・クォータ(ディスクの使用量をユーザーごとに制限する機能)が設定されている場合は、AvailableSpaceプロパティで使用可能な容量が分かる。ディスク・クォータが設定されていない場合はAvailableSpaceとFreeSpaceは同じ値を返す。
Drivesコレクションはシステムに含まれるすべてのDriveオブジェクトのコレクションである。このコレクションを取得するにはFileSystemObjectオブジェクトのDrivesプロパティを用いる。Drivesコレクションの使い方はこれまで登場したコレクションとほぼ同じだ。なので、ここではいきなり例題を出し、それを解説するというスタイルにする。例題は、システムに接続されているすべてのHDDを列挙し、その容量、空き容量、使用量、使用率を求めるというものである。先ほどのスクリプトも参考にしつつ問題を解いてもらいたい。
マーカーで隠れたところを選択してチェックしてみよう。
※ファイル:showDrivesInfo.vbs
Option Explicit
Dim objFSO
Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")
'Drivesコレクションを取得
Dim objDrives, objDrive
Set objDrives = objFSO.Drives
Dim strMessage
strMessage = ""
'各Driveオブジェクトのプロパティを格納する変数宣言
Dim numFreeSpace, numTotalSize, numUsedSize, numRatio, strDriveLetter
'Drivesコレクションに含まれる各Driveオブジェクトを列挙
For Each objDrive In objDrives
'ドライブの種類がハードディスクなら
If objDrive.DriveType = 2 Then
'ドライブの準備ができていれば
If objDrive.IsReady Then
'ドライブレターを取得する
strDriveLetter = objDrive.DriveLetter
'空き容量を取得する
numFreeSpace = objDrive.FreeSpace
'総容量を取得する
numTotalSize = objDrive.TotalSize
'使用量を計算する
numUsedSize = numTotalSize - numFreeSpace
'ディスク使用率を計算する(パーセンテージ)
numRatio = numUsedSize / numTotalSize * 100
'ドライブが準備できていなければすべて0にする
Else
numFreeSpace = 0
numTotalSize = 0
numUsedSize = 0
numRatio = 0
End If
'各プロパティ情報を文字列変数に追記
strMessage = strMessage & _
strDriveLetter & vbTab & _
ModifySize(numTotalSize) & vbTab & _
ModifySize(numFreeSpace) & vbTab & _
ModifySize(numUsedSize) & vbTab & _
FormatNumber(numRatio, 0) & " %" & vbCrLf
End If
Next
MsgBox "システムに接続されている全HDDの情報" & vbCrLf & _
"ドライブ" & vbTab & _
"総容量" & vbTab & _
"空き容量" & vbTab & _
"使用量" & vbTab & _
"使用率" & vbTab & _
vbCrLf & strMessage
Function ModifySize(numSize)
If numSize >= 1073741824 Then
ModifySize = FormatNumber(numSize / 1073741824, 0) & "GB"
ElseIf numSize >= 1048576 Then
ModifySize = FormatNumber(numSize / 1048576, 0) & "MB"
ElseIf numSize >= 1024 Then
ModifySize = FormatNumber(numSize / 1024, 0) & "KB"
Else
ModifySize = FormatNumber(numSize, 0) & "バイト"
End If
End Function
以上のスクリプトを、例えばHDDが2台接続されている環境で実行すると次のようになる。
このスクリプトのポイントとなるのは、FileSystemObjectオブジェクトのDrivesプロパティがシステムに含まれる全ドライブを表すDriveオブジェクトのコレクション、Drivesコレクションを返すことである。よって、それぞれのDriveオブジェクトを取得するにはFor〜Each〜Nextステートメントを用いればよい。ループ内ではDriveオブジェクトが参照できるので、あとは普通にプロパティを参照するだけである。使用率は「使用量÷総容量×100」で求められる。
さて、ここまででファイル、フォルダ、ドライブを扱うオブジェクトについて詳説してきたが、最後にこれらのコレクションのメンバについて軽く触れよう。メンバは次の表を参考にしてもらいたい。
メンバ | 用途 |
---|---|
Count プロパティ | 要素に含まれるオブジェクトの数を返す。例えばFilesコレクションなら、含まれるFileオブジェクトの数 |
Item プロパティ | 要素に含まれるオブジェクトを返す。引数にはファイル名/フォルダ名/ドライブ名を指定可 |
Add メソッド | 新しいFolderオブジェクトを作成し、それを含んだ Foldersコレクションを新たに返す(Foldersコレクションのみ) |
Filesコレクション/Foldersコレクション/Drivesコレクションのメンバ |
この中でよく使われるのはCountプロパティであろう。あるフォルダに含まれるファイルの総数を求めたりするときに使われる。その場合、<Filesコレクション>.Countのようにして値を参照する。
今回まででFileSystemObjectを用いてファイル・システムの操作および情報の参照を行う方法について解説した。次回はFileSystemObjectを用いてテキスト・ファイルを読み書きする方法と、FileSystemObjectと同じScriptingライブラリに含まれるDictionaryオブジェクトの使い方を述べる。
Copyright© Digital Advantage Corp. All Rights Reserved.