VBScript: Cscript で自動的に開き直す
VBScript のスクリプトエンジンが Wscript の場合、自動的に Cscript で開き直す例。
これのような処理を最初に行うことで、わざわざデフォルトのスクリプトエンジンを変えたり
コマンドラインで Cscript を立ち上げたりすることなく、スクリプトエンジンを限定させることができる。
ただし、終了直前に入力待ちの状態(MsgBox() または WScript.StdIn.Read() など)
にしないとコンソールが終了し、内容を確認できなくなるので注意。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | 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」はこのオブジェクトを利用した処理を行なっている。
1 2 3 | 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 件のコメント:
コメントを投稿