WSH(JScript)でコードを書いてみる

WSHでコードを書くための基礎知識とサンプルの実行例です。

Hello World

お決まりの実行テストです。(Windows環境であれば、特別な環境構築は不要です)

  1. 下記のコードをテキストファイルにjse拡張子で保存する(js拡張子でも可)
  2. 作成したファイルをダブルクリックして実行する
  3. 参考画像のダイアログが出現すれば成功です
HelloWorld.jseWScript.Echo('Hello World.');

Hello World

動作しない場合

Error

ファイルをUTF-8BOMありで保存した場合、「文字がただしくありません。」エラーを発生させて動作を停止します。ファイル先頭のBOMを解釈できず動作しません。


Error2

ファイルを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以前からクラス表現を擬似的に再現できます。クラス表現方法は、各々の使いやすい方法を選択すると良いでしょう。選択肢の一例として、筆者の実現方法は下記リンク先の通りです。

自作ライブラリ(宣伝)

補足

ファイルの文字コード

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"/>

サンプル

サンプルスクリプトの実行例です。

環境準備

以下のようにファイルを配置する。下記のサンプル実行用の配置です。
フォルダ格納例

※下記のサンプルは、文字コードを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>

実行結果

その他

関連記事

外部サイト

以下のサイトが参考になります。