【入門編】【ファイル属性制御】FileSystemObject の Attributes プロパティによる隠しファイル・読み取り専用属性の動的変更 – VBScript (Visual Basic Scripting Edition)解析バイブル

スポンサーリンク

こんにちは!VBScriptの世界へようこそ。
マクロの記録ボタンを押すだけの世界から一歩踏み出し、自分の手でWindowsを自在にコントロールしたいあなたへ。

今回は、業務自動化の現場で絶対に避けて通れない「ファイル属性の制御」についてお話しします。

「大切な設定ファイルを、うっかり上書きされて壊された!」
「処理中の一時ファイルがデスクトップにごちゃごちゃと散らかるのを何とかしたい!」

こんな現場の悲鳴をスマートに解決するのが、`FileSystemObject`(FSO)の `Attributes`(アトリビュート)プロパティ です。ここをクリアすれば、あなたも立派な自動化エンジニアの仲間入りですよ。さあ、一緒に本質を学んでいきましょう!

1. ファイル属性ってそもそも何?(基礎の要)

Windowsのファイルには、名前やサイズ以外に「状態」を示すメタデータ(属性)が持たされています。
VBScriptでよく扱う代表的な属性は以下の通りです。

  • 読み取り専用 (ReadOnly – 値: 1):ファイルの書き込みを禁止し、誤操作から守ります。
  • 隠しファイル (Hidden – 値: 2):通常のフォルダビューから姿を消し、ユーザーの目から隠します。
  • システムファイル (System – 値: 4):OSの動作に必要な重要ファイル(通常は触りません)。
  • アーカイブ (Archive – 値: 32):バックアップ対象であることを示すフラグ(ファイルが変更されると自動で立ちます)。

これらは単独で存在することもありますが、実務では「複数の属性が足し算(ビット演算)されて1つの数字」としてファイルに宿っています。ここがVBScript初学者が最初にハマるポイントですが、恐れることはありません。先輩が優しく紐解きます。

2. 魔法のプロパティ `Attributes` の正体

FSOを使ってファイルの属性を取得・変更するには、`File` オブジェクトの `Attributes` プロパティを使います。

属性を「調べる」のは簡単

Set fso = CreateObject(“Scripting.FileSystemObject”)
Set file = fso.GetFile(“C:\Work\settings.ini”)

‘ Attributesプロパティの中身を覗いてみる
MsgBox file.Attributes

このコードを実行すると、`32` とか `33` といった数字が出てきます。「えっ、設定した覚えのない数字だけど!?」と思いましたね?
冒頭で言った通り、これは属性の合算値です。

  • 「アーカイブ(32)」+「読み取り専用(1)」= `33` という具合に、Windowsは状態を足し算して管理しているのです。

3. 【実践】誤上書きを防ぐ!「読み取り専用」の動的付与と解除

現場で一番多い要望は、「処理が走っている最中は設定ファイルを保護(読み取り専用)し、更新プログラムが動く時だけ一時的に解除する」という動的な制御です。

以下のコードを見てください。そのままコピペして `control_attr.vbs` として保存すれば、すぐに実戦投入できます。

‘ =====================================================================
‘ スクリプト名: FileAttributeController.vbs
‘ 概要: ファイルの属性(読み取り専用・隠し)を安全に制御するサンプル
‘ =====================================================================

Option Explicit

Dim fso, targetPath, file
Set fso = CreateObject(“Scripting.FileSystemObject”)

‘ 対象ファイルのパス(デスクトップの config.ini を想定)
targetPath = CreateObject(“WScript.Shell”).SpecialFolders(“Desktop”) & “\config.ini”

‘ 【事前準備】テスト用のファイルが存在しない場合は作成する
If Not fso.FileExists(targetPath) Then
Dim ts
Set ts = fso.CreateTextFile(targetPath, True)
ts.WriteLine(“AppMode=Production”)
ts.Close
WScript.Echo “テスト用ファイルを作成しました。”
End If

‘ 対象のファイルオブジェクトを取得
Set file = fso.GetFile(targetPath)

‘ ———————————————————————
‘ 1. 「読み取り専用」属性を付与する(誤上書き防止)
‘ ———————————————————————
‘ 現在の属性に「読み取り専用 (1)」を安全に追加するビット演算
file.Attributes = file.Attributes Or 1
WScript.Echo “ファイルを【読み取り専用】に設定しました。”

‘ ———————————————————————
‘ 2. 「隠しファイル」属性も同時に付与してみる(一時ファイルの隠蔽)
‘ ———————————————————————
‘ 「隠しファイル (2)」を追加する
file.Attributes = file.Attributes Or 2
WScript.Echo “ファイルを【隠しファイル】かつ【読み取り専用】にしました。”

‘ 一度オブジェクトを解放して状態を確実にする
Set file = Nothing

‘ =====================================================================
‘ 3. 【安全な解除手順】元の状態に戻す
‘ =====================================================================
Set file = fso.GetFile(targetPath)

‘ 読み取り専用(1)と隠しファイル(2)のフラグだけを綺麗に「削ぎ落す」
‘ And と Not を組み合わせたビット演算のイディオムです
file.Attributes = file.Attributes And Not 1 ‘ 読み取り専用解除
file.Attributes = file.Attributes And Not 2 ‘ 隠しファイル解除

WScript.Echo “ファイルの保護をすべて解除し、通常の状態に戻しました。”

‘ クリーンアップ
Set file = Nothing
Set fso = Nothing

コードのキモ:ビット演算の魔法

ここが今回のハイライトです。複数の属性が混ざり合う `Attributes` を操作するときは、四則演算ではなくビット演算子を使います。

1. 属性をつける(ONにする): `file.Attributes Or 1`

  • 「現在の属性」と「読み取り専用(1)」を合体させます。すでに他の属性がついていても消えることはありません。

2. 属性を外す(OFFにする): `file.Attributes And Not 1`

  • ここがプログラミングの妙味。「1以外の状態はそのまま維持し、1のフラグだけを強制的に0にする」という、極めて安全な剥ぎ取り方です。単純に引き算(`- 1`)をすると、もともと読み取り専用でなかった場合にエラーやバグの原因になるため、必ず `And Not` を使いましょう。

4. 現場でありがちな「落とし穴」とエラー対策

VBScriptでファイル属性を扱う際、現場のエンジニアが直面しやすいトラブルをいくつか挙げておきます。

① 「権限エラー (Permission Denied)」が発生する

  • 原因:システムや他のユーザーが排他制御(ロック)しているファイル、または管理者権限が必要なフォルダ(`C:\Program Files` など)直下のファイルを操作しようとした場合。
  • 対策:スクリプトを「管理者として実行」する、あるいは操作対象をユーザープロファイル配下(デスクトップやドキュメントなど)に限定しましょう。

② ファイルが見つからない (File not found)

  • 原因:`fso.GetFile(path)` を実行する際、パスの記述ミスや、ファイルがまだ生成されていない場合。
  • 対策:必ず `If fso.FileExists(path) Then` で存在確認を行う防衛的プログラミングを習慣にしてください。

おわりに:ここをクリアすれば、VBScriptの基本はバッチリです!

今回は `FileSystemObject` の `Attributes` プロパティを使ったファイル制御の極意をお伝えしました。

  • ファイルの「状態」は数字の足し算(ビット)で管理されていること
  • 属性の付与には `Or`、解除には `And Not` を使うというイディオム

これらをマスターしたあなたは、単なる「マクロの延長」ではなく、OSの深部にアプローチできる本格的な自動化エンジニアの扉を開いています。

日々のルーチンワークを効率化する堅牢なスクリプトを、ぜひあなたの手で組み上げてみてください。応援しています!

タイトルとURLをコピーしました