WSH(JScript)でコードを書いてみる
WSHでコードを書くための基礎知識とサンプルの実行例です。
Hello World
お決まりの実行テストです。(Windows環境であれば、特別な環境構築は不要です)
- 下記のコードをテキストファイルにjse拡張子で保存する(js拡張子でも可)
- 作成したファイルをダブルクリックして実行する
- 参考画像のダイアログが出現すれば成功です
HelloWorld.jseWScript.Echo('Hello World.');
動作しない場合
ファイルをUTF-8BOMありで保存した場合、「文字がただしくありません。」エラーを発生させて動作を停止します。ファイル先頭のBOMを解釈できず動作しません。
ファイルをUTF-8BOMなしで保存して、コード内に全角文字を含む場合、「終了していない文字列型の定数です。」エラーを発生させて動作を停止する可能性があります。WSHでは、日本語環境Windows標準のShift_JIS
で文字列を解釈するため、UTF-8の全角文字を解釈できず動作しない可能性があります。
※Windows10でメモ帳アプリの標準文字コードがUTF-8BOMなし
に変更されました。Shift_JIS
は既にWindows標準ではありません。ですが、WSHのcscript/wscriptのアプリは以前のWindows環境を元に作成されており、また今後のバージョンアップは絶望的であるため、日本語環境WSHの標準文字コードはShift_JIS
になります。
WSHは、Shift_JISかUTF-16LE(BOM付き)で保存して、実行してください。
おすすめは、UTF-16LE(BOM付き)です。
事前知識
WSH関連の基礎知識です。
js/jseファイル
jsは、JavaScriptのファイル拡張子です。jseは、JScriptのファイル拡張子です。
Windowsは、標準でwscriptが関連付けされており、ダブルクリックで実行できます。
wsfファイル
外部スクリプトをロードして実行できるWSHのファイル形式です。
WSHでは、「.js」「.jse」「.wsf」などの拡張子を使用できます。ですが、実行ファイルを複数ファイルに分割した場合、「.wsf」を使用することが無難です。(eval関数を使用することで他の方法でも実現できますが、おすすめできる方法ではありません)
wsfファイル内にスクリプトを直接書き込む場合、<![CDATA[ ... ]]>
(CDATAセクション)を記述してスクリプト要素で使用する文字がXMLの予約文字と見なされないようにします。CDATAセクションを使用する場合は、<?XML?>
宣言を使用してください。
※CDATAなしの場合、if文の<
(小なり括弧)が原因で動作しないことがあります
HelloWorld.wsf<?xml version="1.0" encoding="UTF-16" standalone="yes" ?>
<package>
<job>
<script language="JavaScript">
//<![CDATA[
WScript.Echo('Hello World.');
//]]>
</script>
</job>
</package>
polyfill
WSHは、IE8環境で動作します。IE11がインストールされている場合でもスクリプトはIE8の環境で動作します。そのため、JavaScriptの標準規格からかなり遅れた仕様で動作します。最新のJavaScript規格でないため、様々な問題が発生します。
例として、下記関数が存在しません。
- Object.keys
- Array.isArray
- Array.prototype.indexOf
- Date.now
- String.prototype.trim
- Function.prototype.bind
WSHを最新環境に近づけるため、未定義の関数を追加しするのがpolyfillです。
様々なpolyfillがありますが、最低限ECMAScript 5環境でWSHを実行するために、es5-shim.jsの導入をすすめします。
※WSHには、windowやdocumentのグローバル変数が存在しません。そのため、そのままではpolyfillを導入できないことがよくあります。
JSON
WSHは、JavaScriptですが標準のJSONクラスが存在しません。そのため、JSON.stringify()やJSON.parse()を使用できません。JSON使用したい場合、polyfillを導入する必要があります。詳細は、リンク先を参照してください。
デバッグ
WSHのコードデバッグ方法です。詳細は、リンク先を参照してください。
クラス表現
JavaScriptは、ECMAScript 6でclassの予約語が使用可能になりましたが、WSHではclassの予約語を使用できません。これは、polyfillでも対処できません。ですが、JavaScriptでは、ECMAScript 6以前からクラス表現を擬似的に再現できます。クラス表現方法は、各々の使いやすい方法を選択すると良いでしょう。選択肢の一例として、筆者の実現方法は下記リンク先の通りです。
自作ライブラリ(宣伝)
- k08045kk/WSHLibrary
- WSH(JScript)用ファイル関連ライブラリ:FileUtility.js
- ファイル/フォルダの作成
- ファイルの読み込み/書き込み
- ファイル/フォルダの検索
- ファイル/フォルダのコピー/移動/削除
- WSH(JScript)用エラー出力ライブラリ:ErrorUtility.js
- エラーの文字列化
- 実行履歴の文字列化
- stack, captureStackTraceの疑似実現
- WSH(JScript)用エラー出力ファイル情報付加:ErrorUtility.FileInfo.js
- エラー出力用のトレース文字列にファイル情報を付加する
- WSH(JScript)用コンソール:Console.js
- consoleの疑似実現
- ログ出力用の機能提供
- WSH(JScript)用コンソール:Console.Animation.js
- アニメーション機能の実現
- ただし、標準出力の1行文字列に限る
- WSH(JScript)用変換関連ライブラリ:EncodeUtility.js
- 文字列/16進数文字列/Base64文字列→バイト配列
- バイト配列→文字列/16進数文字列/Base64文字列
- md5/sha1のハッシュ計算
- Rijndael暗号(AES)の暗号化/復号
- WSH(JScript)用簡易暗号化/復号:EasyCrypto.js
- 簡易暗号化/復号機能の提供
- WSH(JScript)用HTTPライブラリ:HTTPUtility.js
- HTTP/HTTPSの取得
- HTML/XMLの解析
- WSH(JScript)用ブラウザ操作補助:WebBrowser.js
- ブラウザ操作補助
- 操作ログの出力/キャッシュ
- WSH(JScript)用WMIライブラリ:WMIUtility.js
- wmiObjectの取得
- wmiObjectをObject化して取得
- WSH(JScript)用簡易データベース:DBLite.js
- SQLite(DB)の操作
- WSH(JScript)用ライブラリ:Process.js
- 初期化処理
- 実行/デバッグ補助
- 機能拡充処理
- 簡易polyfill
- 入れる場所のない、便利機能詰め合わせ
補足
ファイルの文字コード
wsfファイルの文字コードは、UTF-16LE(BOM付き)を推奨します。
Shift_JISも使用可能ですが、あまりおすすめできません。
一般的なテキストデータの文字コードとして、UTF-8があります。ですが、WSHではUTF-8を使用しないでください。スクリプトが動作しない可能性がります。詳しくは、上記の『Hello World > 動作しない場合』を参照。
ロゴの非表示
以下のコードを1回実行するとそれ以降、cscriptの実行時にロゴを非表示にできる。
cscript //Nologo //S
元に戻す
cscript //Logo //S
ロゴの例(実行直後にコマンドプロンプトで表示される文字列)
Microsoft (R) Windows Script Host Version 5.812
Copyright (C) Microsoft Corporation. All rights reserved.
ファイル配置
参考までに筆者の開発環境のファイル配置例を以下に示します。
./common/FileUtility.js
./lib/es5-shim.min.js
./lib/json3.min.js
./test/test.wsf
フォルダ名 | 説明 |
---|---|
. | ルート |
./common | 自作ライブラリ |
./lib | 外部ライブラリ |
./test | プロジェクト毎のメインフォルダ |
上記ファイル配置の場合、wsfファイルの外部スクリプト参照は以下のようになります。
<script language="JavaScript" src="../lib/es5-shim.min.js"/>
<script language="JavaScript" src="../common/FileUtility.js"/>
サンプル
サンプルスクリプトの実行例です。
環境準備
- GitHub - es-shims/es5-shim
- 「es5-shim.min.js」をダウンロードする
- ECMAScript 5のpolyfillです
- JSON 3
- 「Production Version」をダウンロードする
- JSONのpolyfillです
- WSH(JScript)用ライブラリ FileUtility.js
- 「FileUtility.js」を保存する
- WSH用のファイル関連ライブラリです
以下のようにファイルを配置する。下記のサンプル実行用の配置です。
※下記のサンプルは、文字コードをUTF-16LE(BOM付き)で保存してください。
サンプル:ファイル一覧の表示
files.wsf<?xml version="1.0" encoding="UTF-16" standalone="yes" ?>
<package>
<job id="main">
<?job error="false" debug="false" ?>
<script language="JavaScript" src="es5-shim.min.js"/>
<script language="JavaScript" src="json3.min.js"/>
<script language="JavaScript" src="FileUtility.js"/>
<script language="JavaScript">
//<![CDATA[
(function() {
"use strict";
function main() {
// フォルダ直下のファイルのフルパスを表示する
FileUtility.findFile(function(fullpath) {
WScript.Echo(fullpath);
}, '.');
}
main();
})();
//]]>
</script>
</job>
</package>
サンプル:JSONファイルの読み書き
json.wsf<?xml version="1.0" encoding="UTF-16" standalone="yes" ?>
<package>
<job id="main">
<?job error="false" debug="false" ?>
<script language="JavaScript" src="es5-shim.min.js"/>
<script language="JavaScript" src="json3.min.js"/>
<script language="JavaScript" src="FileUtility.js"/>
<script language="JavaScript">
//<![CDATA[
(function() {
"use strict";
function main() {
// JSONを保存
var json = {"a": "abc", "b": 123};
FileUtility.storeJSON(json, "./test.json", true);
// JSONを読込
var test = FileUtility.loadJSON("./test.json");
WScript.Echo(test.a); // 「abc」を表示する
WScript.Echo(test.b); // 「123」を表示する
}
main();
})();
//]]>
</script>
</job>
</package>
その他
関連記事
外部サイト
以下のサイトが参考になります。