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