連載
» 2009年06月03日 00時00分 公開

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

[牟田口大介(Microsoft MVP Data Center Management - PowerShell),著]
前のページへ 1|2       

 さて、これまでにフォルダとフォルダのセットを表す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

 このスクリプトを実行すると、例えば次のようなダイアログが表示される。

showDriveInfo.vbsの実行例
このように、C:ドライブの各種プロパティが表示される。

 このように、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コレクション

 Drivesコレクションはシステムに含まれるすべてのDriveオブジェクトのコレクションである。このコレクションを取得するにはFileSystemObjectオブジェクトのDrivesプロパティを用いる。Drivesコレクションの使い方はこれまで登場したコレクションとほぼ同じだ。なので、ここではいきなり例題を出し、それを解説するというスタイルにする。例題は、システムに接続されているすべてのHDDを列挙し、その容量、空き容量、使用量、使用率を求めるというものである。先ほどのスクリプトも参考にしつつ問題を解いてもらいたい。

CHECK!

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


※ファイル: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台接続されている環境で実行すると次のようになる。

showDrivesInfoの実行例
このようにシステムに接続されている全HDDの情報が列挙される。
注:ダイアログ表示の関係上、ModifySize関数が返す文字列は小数点以下を表示しないようにしている。

 このスクリプトのポイントとなるのは、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オブジェクトの使い方を述べる。


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

基礎解説 演習方式で身につけるチェック式WSH超入門

前のページへ 1|2       

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

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

メールマガジン登録

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