2018-06-15T02:50:19Z

WSFファイルを1ファイルに結合する

自作スクリプトです。便利なので公開します。

wsf2jse.wsf

実行画面

WSFファイルを1ファイルに結合する。

wsfファイルのXMLを解析して、1つのjseファイルに出力するスクリプトです。ファイルを分割すると開発するには便利ですが、実用には不向きなため、1ファイルにまとめます。

説明

cscript wsf2jse.wsf /?
wsf2jse変換ツール
使い方 : wsf2jse.wsf path [jobid]

オプション :

path  : WSFファイルパス
jobid : ジョブID
  • wsfファイル名に「.jse」を追加したファイルを作成します。
    • 既に存在する場合、上書きします。
  • scriptタグのlanguage属性がJavaScriptかJScript以外の場合、動作を停止ます。
  • 外部スクリプトが指定位置に格納されていることが必要です。
  • wsfファイルをドラッグ&ドロップすることでも実行できます。
  • 拡張子が「.jse」なのは、「.js」の関連付けを変更しているWindows環境が多いと考えたため、「.jse」を採用しています。(「.js」拡張子でも問題はありません)
    • 「.jse」も「.js」同様のスクリプトです。
      (「.exe」の様に実行されます)

ソースコード

<?xml version="1.0" encoding="UTF-16" standalone="yes" ?>
<package>
  <job>
    <?job error="false" debug="false" ?>
    <runtime>
      <description>wsf2jse変換ツール</description>
      <unnamed name="path"  many="false" required="true"  helpstring="WSFファイルパス" />
      <unnamed name="jobid" many="false" required="false" helpstring="ジョブID" />
    </runtime>
    <script language="JavaScript" src="../common/FileUtility.js"/>
    <script language="JavaScript" src="../common/Process.js"/>
    <script language="JavaScript"><![CDATA[
/*!
 * wsf2jse.wsf v2
 *
 * Copyright (c) 2018 toshi
 * Released under the MIT license.
 * see https://opensource.org/licenses/MIT
 */

/**
 * WSFファイルを1ファイルに結合する
 * wsfファイルのXMLを解析して、1つのjseファイルに出力するスクリプトです。
 * ファイルを分割すると開発するには便利ですが、実用には不向きなため、
 * 1ファイルにまとめます。
 * @requires    module:ActiveXObject('Scripting.FileSystemObject')
 * @requires    module:ActiveXObject('MSXML.DOMDocument')
 * @requires    module:WScript
 * @requires    module:FileUtility.js(v6+)
 * @requires    module:Process.js(v3+)
 * @auther      toshi(https://www.bugbugnow.net/)
 * @license     MIT License
 * @version     2
 * @see         1 - 初版
 * @see         2 - リファクタリング
 */
(function () {
  "use strict";
  
  /**
   * PrivateUnderscore.js
   * @version   2
   */
  {
    // see https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString
    function _Date_toISOString() {
      function pad(number) {
        return ((number < 10)? '0': '') + number;
      }
      return this.getUTCFullYear() +
        '-' + pad(this.getUTCMonth() + 1) +
        '-' + pad(this.getUTCDate()) +
        'T' + pad(this.getUTCHours()) +
        ':' + pad(this.getUTCMinutes()) +
        ':' + pad(this.getUTCSeconds()) +
        '.' + (this.getUTCMilliseconds() / 1000).toFixed(3).slice(2, 5) +
        'Z';
    };
  }
  
  // 標準出力
  var stdout  = '';
  function println(message) {
    stdout += ((message !== void 0) ? message: '')+'\n';
  }
  
  function main(path, jobid) {
    var fullpath = fs.GetAbsolutePathName(path);
    if (fs.FileExists(fullpath) == false) {
      WScript.Echo('file not found.');
      return -1;
    } else if (fullpath.endsWith('.wsf') == false) {
      WScript.Echo('wsf file not found.');
      return -2;
    } else {
      // wsfを読込み
      var text = FileUtility.loadText(fullpath)
                            .replace(/\r\n?/g,'\n');
      var xml = Process.createDOMDocument();
      xml.loadXML(text);
      
      // wsfを解析
      var job = xml.selectSingleNode((jobid == null)? '//job': '//job[@id="'+jobid+'"]');
      var descript = null;
      var scripts = [];
      if (job != null) {
        descript = job.selectSingleNode('runtime/description');
        scripts  = job.selectNodes('script');
      }
      if (scripts.length == 0) {
        WScript.Echo('script not found.');
        return -3;
      }
      
      // ヘッダ部書込み
      var lines = [];
      var filename = fs.GetFileName(fullpath);
      lines.push('// ==wsf2jse:header==');
      lines.push('//     file: '+filename);
      for (var i1=0; i1<scripts.length; i1++) {
        var src = scripts[i1].getAttribute('src');
        if (src != null) {
          lines.push('//  subfile: '+src);
        }
        // スクリプトの言語をチェック
        var lang = scripts[i1].getAttribute('language');
        if (lang == null) {}
        else if (lang.toLowerCase() == 'jscript') {     continue;  }
        else if (lang.toLowerCase() == 'javascript') {  continue;  }
        // 非対応言語
        WScript.Echo('unsupported script is included.');
        return -4;
      }
      if (descript != null) {
        var descripts = descript.text.split('\n');
        for (var i2=0; i2<descripts.length; i2++) {
          lines.push('// descript: '+descripts[i2]);
        }
      }
      lines.push('//   create: '+_Date_toISOString.call(new Date()));
      lines.push('// ==/wsf2jse:header==');
      lines.push('');
      
      // スクリプト書き込み
      println(filename);
      lines.push('// ==wsf2jse:'+filename+'==');
      for (var i3=0; i3<scripts.length; i3++) {
        var src = scripts[i3].getAttribute('src');
        if (src != null) {
          println(src);
          lines.push('// ==wsf2jse:'+src+'==');
          lines.push(FileUtility.loadText(src));
          lines.push('// ==/wsf2jse:'+src+'==');
        }
        if (scripts[i3].text != '') {
          lines.push(scripts[i3].text);
        }
      }
      lines.push('// ==/wsf2jse:'+filename+'==');
      
      // ファイル出力
      FileUtility.storeText(lines.join('\n'), fullpath+'.jse', true, 'utf-16');
      
      println();
      println('complete.');
      WScript.Echo(stdout);
    }
    return 0;
  }
  
  Process.exec(main);
})();
    ]]></script>
  </job>
</package>

変更履歴

更新日 説明
2018/05/12 [v1][add] 初版
2018/05/13 [v2][update] リファクタリング

補足

FileUtility.js, Process.jsファイルが別途必要となります。

結合済みjseファイル

wsf2jse.wsfを1ファイルにまとめたファイルは、以下のリンク先に配置しました。

※拡張子が「.txt」の場合、「.jse」に変更してください。
※文字コードは、UTF-16で保存してください。

 コメントを書く