2014年1月29日

WSH/JScriptをECMAScript標準にするWSHModuleを作りました


WSH/JScript を ECMAScript-262 5th に可能な限り近づける WSHModule というのを作りました。

WSHModule はWSH/JScriptで構築されたJavaScriptのVMです。
可能な限りECMAScript5標準としてJavaScriptを実行します。 スクリプトは、モジュール空間 (Node.js 互換 *1) で実行されます。
WSHModuleは、ECMA-262標準に近づけるためのwscript.exeのアップグレード版として利用することも可能(かもしれません)。
用途によっては、Node.jsを使用したほうが手っ取り早いです。が、JScriptは、Windowsにバンドルされています。 WSHModuleはwscript.exeで実行されるように、UI向けです。 Windowsで拡張子 .js のバッチスクリプトを実行するときに、WSHModule.exe を通すことで、快適な環境になると思います。

*1: Node.js自体がCommonJSの仕様のうち「Module 1.0」と「Unit Testing 1.0」には一応準拠してるだけなので、CommonJS準拠とは言えません

機能

  • ECMAScript5標準の構文をサポート
  • モジュール空間
  • UTF-8で書ける
  • alert, confirm, prompt, setTimeout, clearTimeout, setInterval, clearIntervalが使える
  • (JScript Bug) catchなしのtry-finallyが書ける
  • (JScript Bug) String.prototype.substr, Array.prototype.indexOf, Array.prototype.splice などを ECMA-262標準に修正
  • WSHModule.exe ダブルクリックでシェル画面が開く
  • いくつかのWScriptで扱えない機能をモジュールとして追加(clip, console, fs, util 等)

ダウンロード

要件

以下の環境で動作します
  • Windows (32bit/64bit)
WSHModuleは、環境変数(PATHなど)を登録しないので、必要あれば任意に追加してください。

実行方法

WSHModule.exe "C:/path/to/myscript.js"
もしくは、 "C:/path/to/myscript.js" を WSHModule.exe にドラッグドロップ

簡単な方法:
  1. WSHModule.exe のショートカットをデスクトップ等に作成
  2. 任意のスクリプト(.js)をショットカットにドラッグドロップして実行

テスト

以下の手順で簡単なテストスクリプトが実行できます。
  1. cd WSHModule
  2. "bin/WSHModule.exe" "scripts/test.js"

ToDo

いろいろと大げさなこと言ってますが以下の項目が未実装です
  • Getter と Setter がない
  • "use strict" が使えない

サンプルコード

Hello World:
alert(' hello   world  !'.split(/\s+/).filter(function(s) {
  return s;
}).map(function(s) {
  return s.charAt(0).toUpperCase() + s.slice(1);
}).join(' ')); // 'Hello World !'

クリップボードを扱う例:
// src/clip.js参照
var clip = require('clip');
var curClip = clip.getAsText();
alert('現在のクリップボード「' + curClip + '」');
clip.setAsText('test');
alert('クリップボードに「test」を設定しました');

ファイルを扱う例:
// fs は Node.js/fs とだいたい同じ仕様になってます(扱えるのはSyncのみ)
// http://nodejs.org/api/fs.html
// http://nodejs.jp/nodejs.org_ja/docs/v0.10/api/fs.html

var fs = require('fs');
console.log(fs.readFileSync(__filename), 'このファイルの中身');


なにかあれば以下のレポジトリのIssues, または @polygon_planet へお願いします。

レポジトリ