id:eel3:20120227:1330345751 でWSHのJScriptでワンライナーできるようになった以上、VBScriptでも実現しておかないと夜道が怖いので*1。
Option Explicit If WScript.Arguments.length <> 1 Then WScript.StdErr.WriteLine "usage: cscript " & WScript.ScriptName & " ""evaluate script""" WScript.Quit 1 End If Execute WScript.Arguments(0) WScript.Quit 0
VBScriptではExecuteステートメントを使う。というかこんなステートメントもあったんだ……。
Executeでエラーが発生した時の挙動がイマイチなのだけど、On Error Resume Nextを使って自前でエラーをハンドリングしようとしたら構文エラーが捕捉出来なかったので、諦めて自動的に中断されるがままにしてある。Executeで構文エラーが発生した時は実行時エラー扱いして欲しかった。
残念なことにWScript.Argumentsの仕様による制限でダブルクォートを含む文字列を引数としてうまく渡すことができないので、文字列リテラルは事実上使えない。文字列リテラルが不要ならワンライナーできる。
D:\temp>cscript vbscript_oneliner.vbs //Nologo "WScript.Echo 6 * 4" 24 D:\temp>cscript vbscript_oneliner.vbs //Nologo "For i = 0 To 2 : WScript.Echo i : Next" 0 1 2 D:\temp>cscript vbscript_oneliner.vbs //Nologo "For Each i In Array(3, 5, 4) : WScript.Echo i : Next" 3 5 4 D:\temp>
Option Explicitは適用されないらしい。
これまたバッチファイルでラッピング。
@echo off cscript.exe "%~dp0vbscript_oneliner.vbs" //Nologo %*
D:\temp>vbscriptol.bat "WScript.Echo 6 * 4" 24 D:\temp>
ほぼ確実に需要は無いだろうし、仮にあったとしても文字列リテラルを使ないので、このスクリプトは使い道が無い。
*1:単なる被害妄想。