VBScriptでZIPを制する:外部ツール不要!Shell.Applicationによる自動化の極意
こんにちは。自動化の世界へようこそ。
現場で「ZIPファイルを解凍したい」「ログを圧縮して送りたい」という要件に直面したとき、わざわざサードパーティ製のライブラリをインストールしたり、コマンドラインツールを持ち込んだりしていませんか?
実は、Windowsには標準で「Shell.Application」という強力な魔法が備わっています。これを使えば、VBScriptだけでZIP操作は完結します。今日は、OSの深層を操るエンジニアの視点から、この「枯れた技術」の真髄を伝授しましょう。
—
1. なぜ「Shell.Application」なのか?
プログラミングの世界では「餅は餅屋」と言いますが、Windowsにおけるファイル管理は、まさにOS(シェル)の領分です。`Shell.Application`は、エクスプローラーが裏側で使っている機能そのものを、スクリプトから直接呼び出すインターフェースです。
- 利点1:環境依存がない
Windows 7以降であれば、どのPCでも動きます。
- 利点2:セキュリティ要件がクリアしやすい
外部ツールをインストールする際の申請や、管理者権限の壁に悩まされることがありません。
- 利点3:OSネイティブな挙動
エクスプローラーで行う操作と同じなので、動作の整合性が極めて高いです。
—
2. 【実戦コード】ZIP圧縮・解凍のテンプレート
まずは、現場でそのまま使えるコードを提示します。これをメモ帳にコピーして、拡張子を `.vbs` で保存してください。
ZIP圧縮のコード
‘ 空のZIPファイルを作成し、そこにファイルをコピーすることで圧縮を実現します
Sub CreateZip(zipPath, targetFolder)
Dim objShell, fso, zipFile
Set objShell = CreateObject(“Shell.Application”)
Set fso = CreateObject(“Scripting.FileSystemObject”)
‘ 1. 空のZIPファイルを作成 (ヘッダー情報を書き込む)
If Not fso.FileExists(zipPath) Then
fso.CreateTextFile(zipPath, True).Write “PK” & Chr(5) & Chr(6) & String(18, 0)
End If
‘ 2. ZIPの中身を操作対象として開く
Set zipFile = objShell.NameSpace(zipPath)
‘ 3. 指定フォルダの中身を全てZIPへコピー
zipFile.CopyHere objShell.NameSpace(targetFolder).Items
‘ 4. 処理が終わるまで少し待機する(ここが重要!)
WScript.Sleep 2000
Set zipFile = Nothing
Set objShell = Nothing
End Sub
ZIP解凍のコード
Sub ExtractZip(zipPath, destFolder)
Dim objShell
Set objShell = CreateObject(“Shell.Application”)
‘ 解凍先フォルダが存在しなければ作成
Dim fso: Set fso = CreateObject(“Scripting.FileSystemObject”)
If Not fso.FolderExists(destFolder) Then fso.CreateFolder(destFolder)
‘ ZIPの中身を解凍先にコピー
objShell.NameSpace(destFolder).CopyHere objShell.NameSpace(zipPath).Items
End Sub
—
3. 伝説のエンジニアからの「極限の知見」:ここが落とし穴!
初学者が必ずと言っていいほど躓くポイントがあります。ここをクリアすれば、あなたはもう脱・初心者です。
① 「WScript.Sleep」の呪縛
`CopyHere` メソッドは「非同期」で動きます。つまり、プログラムは圧縮が終わるのを待たずに次の行へ進んでしまうのです。大きなファイルを扱う際にスクリプトが即終了してしまうと、ZIPが壊れた状態で終わります。`WScript.Sleep` で処理時間を確保するか、ループでファイルの存在確認を行うのが現場の鉄則です。
② 空のZIPファイルを作るおまじない
`Shell.Application` は、既存のZIPファイルに対して操作を行うことを前提としています。そのため、最初の一歩として「ZIPのヘッダー情報」をバイナリで書き込む必要があります。
`”PK” & Chr(5) & Chr(6) & String(18, 0)`
この一行は魔法の呪文です。これを書かずに空のファイルを作っても、WindowsはZIPとして認識してくれません。
③ フォルダ指定は「フルパス」で
相対パスは予期せぬエラーの温床です。`FSO.GetAbsolutePathName` を使い、常に絶対パスを渡すように設計してください。
—
最後に:なぜVBScriptを学ぶのか
「今さらVBScript?」と思うかもしれません。しかし、「OSの標準機能だけで、ゼロから自動化を構築する」という設計思想は、どの言語(PythonやPowerShell)へ移行しても必ず役に立つ、エンジニアとしての骨格になります。
まずはこのコードを動かして、自分の手でファイルを圧縮・解凍してみてください。その一歩が、あなたの業務を劇的に変える自動化エンジニアへの第一歩です。
何か困ったことがあれば、いつでも質問してくださいね。応援しています!
