VBScriptを掌握せよ:読み取り専用ファイルの「安全な解錠」と「原状復旧」の極意
こんにちは。現場で泥臭い自動化を積み重ね、VBScriptの深淵を覗いてきたエンジニアです。
自動化の現場でよくある「アクセスが拒否されました(Permission Denied)」というエラー。これに遭遇したとき、多くの初心者は「権限がない」と諦めてしまいます。しかし、その正体の多くは、ファイルに刻まれた「読み取り専用(ReadOnly)」という名の枷に過ぎません。
今回は、この枷をスマートに外し、処理が終われば何食わぬ顔で元に戻す。「プロの自動化」に不可欠な属性操作のイロハを伝授します。ここをマスターすれば、あなたのスクリプトは一気に「実戦レベル」へ格上げされますよ。
—
1. なぜ「読み取り専用」でスクリプトは止まるのか?
VBScriptでファイルを操作する際、最強の相棒となるのが `FileSystemObject (FSO)` です。しかし、FSOは非常に素直なオブジェクト。ファイルが「読み取り専用」とマークされていると、書き込み命令に対して即座に背を向けます。
これを解決するには、以下の3ステップを「不可分(アトミック)」に行うのが鉄則です。
1. 現状の属性を記憶する(何が設定されていたか忘れない)
2. 読み取り専用フラグを解除する(解錠)
3. 処理を実行し、元の属性を書き戻す(施錠)
—
2. 実践コード:属性を操るプロの作法
まずは、現場ですぐに使えるテンプレートを見てみましょう。
Option Explicit
‘ FSOオブジェクトの生成
Dim fso, filePath, fileObj
Set fso = CreateObject(“Scripting.FileSystemObject”)
filePath = “C:\Work\Data.txt”
‘ ファイルが存在するか確認
If fso.FileExists(filePath) Then
Set fileObj = fso.GetFile(filePath)
‘ 1. 現在の属性を退避しておく
Dim originalAttributes
originalAttributes = fileObj.Attributes
‘ 2. 読み取り専用(1)を解除する
‘ Attributesはビットフラグ。論理演算(AND NOT)で特定のビットだけ落とすのが定石
If (fileObj.Attributes And 1) = 1 Then
fileObj.Attributes = fileObj.Attributes – 1
End If
‘ — ここでファイル書き込み処理を行う —
‘ 例:追記処理
Dim ts
Set ts = fso.OpenTextFile(filePath, 8, True)
ts.WriteLine “自動化による追記完了: ” & Now
ts.Close
‘ —————————————
‘ 3. 元の属性を復元する
fileObj.Attributes = originalAttributes
WScript.Echo “処理完了:属性を元に戻しました。”
Else
WScript.Echo “ファイルが見つかりません。”
End If
Set fileObj = Nothing
Set fso = Nothing
—
3. ここがエンジニアのこだわりポイント
ビット演算の魔術
なぜ `fileObj.Attributes – 1` なのか?
`Attributes` プロパティは、複数の属性(読み取り専用、隠しファイル、システム等)を「合計値」で保持しています。読み取り専用を表すフラグは「1」です。もしファイルが「読み取り専用(1) かつ 隠しファイル(2)」だった場合、合計は「3」です。
ここからシンプルに「1を引く」だけで、他の属性を壊さずに「読み取り専用」だけを解除できるのです。
なぜ「処理後」に戻すのか?
「読み取り専用」はOSや管理者が意図して設定した「安全装置」です。自動化スクリプトが勝手にその設定を解除したまま放置するのは、セキュリティ上のリスクになります。「来たときよりも美しく」。これが自動化エンジニアのプロトコルです。
—
4. 初学者が陥りやすい落とし穴
- 「ファイルが開かれている」ケース:
属性を解除しても、他のプログラム(Excelやメモ帳など)がそのファイルを開いていると、書き込み時にまた怒られます。`On Error Resume Next` でエラーをハンドリングし、ファイルがロック中ならリトライする仕組みを後に加えるのが次なるステップです。
- パスの指定ミス:
`fso.GetFile` を呼ぶ前に、パスが正しいか `fso.FileExists` で必ず確認してください。存在しないファイルに属性を求めると、スクリプトは即座にクラッシュします。
—
最後に:自動化の先へ
今回学んだのは「属性の操作」という小さな技術ですが、これは「OSのリソースをプログラムから自在に制御する」という大きな第一歩です。
「エラーが出たから手動で直す」という作業を減らすことこそが、自動化エンジニアの真の価値です。このスクリプトをあなたのツールボックスに加えれば、もう「アクセス拒否」の警告に怯える必要はありません。
もし分からないことがあれば、またいつでも聞きに来てください。あなたのコードが、より堅牢で美しいものになることを応援しています!
