【入門編】【自己更新モジュール】ローカル実行中のVBScriptをネットワーク共有上の最新コードで動的差し替え・更新する仕組み – VBScript (Visual Basic Scripting Edition)解析バイブル

スポンサーリンク

こんにちは!業務の自動化やキッティングの現場で、VBScriptやWSH(Windows Script Host)のいぶし銀な活躍に魅せられているエンジニアの皆さん、あるいは「エクセルのマクロの記録くらいはできるけど、もっと本格的なスクリプトを組織全体に配る仕組みを作りたい!」と一歩踏み出した皆さん。

今回は、VBScriptの真骨頂とも言える「ネットワーク共有から最新コードを自動で取ってきて、自分自身をアップデートしながら華麗に再起動する【自己更新モジュール】」の作り方を解説します。

「社内の端末50台にスクリプトを配ったはいいが、仕様変更のたびに全台のファイルを置き換える地獄の作業から解放されたい……」そんな現場の叫びを、VBScriptの泥臭くも美しい技術でスマートに解決しましょう。ここをクリアすれば、あなたのスクリプト運用スキルは一気にプロの領域へ到達します。さあ、一緒に扉を開けましょう!

なぜ「自己更新モジュール」が必要なのか?

企業でVBScriptを使った業務自動化ツールを運用していると、必ずこんな壁にぶつかります。

  • 「新しいバージョンを作ったのに、古いファイルを使い続けてエラーを出すユーザーがいる」
  • 「修正のたびに、全台のローカルPCやファイルサーバーに手動でコピーし直すのが面倒すぎる」

これを解決するのが「自己更新(セルフ・アップデート)メカニズム」です。
仕組みはとてもシンプル。

1. ユーザーがデスクトップ等にあるローカルのVBScriptをダブルクリックして起動。
2. スクリプトが起動直後、社内ネットワーク(共有フォルダ)にある「最新版」と自分のバージョンを比較。
3. もし最新版があれば、自分自身をネットワーク上の最新コードで上書き(または置き換え)
4. 最新になった自分を自動で再起動(再実行)し、本処理へ突入する。

これさえ作れば、あなたがファイルサーバーの親コードを1つ書き換えるだけで、全ユーザーのPCが勝手に最新状態に生まれ変わる「夢の自動配布システム」が完成します。

全体像のイメージ図(ライフサイクル)

言葉だけだとイメージしにくいので、スクリプトが起動してから再実行されるまでの流れを図解的に見てみましょう。

[ ユーザーのPC ] [ ネットワーク共有フォルダ ]
local_script.vbs 起動

├── 1. サーバーの version.txt を確認
│ │ (古い!)
│ ▼
├── 2. サーバーから最新の .vbs をコピーして自分を上書き!

└── 3. WScript.Shell で自分自身を再起動! ──> 終了


【最新版】として再スタート! 🚀

「自分が動いている最中に、自分自身を書き換えられるの?」と思ったそこのあなた。鋭い着眼点です。
Windowsのファイルシステム上、実行中のファイルを直接上書きするのはエラーになることがあります。そのため、今回は「自分自身を安全にコピー&上書きし、WScript.Shellオブジェクトを使って別プロセスで新モジュールをキックする」という、VBScriptならではのテクニックを使います。

実装コード:究極の自己更新型VBScript

それでは、実際の現場でそのままコピペして使える完全版のコードを公開します。
コード内のパス(`\\server\share\…` の部分)は、皆さんの環境に合わせて書き換えてください。

‘ ==============================================================================
‘ スクリプト名: SelfUpdateLauncher.vbs
‘ 概要: ネットワーク共有上の最新コードとバージョン比較を行い、
‘ 必要に応じて自己更新して再起動するモジュール
‘ ==============================================================================
Option Explicit

‘ — [設定エリア] ————————————————————-
Const CURRENT_VERSION = “1.0.2” ‘ このローカルスクリプトのバージョン
Const REMOTE_DIR = “\\fileserver\tools\vbs\” ‘ ネットワーク上の親フォルダ
Const SCRIPT_NAME = “SelfUpdateLauncher.vbs” ‘ スクリプトファイル名
‘ ——————————————————————————

Dim fso, shell
Set fso = CreateObject(“Scripting.FileSystemObject”)
Set shell = CreateObject(“WScript.Shell”)

Dim localPath, remotePath, remoteVersionPath
localPath = WScript.ScriptFullName ‘ 実行中の自分のフルパス
remotePath = fso.BuildPath(REMOTE_DIR, SCRIPT_NAME) ‘ サーバー上の本体パス
remoteVersionPath = fso.BuildPath(REMOTE_DIR, “version.txt”) ‘ サーバー上のバージョン情報ファイル

‘ 1. ネットワーク共有への接続確認(オフライン耐性)
If fso.FileExists(remoteVersionPath) Then

‘ 2. サーバー上の最新バージョン番号を取得
Dim ts, remoteVersion
Set ts = fso.OpenTextFile(remoteVersionPath, 1, False) ‘ 1 = ForReading
remoteVersion = Trim(ts.ReadAll)
ts.Close
Set ts = Nothing

‘ 3. バージョン比較(簡易的に文字列比較、厳密なら数値や配列に分解)
If remoteVersion <> CURRENT_VERSION Then
WScript.Echo “新しいバージョン (” & remoteVersion & “) が見つかりました。” & vbCrLf & _
“自動アップデートを実行します。”

On Error Resume Next
‘ 自分自身を最新版で上書き(True = 上書き許可)
fso.CopyFile remotePath, localPath, True

If Err.Number <> 0 Then
WScript.Echo “アップデートの書き込みに失敗しました。権限を確認してください。” & vbCrLf & _
“エラー内容: ” & Err.Description
‘ 失敗しても古いバージョンのまま継続実行させる場合はここでExitしない
Else
On Error GoTo 0
WScript.Echo “アップデートが完了しました。最新版を起動します。”

‘ 更新された新しい自分自身を別プロセスで起動し、現在のプロセスは終了する
shell.Run “cscript.exe “”” & localPath & “”””, 1, False
WScript.Quit 0
End If
On Error GoTo 0
End If

Else
‘ ネットワークに繋がっていない場合はローカル版でそのまま動く(オフラインフォールバック)
‘ これにより、出先や社内LAN切断時でもスクリプトが動かなくなる事故を防げます
‘ WScript.Echo “ネットワーク上の最新バージョンを確認できませんでした。オフラインモードで起動します。”
End If

‘ ==============================================================================
‘ 【メイン処理】 ここから下に実際の業務ロジックを書きます
‘ ==============================================================================
Call MainBusinessLogic()

Sub MainBusinessLogic()
‘ ここにエクセル操作やファイル整理などの本処理を記述します
WScript.Echo “メイン処理を実行中… (現在のバージョン: ” & CURRENT_VERSION & “)”

‘ 例:何か処理をしたとする

WScript.Echo “すべての処理が正常に完了しました。”
End Sub

コードの核心:ここがプロの技

初心者のうちは、「ファイルをコピーして終わり」にしがちですが、実運用を考慮するといくつかの重要なポイントがあります。

1. オブジェクトの適切なクリーンアップ

`Scripting.FileSystemObject` や `WScript.Shell` は、VBScriptが終了するときに自動解放されますが、複雑なループや長大なスクリプトの中では、使わなくなったファイルオブジェクト(`ts.Close` や `Set ts = Nothing`)を明示的に閉じるのが美しいコードの作法です。メモリリークを防ぎ、安定性を高めます。

2. オフライン耐性(フォールバック)

ネットワーク共有を使うシステムで最も恐ろしいのは、「社内LANに繋がっていない(VPN接続していない)時にスクリプトが一切起動しなくなる」というトラブルです。
今回のコードでは、`If fso.FileExists(remoteVersionPath) Then` でサーバーへの導線を確認し、繋がっていなければエラーで止まるのではなく、「そのままローカルの古いバージョンで動く」ように設計しています。現場のユーザーを困らせない、優しさと堅牢性を兼ね備えた設計です。

3. WScript.Shell による非同期再起動

アップデートファイルを上書きコピーした直後、以下のコードで新しい自分をキックしています。

shell.Run “cscript.exe “”” & localPath & “”””, 1, False
WScript.Quit 0

  • `cscript.exe` を指定する理由: ポップアップ(`WScript.Echo`)やコンソール出力を安定させるため。GUIで動かしたい場合は `wscript.exe` に変えても構いません。
  • `False`(非同期)にする理由: 今動いている古いプロセスが自分自身を終了させる前に、新しいプロセスをバックグラウンドで安全に立ち上げるためです。

陥りやすいエラーとトラブルシューティング

実際にこの仕組みを導入した際につまずきやすいポイントを先回りして解説します。

エラー①: 「権限がありません (Permission Denied)」が出る

  • 原因: ローカルPCの `C:\Program Files` などの保護されたフォルダにスクリプトを置いて実行している場合、VBScriptから自分自身を上書きする権限がありません。
  • 対策: スクリプトを配置する場所は、ユーザーのデスクトップや、書き込み権限が担保されたローカルフォルダ(例: `C:\Users\[ユーザー名]\AppData\Local\Scripts\` など)にしてください。

エラー②: 無限ループにハマる

  • 原因: ネットワーク上の `version.txt` は「1.0.2」に書き換えたのに、肝心のネットワーク上の `SelfUpdateLauncher.vbs` の中の `CURRENT_VERSION = “1.0.2”` を書き換え忘れた場合。
  • 現象: 起動 ➔ 「新しいバージョンがある!」 ➔ コピー ➔ 再起動 ➔ また「新しいバージョンがある!」と勘違いして永遠にアップデートを繰り返すホラー現象が起きます。
  • 対策: サーバー側を更新するときは、必ず `version.txt` と `vbs本体のバージョン定数` の両方をセットで書き換える 運用ルールを徹底してください。

まとめ:VBScriptの基本はバッチリです!

今回は、VBScriptを使った「自己更新モジュール」の構築を通して、ファイルシステム操作(FSO)、プロセス制御(WScript.Shell)、そして実運用を見据えたエラーハンドリングの本質を解説しました。

「たかがVBScript」と侮るなかれ。WSHとWindowsの仕組みを正しく理解すれば、専用のインストーラーを作らなくても、驚くほどスマートでメンテナンス性の高い業務自動化基盤をノーコストで構築できてしまいます。

ここをクリアしたあなたなら、どんな現場の自動化要望が来ても柔軟に対応できるはずです。ぜひ、あなたの職場でこの仕組みを試してみてくださいね。応援しています!