以前、こんなのがありました。
WSH/JScriptをバッチとして実行する(何を言ってるのかわからない - Qiita
https://qiita.com/itasnasal/items/70b042f1fe96ef106c12
この時気に入らない点として
・ゴミが1行表示される。
・起動パラメータがエレガントに扱えない。
とあるが、それ以前に「別バッチを一つ用意する」というのがそもそも気に入らない。
特段の前準備とか無しで、起動するバッチファイル一個ですべてが解決できるようにしたい。
けど、そのままずっと忘れたままだった。
で、最近
WSH JScript Chakra エンジンの共存による機能制限の回避(WScript Quit 代替) - イネマルのプログラミング備忘録
https://inemaru.hatenablog.com/entry/2020/08/11/020312
これを見ていると、「WSH/JScriptをバッチとして実行する」のに、JScriptの条件コンパイルを利用していた。
JScriptの条件コンパイルという機能は、自分は「あるのはおぼろげに知っていたけど、詳細は全く知らない」状態だった。この機会にちょっと勉強してみた。
へー。こんな機能があったんだ。
32ビット/64ビットのチェックと切り替えに使えるな。今は SysWOW64 の有無で簡易チェックしてるけど、きちんとしたチェックができる。
それよりだ。
@set ステートメント
条件コンパイル ステートメントで使用する変数を作成します。
@set @varname = term
これわっ。
@set @hogehoge=0 /*
と書けば、
JScriptでは条件コンパイル用変数設定+コメントの開始
バッチでは環境変数「@hogehoge」に「0 /*」を設定
となるじゃないですか。試してみたが大丈夫だ。
というわけで hello.bat を改良して hello2.bat にしてみた。
@set @x=0 /*
@set @x=
@cscript //nologo //E:JScript "%~f0" %*
@exit /B
*/ // ↑でバッチ自体は終了するので、ここからはバッチからは無視される。
// ↓JScript コードを記述する
var WshShell = new ActiveXObject("WScript.Shell");
WshShell.Popup( "hello, world" );
ゴミ表示は出ないし、起動パラメータも普通に扱える。
おまけに「別バッチを一つ用意する」必要もない。
完璧じゃん。今のところ、特に不都合は見つかってない。
早速、現在検討中の案件で使ってみよう。