VBSでミリ秒を取得!

見出しでは「VBSでミリ秒を取得」としてますが、
特にこのことを取り上げたい訳ではありません(笑)
結果的にVBSでミリ秒が取得できますといった感じです。
たまたま面白いコンポーネントを知って、これは便利かも〜と思いました。

ScriptControl


ScriptControlを使うと、VBScript内で他言語を実行出来ます。
ネットを斜め読みすると、JavaScriptやRubyScriptが使えるみたい。
よって、ミリ秒を取得するというのはVBScript内でJavaScriptを使用することにより可能になります。

ミリ秒取得サンプル
'getMilliseconds.vbs
Option Explicit

MsgBox getMilliseconds

Function getMilliseconds()
	Dim objJS
	Set objJS = CreateObject("ScriptControl")
	With objJS
		.Language = "Jscript"
		.AddCode ("function getMilliseconds(){d = new Date(); return d.getMilliseconds();}")
		getMilliseconds = .CodeObject.getMilliseconds()
	End With
	Set objJS = Nothing
End Function


AddCodeメソッドでJavaScriptのユーザー定義関数を入れて、CodeObjectから実行します。
ScriptControlオブジェクトからRun("ユーザー定義関数名")でもいけます。


ネットでよく見かけるURLエンコードスクリプトですが、
組み込み関数ならAddCodeでコードを入力しなくてもそのまま実行出来ます。

URLエンコードサンプル
Option Explicit

MsgBox encodeURIComponent(InputBox("マルチバイト文字を入力。"))

Function encodeURIComponent(enc_str)
	Dim objJS
	Set objJS = CreateObject("ScriptControl")
	With objJS
		.Language = "Jscript"
		encodeURIComponent = .CodeObject.encodeURIComponent(enc_str)
	End With
	Set objJS = Nothing
End Function


VBScriptに無くてJavaScriptにある関数が使えるのは良いですね。
使い方によって、かなり便利になりそう。


追記


追記している2017年現在、64Bit OSが主流になっています。しかし64Bit OSではScriptControlは使用出来ません。今後採用される予定もないようです。


しかし以下の方法で代用が出来ます。

htmlfileオブジェクト


htmlfileオブジェクトでHTMLDocumentを作成して、そこでJavaScriptを実行させるというものです。こんな感じです。

'getMilliseconds.vbs
Option Explicit

MsgBox getMilliseconds()

Function getMilliseconds()
	Dim d, e
	Set d = CreateObject("htmlfile")
	Set e = d.createElement("body")
	e.setAttribute "id", "rs"
	d.appendChild e
	d.parentWindow.execScript "d = new Date(); document.getElementById('rs').innerText = d.getMilliseconds();", "JScript"
	getMilliseconds = CLng(e.innerText)
	Set e = Nothing
	Set d = Nothing
End Function


あれこれ処理して得られた結果をタグに書き出して、そのタグのインナーテキストを返すといった感じですね。今回数値を返す関数ですが、そのままでは文字列としての数値が返ってしまうと思うので、一応CLngで変換してます。


ScriptControlの存在を忘れていて、このページへのアクセスログで久しぶりに本記事を見てそんな方法もあったなぁと思い出しました。試しに実行してみたところ現在のWindows 10 64Bitでは動かず追記に至りました。


活用できる場面があれば使いたいと思います。



Windows自動処理のためのWSHプログラミングガイド

Windows自動処理のためのWSHプログラミングガイド