Script Interpreter
JScript(javascript) / VBScript のインタープリターを作ってみた。
cscript/wscriptがそれだろ、という声が聞こえてきそうだけど、対話的に実行するアプリケーション、ということ。
対話的に実行といっても、evalするだけだけど。
UIは、HTAにした。(ということで、ただのHTMLなり)
考えるのが面倒だったので。
ソース
<html> <head> <title>script interpreter</title> <style type="text/css"> <!-- .source { width=100%; height=30%; } --> </style> <script type="text/javascript"> <!-- function checkKey() { var src = source.innerText if(event.keyCode == 13 && src.length > 0 && src.charCodeAt(src.length - 1) == 32) { var re = new RegExp("(([ \\t\\f\\v]*[^\\s].*\\r\\n)+) (?!.)", "m"); if(re.test(src)) { source.innerText = src.substr(0, src.length - 1); src = RegExp.$1; if(language.value == "js") { run(src); } else { runVbs(src); } } } } var _auto = true; function run(src) { if(_auto) result.innerText = ""; eval(src); } function setAutoClear(flg) { _auto = flg; } function getAutoClear() { return _auto; } function print(msg) { result.innerText += String.fromCharCode(13, 10) + msg; } //--> </script> <script type="text/vbscript"> <!-- Function runVbs(src) If getAutoClear() Then result.innerText = "" Execute src End Function '--> </script> </head> <body> Source: ( space & enter ) <select id="language"> <option value="js">JavaScript <option value="vbs">VBScript </select> <br> <textarea id="source" class="source" onkeypress="checkKey()"> var fso = new ActiveXObject("Scripting.FileSystemObject"); for(attr in fso) { print(attr); } var f = fso.OpenTextFile(document.URL.substr(7)); print(f.ReadAll()); f = null; fso = null; </textarea><br> <br> Result: ( use print(msg) )<br> <div id="result"></div> </body> </html>
textareaに入力して、最後にスペース&エンターする(ようは半角スペース1個の行を書く)と、実行します。
初期表示は、自身を読み込むスクリプト。
最後の空行から半角スペース1個の行までをevalして、最後の半角スペースを消すので、実行後続けてスクリプトが書けます。
おまけで、VBScriptの実行もつけた。
コンボボックスからVBScriptを選ぶと、VBScriptとして実行します。
スクリプトを書く時に、何気に便利。
varすると、ローカルになるみたいで、グローバルにしたければ、varしなければ良いみたい。
evalの変数スコープがあるのでしょう、多分。
なお、VBScriptの実行は、scriptタグを利用して行っています。
ScriptControlは使ってません。
ScriptControlは32bitでないと呼び出せないので、そこんとこよろしく。
(64bit Powershell/wscript/cscript/InternetExplorerでエラー確認。
32bit Powershell/wscript/cscript/InternetExplorerで動作確認)