【入門編】【上級プロフェッショナル向け】FSOで条件抽出したファイル群をPowerShell CLIへ渡して超高速ZIP圧縮・転送するハイブリッドワークフロー – VBScript (Visual Basic Scripting Edition)解析バイブル

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

マクロの記録から脱却せよ。VBScript(FSO)とPowerShellを融合させる「ハイブリッド・オートメーション」の極意

こんにちは。現場の自動化を支えるチーフアーキテクトです。

「マクロの記録で、なんとかファイル操作はできるようになった。でも、大量のファイルを圧縮してサーバーに送るとなると、動きが重いし、やり方がわからない……」

もしあなたが今、そんな壁にぶつかっているなら、おめでとうございます。あなたは今、「単なる操作の自動化」から「システム設計としての自動化」へと進化する入り口に立っています。

今日は、VBScript (Visual Basic Scripting Edition) の真髄である FSO (FileSystemObject) を使いこなしつつ、その弱点である「重い処理」を PowerShell という最強の助っ人に丸投げする、プロフェッショナルな「ハイブリッド・ワークフロー」を伝授しましょう。

ここをクリアすれば、あなたの自動化スキルは、初級者の域を完全に脱することになりますよ。

1. なぜ「VBScript単体」では限界があるのか?

まず、私たちが愛用する `FileSystemObject (FSO)` について整理しておきましょう。FSOは、ファイルやフォルダの存在確認、作成、削除、そして複雑な条件による検索を得意とする、非常に優れた「探索のプロ」です。

しかし、エンジニアとして知っておかなければならない「限界」があります。

  • 圧縮・解凍の不在: VBScript自体には、標準で「ZIP圧縮」を行う機能がありません。
  • ネットワーク・プロトコルの弱さ: 近代的なクラウドストレージや、高度なネットワーク転送を行うには、VBScriptのコードはあまりに冗長で非効率です。
  • シングルスレッドの壁: 大量の重い計算やデータ処理をさせると、スクリプト全体の進行が止まってしまいます。

そこで、「条件に合うファイルを特定する(探索)」のはVBScriptに任せ、「重い圧縮や転送(実行)」はPowerShellに一任する。この「適材適所」の考え方こそが、プロの設計思想です。

2. ハイブリッド・ワークフローの設計図

今回のミッションはこうです。

1. VBScript (The Scout): FSOを使い、特定のフォルダから「特定の条件(例:拡張子が.log、かつ更新日が古い)」に合致するファイルを高速にリストアップする。
2. PowerShell (The Heavy Lifter): VBScriptが作り上げた「ファイルリスト」を受け取り、一括でZIP圧縮し、指定の場所に転送する。

この2つを、`WScript.Shell` オブジェクトを介して連携させます。

3. 実装:極限のハイブリッド・スクリプト

さあ、実際に動くコードを見ていきましょう。このコードは、そのままコピーして、パスを書き換えるだけで構造の理解に使えます。

【VBScript側】条件抽出とコマンド発行

' =================================================================
' Hybrid Automation Scout: File Finder & Command Dispatcher
' =================================================================
Option Explicit

Dim fso, targetFolder, file, fileList, shell, psCommand
Dim targetPath, zipPath, logExtension

' --- 設定エリア ---
targetPath = "C:\Work\Logs"          ' 探索対象フォルダ
zipPath = "C:\Work\Archive.zip"      ' 作成するZIPのパス
logExtension = ".log"                ' 抽出したい拡張子
' ------------------

Set fso = CreateObject("Scripting.FileSystemObject")
Set shell = CreateObject("WScript.Shell")
fileList = ""

' 1. フォルダの存在確認(プロの鉄則:いきなり処理しない)
If Not fso.FolderExists(targetPath) Then
    WScript.Echo "Error: Target folder not found."
    WScript.Quit
End If

' 2. FSOによる高速なファイル探索
Dim folder
Set folder = fso.GetFolder(targetPath)

For Each file In folder.Files
    ' 条件抽出:拡張子が一致するか? (ここで複雑な日付判定なども可能)
    If LCase(fso.GetExtensionName(file.Name)) = LCase(logExtension) Then
        ' ファイルパスをスペース区切りで蓄積(PowerShellへ渡す用)
        ' ※パスにスペースが含まれる場合を考慮し、ダブルクォートで囲む
        fileList = fileList & """" & file.Path & """ "
    End If
Next

' 3. 抽出結果の判定とPowerShellへの橋渡し
If fileList <> "" Then
    WScript.Echo "Files found. Handing over to PowerShell..."

    ' PowerShellコマンドの構築
    ' Compress-Archiveコマンドを使い、リストアップされたファイルを一括圧縮する
    ' -Force をつけることで、既存のZIPがあっても上書き更新可能にする
    psCommand = "powershell -NoProfile -ExecutionPolicy Bypass -Command " & _
                """Compress-Archive -Path " & fileList & " -DestinationPath '" & zipPath & "' -Force"""

    ' 4. PowerShellの実行
    ' 0: ウィンドウを隠す, True: 終了を待機する
    shell.Run psCommand, 1, True 

    WScript.Echo "Process Completed Successfully."
Else
    WScript.Echo "No matching files found. Nothing to do."
End If

' 5. オブジェクトの解放(メモリリークを防ぐ、プロの作法)
Set file = Nothing
Set folder = Nothing
Set fso = Nothing
Set shell = Nothing

4. アーキテクトが教える「ここが重要!」

コードを眺めるだけでなく、なぜこのように書くのか、その「重み」を理解してください。

① オブジェクトのライフサイクル管理

コードの最後に `Set fso = Nothing` と書いていますね。これは単なるマナーではありません。大規模な自動化システムにおいて、オブジェクトを明示的に解放しないことは、メモリを食いつぶし、システム全体のパフォーマンスを低下させる「静かなる時限爆弾」になります。

② `shell.Run` の第2・第3引数の使い分け

`shell.Run psCommand, 1, True`

  • `1` (Window Style): 通常のウィンドウを表示します。デバッグ時はこれで見えるようにしておき、本番運用では `0` (隠す) に変えるのがスマートです。
  • `True` (WaitOnReturn): これが最も重要です。`True` にすることで、PowerShellの圧縮処理が終わるまでVBScriptは待機します。もしここを `False` にしてしまうと、圧縮が終わる前にVBScriptが「完了しました!」と嘘の報告をしてしまいます。

③ PowerShellへの引数の渡し方

ファイルパスにスペースが含まれている場合(例: `C:\My Documents\…`)、コマンドラインはそれを「別々の引数」だと勘違いしてエラーを吐きます。そのため、VBScript側で `”””” & file.Path & “”””` と、ダブルクォートを二重に重ねて、パスを「一つの塊」として保護しているのです。

5. 陥りやすいエラーと回避策

プロへの階段を登る際、以下のエラーに遭遇したら、落ち着いて対処してください。

  • 「ファイルが使用中です」エラー:

FSOでファイルを探索している最中に、別のプロセスがそのファイルをロックしているとエラーになります。`On Error Resume Next` で無理やり進めるのは、後で原因不明のバグを生む原因です。ファイルが開けるか事前にチェックするか、エラーハンドリングを適切に行いましょう。

  • PowerShellの実行ポリシー制限:

会社のPCでは、セキュリティのためにPowerShellの実行が制限されていることがあります。その場合は、コマンドラインに `-ExecutionPolicy Bypass` を付与することで、そのプロセスに限り制限を回避して実行できます(これは、スクリプトを「安全に」実行するためのテクニックです)。

最後に

いかがでしたか?
VBScriptで「賢く探し」、PowerShellで「力強く実行する」。この役割分担を理解したあなたは、もう単なる「マクロ使い」ではありません。「業務プロセスを設計するエンジニア」への第一歩を踏み出したのです。

最初は難しく感じるかもしれません。でも、一度この「ハイブリッドな感覚」を掴んでしまえば、どんな複雑な自動化タスクも、パズルのように組み合わせて解決できるようになりますよ。

応援しています。また次の技術解説でお会いしましょう!

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