こんにちは、自動化の深淵へようこそ。私は長年、Windowsの内部構造をVBScriptという「魔法の杖」で操ってきたチーフアーキテクトです。
「ディスク容量が足りない」――ユーザーからこの悲鳴を聞いたとき、多くの管理者は管理者権限を振りかざして調査に乗り出します。しかし、真のプロフェッショナルは違います。「一般ユーザー権限のまま、いかにエレガントに、かつ確実に原因を特定するか」。ここにエンジニアとしての美学が宿るのです。
今回は、VBScriptの基礎であるWSH(Windows Script Host)の実行環境を理解しながら、`Shell.Application` オブジェクトを駆使して、ユーザーのプロファイル領域(AppData)に潜む「容量喰い」のフォルダを特定するスクリプトを解説します。
マクロの記録を卒業し、OSの仕組みを直接叩く快感を、ぜひ味わってください。
—
1. なぜ今、VBScriptなのか?
「VBScriptは古い」と言う人がいます。しかし、その認識は甘いと言わざるを得ません。
VBScriptはWindowsがある限り、「インストール不要・即実行可能」という最強のポータビリティを誇ります。特に、権限が厳しく制限された企業のPC環境において、追加ソフトなしでOSの深層(Shell)にアクセスできるこの言語は、まさに「隠し刀」のような鋭さを持っています。
WSH(Windows Script Host)という舞台
VBScriptを動かすエンジンが「WSH」です。
- wscript.exe: GUIモード(メッセージボックスが出る)
- cscript.exe: CUIモード(コマンドプロンプトで動く)
この違いを意識するだけでも、初学者から一歩抜け出すことができます。今回は、結果を一覧で見やすいため、コマンドプロンプト(cscript)での実行を想定したコードを書き上げましょう。
—
2. Shell.Application:OSの「案内人」を召喚する
今回の主役は `Shell.Application` オブジェクトです。
通常、ファイル操作には `Scripting.FileSystemObject` (FSO) を使いますが、`Shell.Application` の凄みは「Windowsの特殊フォルダを知り尽くしている」点にあります。
`AppData` や `Local Settings` といったフォルダは、OSのバージョンによって物理パスが異なることがありますが、Shellオブジェクトに「AppDataの場所を教えて」と頼めば、どんな環境でも正確な場所を指し示してくれます。
—
3. 【実践】AppData内・大容量キャッシュ特定スクリプト
以下のコードは、管理者権限を必要とせず、実行したユーザー自身の `Local AppData` を走査し、サイズが大きい順にフォルダを表示するものです。
‘ ===========================================================================
‘ Description: AppData容量調査スクリプト (特権不要)
‘ Author: Legendary Chief Architect
‘ Environment: WSH (VBScript)
‘ ===========================================================================
Option Explicit
‘ オブジェクトの宣言
Dim objShell, objFSO
Dim objLocalFolder, objSubFolder
Dim folderPath, dictSizes
Dim key, i
‘ 1. オブジェクトの初期化
Set objShell = CreateObject(“Shell.Application”)
Set objFSO = CreateObject(“Scripting.FileSystemObject”)
Set dictSizes = CreateObject(“Scripting.Dictionary”)
‘ 2. Local AppData (フォルダ定数: 28) のパスを取得
‘ Shell.Application を使うことで、隠しフォルダのパスもスマートに取得可能
Set objLocalFolder = objShell.Namespace(28) ‘ 28 = CSIDL_LOCAL_APPDATA
folderPath = objLocalFolder.Self.Path
WScript.Echo “— 調査開始: ” & folderPath & ” —”
WScript.Echo “※フォルダ容量の計算には時間がかかる場合があります…”
‘ 3. 直下のフォルダを走査してサイズを集計
‘ FileSystemObject を組み合わせて「計算」の精度を高める
For Each objSubFolder In objFSO.GetFolder(folderPath).SubFolders
On Error Resume Next ‘ アクセス拒否フォルダをスキップする慈悲
‘ サイズをMB単位で取得
Dim nSize
nSize = Round(objSubFolder.Size / 1024 / 1024, 2)
‘ 100MB以上の「大物」だけを記録
If nSize > 100 Then
dictSizes.Add objSubFolder.Name, nSize
End If
On Error GoTo 0
Next
‘ 4. 結果の出力
WScript.Echo “————————————————–”
WScript.Echo “【100MB以上を消費している容疑者フォルダ】”
WScript.Echo “————————————————–”
If dictSizes.Count = 0 Then
WScript.Echo “クリーンな環境です。巨大なキャッシュは見当たりません。”
Else
‘ 簡易的な表示(VBScriptのDictionaryはソートが苦手だが、まずは列挙)
For Each key In dictSizes.Keys
WScript.Echo Left(key & Space(30), 30) & ” : ” & dictSizes(key) & ” MB”
Next
End If
WScript.Echo “————————————————–”
WScript.Echo “調査完了。ブラウザのキャッシュやTeams/Slackの残骸に注意してください。”
‘ 5. オブジェクトの解放 (命を慈しむように、使い終えたら還す)
Set objLocalFolder = Nothing
Set objShell = Nothing
Set objFSO = Nothing
Set dictSizes = Nothing
—
4. コードの勘所と「プロの視点」
① `Shell.Namespace(28)` の魔法
パスを `”C:\Users\Name\AppData\Local”` と直接書くのは素人の仕事です。ユーザー名が変われば動かなくなるからです。`Shell.Application` の `Namespace` メソッドに定数(28)を渡せば、Windowsが公式に認める「Local AppData」の場所を動的に掴めます。これが「環境に依存しない」堅牢なコードの第一歩です。
② `On Error Resume Next` の使い時
プロファイル内には、システムがロックしているフォルダや、アクセス権のないフォルダが稀に存在します。そこで処理を止めないために `Resume Next` を使います。ただし、「どこでエラーが起きるか予想できている場所」にだけ最小限に適用するのが、デバッグで泣かないための鉄則です。
③ オブジェクトのライフサイクル管理
コードの最後で `Set … = Nothing` を徹底しています。VBScriptはスクリプト終了時にメモリを解放してくれますが、明示的に書くことで「このオブジェクトの役割はここで終わりだ」という設計思想を後継者に伝えることができます。
—
5. 初学者が陥りやすい罠
1. 「.vbs」ファイルの保存形式:
日本語(全角文字)をコードに含める場合、文字コードを 「ANSI (Shift-JIS)」 で保存してください。UTF-8で保存すると、WSHが文字化けを起こして実行エラーになります。これは現代のエンジニアが最もハマりやすい罠の一つです。
2. 実行方法:
このスクリプトをダブルクリックすると、メッセージボックスが大量に出て止まらなくなる可能性があります(`WScript.Echo` の性質)。
コマンドプロンプトを開き、以下のコマンドで実行するのがスマートです。
`cscript //nologo your_script_name.vbs`
—
結論:基礎を掌握すれば、世界は自動化できる
今回は `Shell.Application` を入り口に、プロファイル調査の自動化を学びました。
「AppDataの中身を手動で右クリックしてプロパティを見て回る」という退屈な作業から、あなたはこの数行のコードで解放されたのです。
VBScriptの基本は、「OSにある既存の部品(オブジェクト)を、いかに組み合わせて楽をするか」に集約されます。この考え方は、将来あなたがPythonやPowerShell、あるいはクラウドネイティブな言語へ転向したとしても、一生モノの財産になります。
ここをクリアすれば、VBScriptの基本はバッチリですよ。次は、取得したデータをExcelに自動で書き出す「連携の極意」に挑戦してみるのも面白いでしょう。
自動化の旅は、まだ始まったばかりです。頑張ってください。
