4.01.2012

Re-launch VBScript with Cscript

VBScript: Cscript で自動的に開き直す

VBScript のスクリプトエンジンが Wscript の場合、自動的に Cscript で開き直す例。

これのような処理を最初に行うことで、わざわざデフォルトのスクリプトエンジンを変えたり
コマンドラインで Cscript を立ち上げたりすることなく、スクリプトエンジンを限定させることができる。

ただし、終了直前に入力待ちの状態(MsgBox() または WScript.StdIn.Read() など)
にしないとコンソールが終了し、内容を確認できなくなるので注意。

If WScript.FullName <> WScript.Path & "\cscript.exe" Then
  Dim args, i, shell
  args = """" & WScript.ScriptFullName & """"
  For Each i In WScript.Arguments: args = args & " """ & i & """": Next
  Set shell = CreateObject("WScript.Shell")
  shell.Run WScript.Path & "\cscript.exe //NOLOGO " & args, 1, False
  WScript.Quit
End If

For i = 1 To 10
  WScript.StdOut.Write "."
  WScript.Sleep 100
Next
WScript.Echo

MsgBox "Click OK to exit."

'WScript.Echo "Press ENTER key to exit . . ."
'WScript.StdIn.Read(1)

WScript.Arguments を継承しているのがポイント。
WScript.FullName でエンジンのフルパスを判定するのが一般的だが、たしか別の方法もあったと思う。

2012/04/04 追記

Windows XP / Windows Server 2003 では Microsoft.CmdLib オブジェクトを使う方法もあった。
詳細は %SystemRoot%\system32\cmdlib.wsc に記述されており、他にも便利な関数がいくつかある。
また、「eventquery.vbs」はこのオブジェクトを利用した処理を行なっている。

If CInt(CreateObject("Microsoft.CmdLib").checkScript()) <> 2 Then
  ' Do something ...
End If

checkScript() の戻り値は、エンジンが cscript なら "2" が、それ以外(wscript)なら "0" が
いずれも「文字列」として返される。
そのため文字列で比較するか、上記のように CInt が必要となる。

これほど素晴らしいスクリプトにもかかわらず、何故か Vista 以降では(スクリプトを手動で移植しない限りは)
使うことができない。「cmdlib.wsc」自体が採用されていないためだ。

残念ながら、ベストプラクティスには程遠いだろう。

参考:
Microsoft.CmdLib を活用して表を作る (Hey, Scripting Guy!)
http://lab.technet.microsoft.com/en-us/magazine/cc510336
http://lab.technet.microsoft.com/ja-jp/magazine/cc510336

0 件のコメント:

コメントを投稿