共通ライブラリー(JScript)

共通ライブラリー(wsh_extends.js)

概要:wshの共通ライブラリー
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
/*
<?xml version="1.0" encoding="Shift_JIS" standalone="yes" ?>
<object id="objShell"  progid="WScript.Shell" />
<object id="objFs"  progid="Scripting.FileSystemObject" reference="yes" />
<script language="JScript">
//<![CDATA[
*/
// basic extends
  var Try = {
    these: function() {
      var r, a = arguments, l = a.length;
      for (var i = 0; i < l; ++i) { try { r = a[i](); break; } catch(e){ } }
      return r;
    }
  }
  function for_each(c, func)
  {
    for (var i = 0, l = c.length; i < l; ++i) {
      func(c[i]);
    }
  }
  function escapeRegExp(string) {
    return string.replace(/([.*+?^=!:${}()|[\]\/\\])/g, '\\$1');
  }
  Date.prototype.toYYYYMMDD = function() {
    return this.getFullYear() +
    ('0' + (this.getMonth() + 1)).slice(-2) +
    ('0' + this.getDate()).slice(-2);
  }
  Date.prototype.toYYYYMMDDHHMMSS = function() {
    return this.toYYYYMMDD() +
    ('0' + this.getHours() + 1 ).slice(-2) +
    ('0' + this.getMinutes()).slice(-2) +
    ('0' + this.getSeconds()).slice(-2)
  }
// wsh extends
  var WshExtends = {
    isWScript: function() { return /wscript\.exe$/i.test(WScript.FullName); },
    isCScript: function() { return /cscript\.exe$/i.test(WScript.FullName); },
    is32bit: function() {
      return (/SysWOW64/i.test(WScript.FullName) ||
        objShell.Environment('Process').Item('PROCESSOR_ARCHITECTURE') === 'X86');
    },
    is64bit: function() {
      return (/system32/i.test(WScript.FullName) &&
        objShell.Environment('Process').Item('PROCESSOR_ARCHITECTURE') !== 'X86');
    },
    getNamedArgumentsArray: function() {
      var a = WScript.Arguments.Named, l = a.length, r = new Array();
      for (var i = 0; i < l; ++i) { r.push(a(i)); }
      return r;
    },
    getUnnamedArgumentsArray: function() {
      var a = WScript.Arguments.Unnamed, l = a.length, r = new Array();
      for (var i = 0; i < l; ++i) { r.push(a(i)); }
      return r;
    },
    // @brief 引数を配列で取得
    getArgumentsArray: function() {
      var a = WScript.Arguments, l = a.length, r = new Array();
      for (var i = 0; i < l; ++i) { r.push(a(i)); }
      return r;
    },
    getArgumentsString: function() {
      var a = WScript.Arguments, l = a.length, r = '';
      for (var i = 0; i < l; ++i) { r += 'argv[' + i + '] ' + a(i) + '\n'; }
      return r;
    },
    // @brief WScript.exeで起動されている場合、CScript.exeで起動しなおす
    // @require <object id="objShell"  progid="WScript.Shell" />
    // @require WshExtends.getArgumentsArray()
    ensureCScript: function() {
      if (/wscript\.exe$/i.test(WScript.FullName)) { // if (this.isWScript()) {
        var a = this.getArgumentsArray();
        objShell.Run(
          WScript.Path + '\\cscript.exe //NOLOGO "' + WScript.ScriptFullName + '"'
            + ((0 < a.length) ? (' "' + a.join('" "') + '"') : '')
          , 1
          , false
        );
        WScript.Quit(0);
      }
    },
    // @brief CScript, WScript, 32bit, 64bitを指定して、意図した状態でない場合、起動しなおす。
    // @param isCscript bool [in]
    //   強制的にCScript.exeにしたい場合は、true を指定
    //   強制的にWScript.exeにしたい場合は、false を指定
    //   現状維持の場合は、null を指定
    // @param is32Bit bool [in]
    //   強制的に32bit版にしたい場合は、true を指定
    //   強制的に64bitにしたい場合は、false を指定
    //   現状維持の場合は、null を指定
    // @return bool
    //   true の場合、起動しなおす必要無し
    //   false の場合、失敗
    ensureScript: function(isCscript, is32Bit) {
      var path = WScript.FullName;
      if (isCscript === true) {
        path = path.replace(/wscript\.exe/i, 'cscript.exe //NOLOGO');
      } else if (isCscript === false){
        path = path.replace(/cscript\.exe/i, 'wscript.exe');
      } else if (is32Bit === true) {
        path = path.replace(/system32/i, 'SysWOW64');
      } else if (is32Bit === false) {
        path = path.replace(/SysWOW64/i, 'system32');
      }
      if (WScript.FullName !== path) {
        if (!objFs.FileExists(path)) {
          return false;
        }
        var a = this.getArgumentsArray();
        objShell.Run(
          path + ' '+ WScript.ScriptFullName + '"'
            + ((0 < a.length) ? (' "' + a.join('" "') + '"') : '')
          , 1
          , false
        );
        WScript.Quit(0);
      }
      return true;
    },
    isLocalAdmin: function() {
      var objNetwork = new ActiveXObject('WScript.Network');
      var objGroup = GetObject('WinNT://' + objNetwork.ComputerName + '/Administrators');
      var strUser = objNetwork.UserName.toLowerCase();
      for (var e = new Enumerator(objGroup.Members()); !e.atEnd(); e.moveNext()) {
        var objUser = e.item();
        if (strUser == objUser.Name.toLowerCase()) {
          return true;
        }
      }
      return false;
    },
    // @brief WScriptの場合、32bit版のみ有効
    inputbox: function(prompt, title, defaultInput) {
      if (this.isCScript()) {
        WScript.StdOut.WriteLine(prompt);
        return WScript.StdIn.ReadLine();
      } else {
        // 32bit版のみ有効
        var objSC = WScript.CreateObject('MSScriptControl.ScriptControl');
        objSC.Language = 'VBScript';
        title = title || WScript.ScriptName;
        if (defaultInput) {
          return objSC.Eval('InputBox("' + prompt + '","' + title + '","' + defaultInput + '")');
        } else {
          return objSC.Eval('InputBox("' + prompt + '","' + title + '")');
        }
      }
    },
    popup: function(strText, nSecondsToWait, strTitle, nType) {
      if (this.isCScript()) {
        WScript.StdOut.WriteLine(strText);
        return WScript.StdIn.ReadLine();
      } else {
        nSecondsToWait = nSecondsToWait || 0;
        strTitle = strTitle || WScript.ScriptName;
        return objShell.Popup(strText, nSecondsToWait, strTitle, nType);
      }
    },
    // @brief ファイルの内容を全て読み取る
    // @require <object id="objFs"  progid="Scripting.FileSystemObject" reference="yes" />
    readAllTextFile: function(filename, iomode, create, format) {
      var r, m = iomode || ForReading, c = create || false;
      var f = format || TristateUseDefault, o = objFs.OpenTextFile(filename, m, c, f);
      try { r = o.ReadAll() + ''; } finally { o.Close(); }
      return r;
    },
    // @brief ファイルに書き込む
    // @require <object id="objFs"  progid="Scripting.FileSystemObject" reference="yes" />
    writeFile: function(data, filename, iomode, create, format) {
      var r, m = iomode || ForWriting, c = create || true;
      var f = format || TristateUseDefault, o = objFs.OpenTextFile(filename, m, c, f);
      try { o.Write(data); } finally { o.Close(); }
    },
    // @brief 環境変数かレジストリーの値を展開した値を返す。
    // @require <object id="objShell"  progid="WScript.Shell" />
    expandString: function(name) {
      // HKEY_LOCAL_MACHINE or HKLM
      // HKEY_CURRENT_CONFIG or HKCC
      // HKEY_CLASSES_ROOT or HKCR
      // HKEY_CURRENT_USER or HKCU
      // HKEY_USERS or HKU
      // HKEY_PERFORMANCE_DATA
      // HKEY_DYN_DATA
      return objShell.ExpandEnvironmentStrings(
          (/^HK((LM|CC|CR|CU|U)|EY_(LOCAL_MACHINE|CURRENT_(CONFIG|USER)|CLASSES_ROOT|USERS|(PERFORMANCE|DYN)_DATA))\\/i.test(name))
          ? objShell.RegRead(name)
          : name
      );
    },
    // @brief 既存のパスの末尾に名前を追加し、ファイルが存在する場合は、追加したパスを返す。存在しない場合は、例外をthrowする。
    // @require <object id="objFs"  progid="Scripting.FileSystemObject" reference="yes" />
    buildPathExists: function(path, name) {
      var r = objFs.BuildPath(path, name);
      if (!objFs.FileExists(r)) {
        throw new Error(r, + ' file not found.');
      }
      return r;
    },
    // @brief 引数の文字を展開後、パスの末尾に名前を追加し、ファイルの存在確認を行う。
    // 文字列の展開に失敗した場合やファイルが存在しない場合、例外をthrowする。
    // @return 既存のパスの末尾に名前を追加したパス
    // @require <object id="objFs"  progid="Scripting.FileSystemObject" reference="yes" />
    buildPathExistsEx: function(path, name) {
      return this.buildPathExists(this.expandString(path), this.expandString(name));
    },
    // @brief ファイル列挙
    // @require <object id="objFs"  progid="Scripting.FileSystemObject" reference="yes" />
    // @param target [in] 起点となるディレクトリー。ファイルパスを指定した場合、file_callbackをコールして終了する
    // @param file_callback [in] [void file_callback(objFile)] ファイルに対してのコールバック関数
    // @param recursive [in] [true/false] [undefined=true] 再帰的にサブディレクトリー配下のファイルも列挙するか?
    // @param dir_callback [in] [bool dir_callback(objDir)] [undefined=全てのディレクトリーが有効] ディレクトリーコールバック関数
    //                          (関数でfalseを返した場合、そのディレクトリーは無視される。)
    enumFiles: function(target, file_callback, recursive, dir_callback) {
      // 再帰用関数
      function enumFilesRecursive_(directory) {
        if (typeof dir_callback === 'undefined' || dir_callback(directory)) {
          // ファイルを列挙
          var e = new Enumerator(directory.Files);
          for (; !e.atEnd(); e.moveNext()) {
            file_callback(e.item());
          }
          // サブディレクトリーを再帰
          e = new Enumerator(directory.SubFolders);
          for (; !e.atEnd(); e.moveNext()) {
            enumFilesRecursive_(e.item());
          }
        }
      }
      if (objFs.FileExists(target)) {
        file_callback(objFs.getFile(target));
      } else if (objFs.FolderExists(target)) {
        if (typeof recursive === 'undefined' || recursive == true) {
          enumFilesRecursive_(objFs.GetFolder(target));
        } else {
          // 再帰的にサブディレクトリーを列挙しない場合、
          var e = new Enumerator(objFs.GetFolder(target).Files);
          for (; !e.atEnd(); e.moveNext()) {
            file_callback(e.item());
          }
        }
      } else {
        throw Error(target + ' not found.')
      }
    },
    // @brief 標準出力とファイルに出力する
    tee: function(file, msg) {
      WScript.Echo(msg);
      file.WriteLine(msg);
    },
    // @brief チェック結果のエラー内容を表示
    // @require <object id="objFs"  progid="Scripting.FileSystemObject" reference="yes" />
    outLog: function(file_log, msg, file_path, line) {
      var log = '';
      if (typeof file_path !== 'undefined') {
        log += objFs.GetFileName(file_path) + ',';
        if (typeof line !== 'undefined') {
          log += line + ',';
        }
      }
      this.tee(file_log, log + msg);
    },
    // @require cscript.exe
    pause: function() {
      if (this.isCScript()) {
        WScript.StdOut.WriteLine('続行するには何かキーを押してください . . .');
        WScript.StdIn.ReadLine();
      }
    }
  }
/*
//]]>
</script>
*/

共通ライブラリーを使う

<script>タグを使用する場合

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
<?xml version="1.0" encoding="Shift_JIS" standalone="yes" ?>
<package>
<job id="use_wsh_extends">
<?job error="true" debug="true" ?>
<object id="objShell"  progid="WScript.Shell" />
<object id="objFs"  progid="Scripting.FileSystemObject" reference="yes" />
<script language="JScript" src="wsh_extends.js" />
<script language="JScript">
//<![CDATA[
  // 処理
//]]>
</script>
</job>
</package>

環境変数 %WSH_EXTENDS_FILE% から使用する場合

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
{ // read %WSH_EXTENDS_FILE%
  var wsh_extends = objShell.ExpandEnvironmentStrings('%WSH_EXTENDS_FILE%');
  if (objFs.FileExist(wsh_extends)) {
    var r, o = objFs.OpenTextFile(wsh_extends, ForReading, false, TristateUseDefault);
    try { r = o.ReadAll() + ''; } finally { o.Close(); }
    eval(r);
  } else {
    throw new Error(wsh_extends, + ' file not found.');
  }
}
// 処理