【入門編】【初心者向け】Drive.FileSystemプロパティによるフォーマット形式(NTFS/FAT32等)の自動判別と処理の安全分岐 – VBScript (Visual Basic Scripting Edition)解析バイブル

スポンサーリンク
スポンサーリンク

マクロ記録の先へ。FileSystemObjectで「環境の壁」を越える、プロフェッショナルな分岐処理の極意

こんにちは。現場の最前線で数々の自動化システムを設計してきた、チーフアーキテクトです。

皆さんは今、「マクロの記録」という魔法から一歩踏み出し、自分の手でコードを書き始めたばかりかもしれませんね。VBScript(Visual Basic Scripting Edition)は、非常にシンプルで強力な武器です。しかし、単純な命令を並べるだけでは、ある日突然、予期せぬエラーに襲われることになります。

例えば、「昨日までは動いていたのに、USBメモリにファイルをコピーしようとした途端、エラーで止まってしまった」。

そんな経験はありませんか? その原因の多くは、コードの書き方ではなく、「ファイルシステムの特性」を理解していなかったことにあります。

今日は、プロフェッショナルへの登竜門となる、Drive.FileSystemプロパティを用いた「ファイルシステムの自動判別と安全な処理分岐」について、その魂を込めて解説しましょう。ここをクリアすれば、あなたの書くスクリプトの信頼性は、一気に「プロの道具」へと昇華します。

1. なぜ「ファイルシステム」を意識しなければならないのか?

まず、知識の土台を固めましょう。Windowsの世界には、データの保存形式(ファイルシステム)がいくつか存在します。

ファイルシステム 主な特徴 致命的な制約・注意点
NTFS Windowsの標準。高機能。 アクセス権限(セキュリティ)の設定が細かい。
FAT32 古い規格。互換性が非常に高い。 1ファイルあたりの最大サイズが「4GB」まで。
exFAT USBメモリ等で使われる中間規格。 FAT32より大容量だが、NTFSほどの管理機能はない。

想像してみてください。あなたが作成した自動化ツールが、巨大なバックアップファイル(例えば5GBのログファイル)を、FAT32形式のUSBメモリにコピーしようとしたらどうなるでしょうか?

プログラムは「ディスク容量不足」や「ファイルが大きすぎます」といったエラーを吐いて、無残に停止します。これを防ぐには、「コピーを実行する前に、そのドライブが何者なのかを確かめる」という、一歩先を読む設計が必要なのです。

2. 核心:FileSystemObjectによるドライブ情報の取得

VBScriptでドライブの情報を読み解くには、`FileSystemObject` (FSO) を使います。
中でも重要なのが、`Drive` オブジェクトの `FileSystem` プロパティ です。これを使えば、そのドライブが “NTFS” なのか “FAT32” なのかを、文字列として取得できます。

重要なステップの図解

1. FSOの生成: 魔法の杖(オブジェクト)を準備する。
2. 対象パスの特定: 操作したいファイルやフォルダがある場所を指し示す。
3. ドライブ情報の抽出: そのパスが属する「ドライブ(C: や D: など)」を特定する。
4. プロパティの読み取り: `drive.FileSystem` を見て、種類を判別する。

3. 実践:安全なファイルコピー・スクリプト

それでは、実際に現場で使えるレベルのコードを見ていきましょう。
単に「判別する」だけでなく、「判別した結果に基づいて、安全に処理を分ける」という構造にしています。

' ==========================================================================
' テーマ:ファイルシステムを判別し、安全にファイルを操作する
' 概要:コピー先がFAT32の場合、4GB制限を考慮して警告またはエラー回避を行う
' ==========================================================================

Option Explicit

Dim fso, targetPath, destPath, driveObj, fsType
Dim fileSize

' --- 設定エリア ---
targetPath = "C:\Temp\LargeData.zip" ' コピーしたい元ファイル
destPath   = "E:\Backup\"             ' コピー先のフォルダ(USBメモリなどを想定)
' ------------------

Set fso = CreateObject("Scripting.FileSystemObject")

' 1. ファイルの存在確認(基本中の基本!)
If Not fso.FileExists(targetPath) Then
    WScript.Echo "エラー: コピー元のファイルが見つかりません。"
    WScript.Quit
End If

' 2. コピー先ドライブの情報を取得
' GetDriveNameを使って、パスから "E:" のようなドライブレターを抽出する
Dim destDriveLetter
destDriveLetter = fso.GetDriveName(destPath)

' ドライブオブジェクトを取得
Set driveObj = fso.GetDrive(destDriveLetter)
' ファイルシステムの種別(NTFS, FAT32, exFAT等)を取得
fsType = driveObj.FileSystem

' 3. ファイルサイズの取得(バイト単位)
fileSize = fso.GetFile(targetPath).Size

' 4. 安全な分岐処理(ここがプロの仕事です)
WScript.Echo "判別結果: コピー先は [" & fsType & "] です。"

Select Case fsType
    Case "NTFS"
        ' NTFSなら制限を気にせず進める
        WScript.Echo "NTFSを確認。安全にコピーを開始します。"
        PerformCopy targetPath, destPath

    Case "FAT32"
        ' FAT32の場合、4GB (4,294,967,296 バイト) の壁をチェック
        If fileSize > 4294967295 Then
            WScript.Echo "【警告】FAT32の制限を超えています!"
            WScript.Echo "ファイルサイズが4GBを超えているため、コピーを中止しました。"
        Else
            WScript.Echo "FAT32ですが、サイズは制限内です。コピーを開始します。"
            PerformCopy targetPath, destPath
        End If

    Case "exFAT"
        ' exFATも基本的には大容量ファイルを扱える
        WScript.Echo "exFATを確認。コピーを開始します。"
        PerformCopy targetPath, destPath

    Case Else
        ' 未知のファイルシステムへの対策
        WScript.Echo "エラー: 未知のファイルシステム [" & fsType & "] です。処理を中断します。"
End Select

' --- サブルーチン:コピー実行部 ---
Sub PerformCopy(src, dst)
    On Error Resume Next ' エラーハンドリングの準備
    fso.CopyFile src, dst, True
    
    If Err.Number <> 0 Then
        WScript.Echo "実行エラー: " & Err.Description
    Else
        WScript.Echo "完了: コピーに成功しました。"
    End If
    On Error GoTo 0 ' エラーハンドリングを元に戻す
End Sub

' オブジェクトの解放(メモリ管理の作法)
Set driveObj = Nothing
Set fso = Nothing

4. アーキテクトの視点:陥りやすい罠と回避策

このコードを読み解く上で、初心者が躓きやすいポイントを解説しておきます。

① `GetDrive` に直接パスを渡さない

`fso.GetDrive(“C:\Temp\File.txt”)` と書きたくなるかもしれませんが、これはエラーの元です。`GetDrive` は「ドライブ名(C:)」を期待しています。
必ず、`fso.GetDriveName` を一度通して、ドライブレターを抽出してから渡すのが、堅牢な設計のコツです。

② 「4GB」の計算に注意

コンピュータの世界では、1KBは1024バイトです。4GBを正確に表すと `4 * 1024 * 1024 * 1024` です。コード内では、より確実な数値(4,294,967,295)を使っています。

③ エラーハンドリング(On Error Resume Next)

ファイル操作は、常に「失敗する可能性」と隣り合わせです。ディスクがいっぱい、ファイルが使用中、権限がない……。
`PerformCopy` 内で行っているように、実行部分には必ずエラーハンドリングを組み込み、エラーが起きた時に「なぜ止まったのか」をユーザーに伝えられるようにしましょう。

最後に:一歩先を行くエンジニアへ

「動けばいい」という段階から、「どんな環境でも、安全に動き続ける」という段階へ。
今回学んだ `Drive.FileSystem` による判別は、そのための強力な武器になります。

プログラミングとは、単に命令をコンピュータに伝える作業ではありません。「起こりうるトラブルを予測し、あらかじめ回避する道筋を作ること」です。

このコードをベースに、あなた自身の業務に合わせた「安全装置」を組み込んでみてください。それが、あなたを「単なるマクロ使い」から「信頼されるエンジニア」へと変える第一歩になります。

応援していますよ。さあ、次のコードを書き進めましょう!

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