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 件のコメント:
コメントを投稿