VBScript
VBScript(ブイ・ビー・スクリプト)、Microsoft Visual Basic Scripting Edition は、Visual Basic 風の、マイクロソフトによるスクリプト言語である。Microsoft Windows 上や Internet Information Server(IIS)上で動作する。
目次
概要
VBScript は Visual Basic の構文を真似てつくられた、Windows のスクリプト言語であり、Active Scripting のスクリプトエンジンという形態で実装されている。ランタイムとしてASPやWSHがあり、主な用途として、
- Active Server Pages(ASP)などを使用したサーバサイドスクリプティング処理
- Windows Script Host(WSH) を利用したWindows上でのネイティブ・スクリプト
- Internet Explorer を使用したクライアントサイドスクリプティング処理
- HTML Applications(HTA)アプリケーション
が挙げられる。
ただし、WWWクライアントスクリプトとしては、対応するブラウザが Windows 版の Internet Explorer だけであり、2005年時点でもほとんど使われていない。2013年にリリースされたInternet Explorer 11では、セキュリティや互換性の設定によってはVBScriptを実行しなくなった[1]。
HTAやASP、HTML中に組み込まれることが多いが、単体のスクリプトファイルとしておかれる場合、拡張子は通常.vbs
を使用する。
背景
VBScript は1996年8月、WWWのクライアントスクリプト言語として Internet Explorer 3.0 に実装された。当時ネットスケープコミュニケーションズとマイクロソフトは ブラウザ戦争と呼ばれるWebブラウザシェアとWeb標準を巡る技術競争下にあり、1996年3月に Netscape Navigator 2.0 に実装された JavaScript に対抗するものとして、JavaScript 互換のスクリプト言語 JScript と共に実装されたものである。
結果として、WWWのクライアントスクリプト言語としては、VBScript が Windows 版 Internet Explorer でしか動作しなかったことなどから、JavaScript が勝利を収め、この分野での VBScript は使用されなくなった。しかし、1996年12月、Internet Information Server 3.0 に実装された Active Server Pages の標準の言語として VBScript が採用された。ASPは、プログラムコード中にHTMLコードを埋め込む手法ではなく、HTMLコード中にプログラムコードを埋め込む手法をとり、習熟の容易さから成功を収めた。同時に標準の言語として VBScript の地位も確固たるものとなった。
一方、VBScriptはWWWだけでなく、Windows の汎用スクリプト言語として、Windows Script Hostの標準言語として採用された。WSHはバッチファイルを置き換えるものとして位置づけられ、Windows 95 OSR2より標準で装備された。
当時のマイクロソフトは ActiveX 戦略のもと、WWWとクライアント環境のシームレスな統合を目指したが、その中核スクリプト言語としてWSH、ひいては VBScript を位置づけた。そのため、VBScript は ActiveX オートメーションサーバを取り扱うことに長け、全ての操作はオートメーションサーバよりオブジェクトを生成し、それを介して行うという統一された様式である。これは、言語自身が環境に依存しないメリットももたらすが、反面、単純なファイルの複製でさえオブジェクトを生成し操作する手続きが必要という煩雑さももたらした。この煩雑さはバッチファイルからの脱却を阻むものとなった。
また、ActiveX 戦略自体、相重なるセキュリティ問題を引き起こし、WSH上の VBScript を利用したウイルスの出現などもあったことからセキュリティ面から敬遠される向きもあった。
簡単な処理も煩雑な記述になってしまう点、セキュリティ面のダーティなイメージから、VBScript は圧倒的なシェアをもつオペレーティングシステムの標準のスクリプト言語にしてはあまり普及せず、Windows の汎用スクリプト言語としての VBScript は、一定の評価はできるものの大成功したとは言えない。
マイクロソフトは2000年代初頭から ActiveX に変わる戦略として、.NET戦略を打ち立てており、ASPも2002年にリリースされたASP.NETに置き換えられ、その記述言語も C# や Visual Basic .NET 等となった。また、オペレーティングシステムの汎用スクリプト環境についてもWSHから Windows PowerShell へ移行すると言う。
2006年現在の展望では、PHPに代表されるオープンソースのサーバ側スクリプト言語が徐々にIIS上でも安定した動作が期待できるようになってきており、サーバ側スクリプト言語としてのVBScript も一部の根強い人気を除けばほぼその役割を終え、緩やかに衰退していくものと思われる。
主な特徴
VBScript は、OLEサーバの接着剤としてのスクリプト言語という理念のもとに設計された。Windows の汎用スクリプト言語と説明したが、Windows が .NET 戦略への転換を迎えた現在では、むしろOLE(ActiveX)用のスクリプト言語といった方が正しい。
OLE設計が徹底されており、VBScriptは言語自身にはファイル入出力さえサポートしない。
また、動的型付けを採用している点も Visual Basic から派生した言語としては異色である。
動的型付け
VBScript は多くのスクリプト言語同様、動的型付け言語であるため、変数に型はない。
VBScript のデータ型には、Empty
値、Null
値、ブール型、バイト型、整数型、通貨型、日付型、文字列型、オブジェクト型、エラー型などがあるが、これら型情報はデータ側が持ち、変数自体に型はない。(または 変数はバリアント型のみだとも言われる)。
VBScript は変数宣言または明示的な変数生成ステートメントを必須としない。はじめて使われるシンボルは変数として自動的に生成される。しかし、代入だけでなく、参照でも変数を生成してしまうため、入力間違いによる不具合を誘発しやすい。
そのため、変数宣言を強要する Option Explicit
ステートメントをファイル先頭で宣言するのが良いコーディングスタイルと言われる。明示的に変数を生成するには Dim
、Private
、Public
、ReDim
などの各ステートメントを用いる。
OLEクライアント機能
OLEオブジェクトを利用するには CreateObject
関数を使用する。CreateObject
はActiveX オートメーションサーバからオートメーションオブジェクトを生成し、その参照を返す。
Dim oFileSystem
Set oFileSystem = CreateObject("Scripting.FileSystemObject")
oFileSystem.MoveFile "C:\2012年6月.xls" "C:\過去実績\2012年6月.xls"
以下は Microsoft Excel のシートオブジェクトを生成するサンプルである。
Dim oExcelSheet
Set oExcelSheet = CreateObject("Excel.Sheet")
oExcelSheet.Application.Visible = True
oExcelSheet.ActiveSheet.Cells(1,1).Value = "売上"
Set oExcelSheet = Nothing
OLEサーバとなっているアプリケーションを使ったスクリプトを VBScript は簡単に記述できる。VBScript が備えていないような機能でも、OLEサーバアプリケーションを作成すれば行うことが出来る。
オブジェクト指向機能
VBScript はクラスベースのオブジェクト指向言語であり、Class
ステートメントによりクラスオブジェクトを生成することが出来る。
VBScript のクラスオブジェクトは以下のような特徴がある。
- 継承は出来ない
- アクセス制御は出来る
Initialize
イベント、Terminate
イベントを設定出来る。
以下に VBScript のクラスのサンプルコードを示す。
Class CPoint
' プロパティ
Private m_x
Private m_y
' メソッド
Private Sub Class_Initialize ' Initialize
m_x = 0
m_y = 0
End Sub
Private Sub Class_Terminate ' Terminate
MsgBox("terminated!")
End Sub
Public Function GetX()
GetX = m_x
End Function
Public Function GetY()
GetY = m_y
End Function
Public Sub SetPoint(x, y)
m_x = x
m_y = y
End Sub
End Class
Dim obj
Set obj = New CPoint
MsgBox(obj.GetX) '0 と表示
obj.SetPoint 32, 64
MsgBox(obj.GetX) '32 と表示
Set obj = Nothing 'terminated! と表示
継承は出来ないものの、動的型付けであるため、多態は可能である。カプセル化も出来る。幾分制約が強いが、必要最低限のオブジェクト指向機能は備える。
他言語との比較
Visual Basic、Visual Basic for Applications との比較
VBScriptは Visual Basic によく似た構文を持ち相互に習得しやすいが、
- 動的型付け
- 多くの組み込み関数や手続きがない
- モジュールがない
のように、Visual Basic や Visual Basic for Applications との相違点は大きいため互換性が低く、そのままでは使用できない場合も多い。
JScriptとの比較
標準でASP、WSHをホストとして動く言語には、VBScript の他に、JScript がある。JScript はマイクロソフト社による ECMAScript(いわゆるJavaScript)の実装である。同じランタイムを利用するため、機能的には似通っているが、言語の設計思想は大きく異なる。
主な相違として、
- 組み込みGUI関数
MsgBox
、InputBox
の有無。 - プロトタイプベース・オブジェクト指向言語とクラスベース・オブジェクト指向言語
が挙げられる。
特に MsgBox
や InputBox
が揃うことで、GUIでありながらCUIなみの手軽さで入出力を備えたUIを構築できる意義は大きい。この点で VBScript は優れる。
なお、JScript において MsgBox
は WScript.Echo
で代替出来る。InputBox
相当の物は存在しないため、VBScript の InputBox
関数を呼び出す。
一方、プログラミング言語としての機能は JScript の方が大きく優れる。JScript は無名関数や静的スコープのクロージャなど強力な機構を備える。
VBScriptとセキュリティ
近年のコンピュータウイルスにはWSHと VBScript を組み合わせて感染する型が多発しており、VBScript のOLEクライアント機能の強力さがユーザにとっては諸刃の剣となっている。
コード例
以下のコードを適当なファイル(例えば、time.vbs
)に保存し、ダブルクリックすると、現在の時刻を表示する。
MsgBox "現在の時刻は、" & Time & " です。"
また、HTML に埋め込む場合は、以下のように表記する。
<html>
<head>
<script language="VBScript">
Function GetTime()
MsgBox "現在の時刻は、" & Time & "です。"
End Function
</script>
</head>
<body>
……
</body>
</html>