VBScriptを使い倒せ!FSOとMakeCABで実現する「ログ自動圧縮アーカイブ」の極意
こんにちは。自動化の現場でVBScriptの泥臭さと美しさに魅せられ続けてきたエンジニアです。
今日は「マクロの記録」という温室を飛び出し、Windowsの標準機能だけで完結する堅牢な運用自動化の世界へあなたを招待します。テーマは「FSO(FileSystemObject)によるログファイルの選別と、MakeCABによる非同期圧縮・アーカイブ」です。
なぜ今さらVBScriptなのか? それは、特別なランタイムもインストール権限も不要で、Windowsが動く場所ならどこでも即座に力を発揮する「最強のポータブルツール」だからです。
—
1. なぜFSOとMakeCABの組み合わせなのか?
多くの初心者が陥る罠は、ファイルを一つずつ開いて編集しようとすることです。しかし、運用自動化の真髄は「OSの標準機能をオーケストレーション(指揮)すること」にあります。
- FSO (FileSystemObject): ファイルの属性(更新日時、サイズ)を高速に取得し、条件に合うものだけを「選別」するのに最適です。
- MakeCAB: Windows標準の圧縮ツール。コマンドラインから制御でき、`expand`コマンドで解凍できるため、専用の圧縮ソフトが不要です。
この組み合わせで、「重くなったログを自動で圧縮して別フォルダへ退避し、元を消す」という一連の処理を構築します。
—
2. 実践!自動圧縮スクリプトのコード
まずは、現場で即戦力となるコードをご覧ください。
‘ — 設定エリア —
Dim fso, folder, file
Dim targetPath, archivePath, cmd
Set fso = CreateObject(“Scripting.FileSystemObject”)
targetPath = “C:\Logs\App” ‘ 監視対象フォルダ
archivePath = “C:\Logs\Archive” ‘ 圧縮ファイル保存先
‘ フォルダが存在しなければ作成
If Not fso.FolderExists(archivePath) Then fso.CreateFolder(archivePath)
‘ フォルダ内のファイルを列挙
Set folder = fso.GetFolder(targetPath)
For Each file In folder.Files
‘ 更新日時が30日以上前、かつサイズが1MB以上のログを対象とする
If DateDiff(“d”, file.DateLastModified, Now) > 30 And file.Size > 1048576 Then
‘ MakeCABコマンドの構築
‘ /V0 は出力を抑制して静かに実行するためのオプション
cmd = “makecab “”” & file.Path & “”” “”” & archivePath & “\” & file.Name & “.cab”””
‘ WScript.Shellを使って非同期実行
Dim shell
Set shell = CreateObject(“WScript.Shell”)
‘ 0: ウィンドウ非表示, True: コマンド終了を待機
If shell.Run(cmd, 0, True) = 0 Then
‘ 圧縮成功時のみ元ファイルを削除
file.Delete True
WScript.Echo “圧縮完了: ” & file.Name
End If
End If
Next
Set shell = Nothing
Set fso = Nothing
—
3. ここがプロのこだわり:知っておくべき「3つの壁」
① WScript.ShellのRunメソッドの罠
`shell.Run(cmd, 0, True)` の最後の引数 `True` に注目してください。これを `False` にすると、コマンドの完了を待たずに次の処理(ファイルの削除)へ進んでしまいます。圧縮が終わっていないのに元ファイルを消そうとするとエラーになり、最悪の場合ファイルが破損します。「同期実行」こそが安定運用の鍵です。
② パスの空白文字問題
コード内でダブルクォーテーション `”` をわざわざ挟んでいるのは、ファイルパスにスペースが含まれていた場合の誤作動を防ぐためです。`”C:\Program Files\…”` のようなパスを扱う際、これを忘れるとコマンドが引数を解釈できず爆発します。
③ 権限と実行環境
VBScriptは「実行したユーザーの権限」で動きます。サーバー上のログを操作する場合は、スクリプト実行ユーザーに書き込み・削除権限があることを必ず確認してください。また、`cscript` コマンドで実行するとコンソール出力が見やすく、デバッグが捗ります。
—
4. ステップアップ:さらに洗練させるために
このスクリプトをマスターしたあなたは、もう初心者ではありません。次なるステップとして以下を検討してみてください。
- ログ出力: `WScript.Echo` を `fso.OpenTextFile(logPath, 8, True)` に書き換え、処理結果をテキストファイルに追記するようにする。
- 例外処理: `On Error Resume Next` を使い、個別のファイルでエラーが出ても止まらない「タフなスクリプト」に進化させる。
—
最後に:自動化とは「時間を生み出すこと」
VBScriptで書かれたこの数行のコードが、毎日の退屈な作業を代行し、あなたに「新しい技術を学ぶ時間」や「家族と過ごす時間」をプレゼントしてくれます。
コードが動いた瞬間のあの心地よい感覚を、ぜひ味わってください。もしエラーに詰まったら、それはあなたのコードが洗練されるための「階段」です。一歩ずつ、着実に。
ここをクリアすれば、あなたはもう立派な自動化エンジニアの入り口に立っています。応援していますよ!
