【VBScript】VirtualBox向け仮想マシンの一括起動スクリプト


この記事はプロモーションを含みます。

VBScript

ホーム > VBScript 逆引きリファレンス

VirtualBox上の仮想マシンを一括で起動するスクリプトを作成しましたのでご紹介したいと思います。

はじめに・仕様

Windows端末にログインしたタイミングで、VirtualBox上に構築している特定の仮想マシンを起動したかったので、スクリプトを作成してみました。
スクリプト自体は、仮想マシンを起動する処理のみが実装されており、ログイン時のスクリプトの実行はタスクスケジューラを使って実現しています。
本記事では、スクリプトの紹介のみを行いますので、タスクスケジューラからスクリプトを呼び出す方法については以下を参考にして下さい。

次に、本スクリプトの仕様ですが、以下のようになっております。

  • 定義ファイルに記述した仮想マシンを起動
  • ログを出力する
  • 起動時の待ち合わせ時間を指定可能
  • 仮想マシンの起動方式はヘッドレスのみ対応

ソースコード

ここでは、スクリプトのソースコードと定義ファイルについて簡単に説明したいと思います。

まずは、ソースコードから見ていきます。

Option Explicit

' 起動対象仮想マシンリスト
Const VM_LIST = "VBoxAutoStart.conf"
' 起動処理待ち合わせ時間(秒)
Const INTERVAL = 300
' ログの出力先
Const LOG_PATH = "C:\workspace\VBScript"
' ログのファイル名
Const LOG_NAME = "VBoxAutoStart.log"
' VirtualBoxインストールパス
Const VB_PATH = "C:\Program Files\Oracle\VirtualBox"

' 起動対象の仮想マシン
Dim vmList()
' 仮想マシンの起動情報
Dim vmStatus()
' 起動中の仮想マシン
Dim vmRunning()

' ファイルシステムオブジェクトの作成
Dim fso
Set fso = CreateObject("Scripting.FileSystemObject")

' 関数の読み込み
Execute fso.OpenTextFile("function.vbs").ReadAll()

' ファイルシステムオブジェクトの破棄
Set fso = Nothing

Call WriteLog("仮想マシンの起動スクリプトの開始。", LOG_INFO)

' 起動対象の仮想マシンを取得
Call GetVMList()

' 仮想マシン起動状態の取得
Call GetVMStatus()

' 起動中の仮想マシン名の取得
Call GetVMRunning()

' 仮想マシンの起動
Call StartVM()

Call WriteLog("仮想マシンの起動スクリプトの終了。", LOG_INFO)

WScript.Quit

' 起動対象仮想マシンの取得関数
Function GetVMList()

	' 起動対象の仮想マシンの定義ファイル読み込み行
	Dim line

	' 起動対象の仮想マシンの定義ファイル読み込み行数
	Dim lineNum
	lineNum = 0

	' ファイルシステムオブジェクトの作成
	Dim fso
	Set fso = CreateObject("Scripting.FileSystemObject")

	' ファイルを読み取り専用で読み込み
	Dim stream
	Set stream  = fso.OpenTextFile(VM_LIST, 1)

	' 1行ずつファイルを読み込む
	Do Until stream.AtEndOfStream
		line = stream.ReadLine
		Call WriteLog("起動対象仮想マシン名:" & line, LOG_INFO)
		lineNum = lineNum + 1
		ReDim Preserve vmList(lineNum - 1)
		vmList(lineNum - 1) = line
	Loop

	' テキストファイルを閉じる
	stream.Close
	Set stream = Nothing

	' ファイルシステムオブジェクトの破棄
	Set fso = Nothing

End Function

' 仮想マシンの起動状態確認
Function GetVMStatus()

	' WSH関連オブジェクト
	Dim objShell, objExec

	' 起動状態読み込み行
	Dim line

	' 起動状態読み込み行数
	Dim lineNum
	lineNum = 0

	' コマンドの作成
	Dim cmd
	cmd = """" & VB_PATH & "\VBoxManage"" list runningvms"
	Call WriteLog("実行コマンド:" & cmd, LOG_INFO)

	' WSHオブジェクトの作成
	Set objShell = CreateObject("WScript.Shell")

	' Windowsコマンドの実行
	Set objExec = objShell.Exec("cmd /c " & cmd)

	' 実行結果の確認
	Do Until objExec.StdOut.AtEndOfStream
		line = objExec.StdOut.ReadLine
		lineNum = lineNum + 1
		ReDim Preserve vmStatus(lineNum - 1)
		vmStatus(lineNum - 1) = line
	Loop

	' WSH関連オブジェクトの破棄
	Set objExec = Nothing
	Set objShell = Nothing

End Function

' 起動中の仮想マシン名の取得
Function GetVMRunning()

	' 仮想マシンの起動情報
	Dim buf
	' 仮想マシン名
	Dim vmName
	' 配列処理行
	Dim lineNum
	lineNum = 0

	For Each buf In vmStatus
		vmName = Split(buf, """ ")
		lineNum = lineNum + 1
		ReDim Preserve vmRunning(lineNum - 1)
		vmRunning(lineNum - 1) = Right(vmName(0), Len(vmName(0)) - 1)
	Next

End Function

' 起動していない仮想マシンの起動
Function StartVM()

	' 起動対象の仮想マシン
	Dim target
	' 起動中の仮想マシン
	Dim running
	' 仮想マシンの起動フラグ
	Dim isStart
	' WSHオブジェクト
	Dim objShell

	' WSHオブジェクトの作成
	Set objShell = CreateObject("WScript.Shell")

	For Each target In vmList
		isStart = False
		For Each running In vmRunning
			' 起動対象の仮想マシンが既に起動している場合は処理をしない
			If(target = running)Then
				Call WriteLog("仮想マシン【" & target & "】は起動済みです。", LOG_INFO)
				isStart = True
				Exit For
			End If
		Next

		' 仮想マシンが停止している場合は起動する
		If Not(isStart)Then
			Call WriteLog("仮想マシン【" & target & "】の起動開始。", LOG_INFO)

			' コマンドの作成
			Dim cmd
			cmd = """" & VB_PATH & "\VBoxManage"" startvm " & target & " --type headless"
			Call WriteLog("実行コマンド:" & cmd, LOG_INFO)
			' Windowsコマンドの実行
			Call objShell.Exec("cmd /c " & cmd)
			WScript.Sleep(INTERVAL * 1000)
			Call WriteLog("仮想マシン【" & target & "】の起動終了。", LOG_INFO)
		End If
	Next

	' WSH関連オブジェクトの破棄
	Set objShell = Nothing

End Function

本スクリプトを実行する環境に合わせて、以下を修正して頂ければと思います。

まずは、6行目に記述している仮想マシンの起動処理の待ち合わせ時間です。
ここでは、複数台の仮想マシンを起動する場合の待ち合わせ時間を設定します。
待ち合わせ時間が無い場合、スクリプトを実行したタイミングで、一気に仮想マシンが起動され、ホストマシンに負荷が掛かるので、これを回避するために設定しています。
デフォルトでは、300秒(5分)を設定していますが、環境に合わせて変更して下さい。
仮想マシンの起動が遅い環境であれば、値を大きくし、起動が速い場合は、値を小さくします。

次に、8行目のログ出力先についてです。
サンプルでは、「C:\workspace\VBScript」としていますが、ここはお好きなフォルダを設定して頂ければと思います。
設定したフォルダが存在しない場合は、スクリプトがエラーとなるので注意して下さい。

また、ログの出力処理は、外部部品として実装しています。
下記を参考に、スクリプト名を「function.vbs」として作成して下さい。

その他、ログに出力する情報やエラーハンドリングですが、最低限しか実装していませんので、各自追加して頂ければと思います。
スクリプトで使用している機能については、本記事の終わりに「実装時に使用した機能について」という項目でまとめているので、カスタマイズする際などは、そちらを参考にして下さい。

次に、起動する仮想マシンを記述する定義ファイルの例です。
仮想マシンの名前を1行に1つ記述します。

ゲストマシン1
ゲストマシン2

実行ログの出力例

実行ログの出力例です。

[2023/03/19 7:23:04][INFO]仮想マシンの起動スクリプトの開始。
[2023/03/19 7:23:04][INFO]起動対象仮想マシン名:ゲストマシン1
[2023/03/19 7:23:04][INFO]起動対象仮想マシン名:ゲストマシン2
[2023/03/19 7:23:04][INFO]実行コマンド:"C:\Program Files\Oracle\VirtualBox\VBoxManage" list runningvms
[2023/03/19 7:23:04][INFO]仮想マシン【ゲストマシン1】の起動開始。
[2023/03/19 7:23:04][INFO]実行コマンド:"C:\Program Files\Oracle\VirtualBox\VBoxManage" startvm ゲストマシン1 --type headless
[2023/03/19 7:23:34][INFO]仮想マシン【ゲストマシン1】の起動終了。
[2023/03/19 7:23:34][INFO]仮想マシン【ゲストマシン2】の起動開始。
[2023/03/19 7:23:34][INFO]実行コマンド:"C:\Program Files\Oracle\VirtualBox\VBoxManage" startvm ゲストマシン2 --type headless
[2023/03/19 7:24:04][INFO]仮想マシン【ゲストマシン2】の起動終了。
[2023/03/19 7:24:04][INFO]仮想マシンの起動スクリプトの終了。

実装時に使用した機能について

本スクリプトを作成するにあたり、使用した機能をまとめてみました。

【VBScript】定数の宣言と用意された定数の一覧
VBScriptにて、定数を宣言する方法について解説しています。 また、事前に用意された定数の一覧も合わせて記載しています。
【VBScript】Functionプロシージャでオリジナル関数を作成する
VBScriptでは、Functionプロシージャを使用することで、オリジナルの関数を作成することが可能です。 ここでは、Windows向けのパス([\]区切り)をLinux向けのパス([/]区切り)に変換する例を挙げつつ関数の作成方法について解説したいと思います。
【VBScript】共通関数モジュールの作り方・部品化
以前、別のVBScriptファイルを呼び出す方法をご紹介しましたが、今回は、共通的に使用出来る関数を部品化して、その部品に記述された関数を呼び出す方法をご紹介したいと思います。
【VBScript】(無限)ループ・繰り返し処理[Do Until-Loop文]の使い方
VBScriptにおける「Do Until – Loop」文の使い方を解説します。
【VBScript】ファイルを1行ずつ読み込む
VBScriptでは「FileSystemObject」を使用することで様々なファイル操作を行えます。 今回は、ファイルの内容を1行ずつ読み込む方法を解説します。
【VBScript】配列の大きさを動的に変更しつつ代入する方法
VBScriptで、配列の大きさを動的に変更しつつ、値を代入する方法を解説します。
【VBScript】Windowsコマンドの実行と実行結果の取得
VBScriptで、Windows(コマンドプロンプト)のコマンドを実行し、その実行結果を取得する方法を解説します。

コメント

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