第17回 FileSystemObjectオブジェクトを利用する(2):基礎解説 演習方式で身につけるチェック式WSH超入門(4/5 ページ)
ファイル/フォルダのプロパティの参照や属性の設定、オブジェクトとコレクションを利用したきめ細かいファイル操作の手法などについて解説する。
名前を変更するNameプロパティ
次は逆に、プロパティを設定する方法について述べる。プロパティは設定可能なものと不可能なものがあるが(前出の表参照)、ほとんどは設定不可能である。具体的にはNameプロパティとAttributesプロパティだけが設定可能である。よってここではNameプロパティを設定するスクリプトを考え、例題としたい。
マーカーで隠れたところを選択してチェックしてみよう。
※ファイル:RenameFile.vbs
Option Explicit
Dim objFSO
Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")
Dim strArgument
Dim objFile
Dim strNewFileName
If WScript.Arguments.Count > 0 Then 'コマンドライン引数が存在すれば
strArgument = WScript.Arguments(0) '一つ目の引数を取る
'もし引数がファイルなら
If objFSO.FileExists(strArgument)Then
On Error Resume Next
'Fileオブジェクト取得
Set objFile = objFSO.GetFile(strArgument)
strNewFileName = InputBox( _
"新しいファイル名を入力してください。" & vbCrLf & _
"現在のファイル名は " & vbCrLf & _
objFile.Name & vbCrLf & _
"です。", , objFile.Name
If strNewFileName <> "" Then
If strNewFileName <> objFile.Name Then
'もし現在の名前と違う名前が指定されたら、指定された名前に変える
objFile.Name = strNewFileName
Else
MsgBox "ファイル名が同じです。" ,vbCritical
End If
Select Case Err.Number
Case 0 'エラーがなければ何もしない
Case 70
MsgBox "書き込みできませんでした。" ,vbCritical
Case 58
MsgBox "すでに同名のファイルが存在しています。" ,vbCritical
Case 52
MsgBox "次の文字はファイル名に使用できません。" & vbCrLf & _
"\ / : , ; * ? "" < > |", vbCritical
Case Else
MsgBox Err.Number & ": " & Err.Description, vbCritical
End Select
End If
On Error Goto 0
Else
MsgBox "ファイルのパスを指定してください。", vbExclamation
End If
End If
Set objFile = Nothing
Set objFSO = Nothing
このスクリプトを実行すると、ファイル名を変更するためのダイアログが表示され、新しいファイル名を入力するとそのファイル名に変更される。空白を指定した場合やキャンセルした場合は何もしない。エラーが発生するとエラーメッセージを表示する。
このサンプルでは、ファイル名を変更するだけの処理なのに、少し過剰なまでにエラー処理をしてみたが、ここまで神経質になることはないかもしれない。必要に応じてエラー処理は簡略化してもよいだろう。ここではエラー番号によって場合分けする例を示した。鍵となるのは隠している部分である。GetFileメソッドでFileオブジェクトを取得し、Nameプロパティを参照、そして設定している。
属性を変更するAttributesプロパティ
ここでは部分的にしか取り上げないが、Attributesプロパティも設定可能である。前出のスクリプト中の定数の値の合計を指定すれば、その属性ビットがセットされる(定数の宣言は忘れないように!)。
objFile.Attributes = ReadOnly + Archive '読み取り専用とアーカイブ属性にする
属性を外すには引き算をする。
If (objFile.Attributes And ReadOnly) = ReadOnly Then
objFile.Attributes = objFile.Attributes - ReadOnly '読み取り専用属性を外す
End If
もしくは次のようなビット演算でも可能である。
objFile.Attributes = objFile.Attributes And Not ReadOnly '読み取り専用属性を外す
属性を加えるにはOr演算をする
objFile.Attributes = (objFile.Attributes Or ReadOnly) '読み取り専用属性を付ける
複数の属性を付けたり外したりする場合は、これらの行を複数回呼び出せばよい。だがAttributesプロパティの値が属性値に対応する2進数によるビットの組み合わせで成り立っていることを理解していれば、ビット演算子を駆使して簡単に1行で記述することもできる。本連載では詳しく取り上げないが、興味のある方は「ビット演算」をキーワードに学習を進められたい。ここで取り上げた式の意味も理解できるようになるだろう。
Copyright© Digital Advantage Corp. All Rights Reserved.