WSH JScript Chakra を使用した ES2015(ES6) 対応 ( スクリプトエンジン まとめ )
はじめに
WSH JScript (wscript cscript) で使用できる スクリプトエンジン まとめです。
JavaScript限定、プリインストールされている物だけなので注意。
ツールとして独立しているChakraCoreや、その他サードパーティーは含みません。
各 JavaScript エンジン について
JScript (JavaScript) だけでも、4種類ほどスクリプトエンジンがあるようです。
以下、それぞれバッチファイルから cscript で実行する際のサンプルコマンドです。
JScript
JScript を使用する際、一般的に指定されるスクリプトエンジンです。
バージョンは、環境によって異なりますが、
現時点のOSサポートを考慮すれば、5.7 か 5.8 でしょう。
rem jscript.dll %windir%\System32\cscript.exe /nologo /E:JScript "%~f0" %*
JScript.Compact
JScript Compact Profile (ECMA 327) で実行する、スクリプトエンジンです。
MSの情報が少ないので、詳細は未確認ですが
簡単に説明すれば、「いくつかの機能を制限して、パフォーマンス向上を図る設定を使用する」と言った感じでしょうか。
機能の制限について、少なくとも with ステートは、サポートされていないようです。
rem JScript Compact Profile (ECMA 327) %windir%\System32\cscript.exe /nologo /E:JScript.Compact "%~f0" %*
JScript9
IE9 から使用されている、JScript9.dll をスクリプトエンジンとして指定できます。
ProgID が公開されていないので、CLSID を指定する必要があります。
ちなみに、JScript9 の 9 は、エンジンバージョンと言うわけでは無い様で、
Windows10 では、バージョン 11.0 として扱われていました。(中身は、Chakra っぽい?)
JScript と同程度の機能しか使えませんが、JScript9.dll の方が高速に動作します。
ただし、JScript 互換は完全ではなく WScript.Quit が使用できません。
rem jscript9.dll %windir%\System32\cscript.exe /nologo /E:{16d51579-a30b-4c8b-a276-0ff4dc41e755} "%~f0" %*
Chakra
Microsoft Edge の JavaScriptエンジン です。
こちらも、ProgID が公開されていないので、CLSID を指定する必要があります。
Chakra を使用する場合は、ES2015(ES6) に対応
している為、クラスなどが使用できます。
ただし、JScript9 と同様に、WScript.Quit に加え GetObject、VBArray 等が、使用できません。
rem chakra.dll %windir%\System32\cscript.exe /nologo /E:{1B7CD997-E5FF-4932-A7A6-2A9E636DA385} "%~f0" %*
Chakraを使用したスクリプト を バッチに埋め込む場合
JScript9までは、@if を使用してバッチファイルにJScriptを埋め込むことが出来ましたが、
Chakra は、IE由来の条件付きコンパイルをサポートしていないため、@if を解釈できません。
JScript でハマる日々 - m2
@if(0==0) /* @rem 指定できるエンジンは、JScript9 まで。Chakra 不可 @%windir%\System32\cscript.exe /nologo /E:JScript "%~f0" %*||pause @exit /b %errorlevel%&*/@end
JScript共通の埋め込み
Chakra 以外のエンジンを共存させる場合は、
@if を使用しないshebangモドキがあるので、そちらを使います。
ildar-shaimordanov/hello.jscript.bat
0</* :: @%windir%\System32\cscript.exe /nologo /E:{1B7CD997-E5FF-4932-A7A6-2A9E636DA385} "%~f0" %*||pause @exit /b %errorlevel%&*/0;
Chakra限定の埋め込み
Chakra のみ使う場合は、
Chakra が「<!--」をコメント扱いすることを利用した方法があります。
https://qiita.com/snipsnipsnip/items/50e4ca88e3ce3f8cffda
<!-- : ^ /* @%windir%\System32\cscript.exe /nologo /E:{1B7CD997-E5FF-4932-A7A6-2A9E636DA385} "%~f0" %*||pause @exit /b %errorlevel%&*/
JScript9 や Chakra で、戻り値を返したい場合(2022/05/28 更新)
WScript.Quit は、例外を握りつぶすと使えます。
.bat
にコピペで、動作確認できます。
0</* :: @%windir%\System32\cscript.exe /nologo /E:{1B7CD997-E5FF-4932-A7A6-2A9E636DA385} "%~f0" %* @echo 戻り値は、%errorlevel%です。&pause @exit /b %errorlevel%&*/0; // エントリ let global_result=(()=>{ // ポップアップを表示 // ActiveXObject は未定義なので、CreateObject を使う const shell = WSH.CreateObject("WScript.Shell"); shell.popup(`${WSH} for Chakra`); return 123; })(); try {WScript.Quit(global_result); }catch(e){// JavaScript runtime error: Object doesn't support this action }
補足
一応触れておくとChakraCore
を利用する場合、
WScript.Quit は定義済みで普通に呼び出せるので、このような悩みとは無縁です。
https://github.com/microsoft/ChakraCore/blob/bd91335361ddd215622d810cc7341a180abd2db4/bin/ch/WScriptJsrt.cpp#L1090
おわりに
WSH ってだけで、今更感満載のレガシーなのですが、
初期状態のWindowsで使用できる手軽さで、根強く?使われている様子。
今回のまとめは、WSH JScript で、クライアントの環境に依存せずに
ES2015 ベースのコードを使えないか調査したときの副産物です。
結果的に、ES2015 対応は行っていませんが、
TypeScript 経由で、対応できそうかなと言ったところでオチ。
参考リンク
- リファレンス
- JScript.Compact
- ECMAScript - Wikipedia
ECMA 327 について簡単な説明 - 'with' not available in the ECMA 327 Compact Profile Microsoft Docs
with が使用できない点について、MSのリファレンス
- ECMAScript - Wikipedia
- Chakra
- Chakra - Wikipedia
JScript9.dll を含めた簡単な概要
- Chakra - Wikipedia