WSH(JScript) でhostsファイルに定義する

概要:

WSH(JScript)で引数の定義をhostsファイルに定義を追加する

注意:
  • wsh_extends.js および、 WshExtends共通ライブラリー(JScript) を参照
  • hosts.wsf <IPアドレス> <名前> [/s][/b]
  • /Y で、確認のメッセージを表示しない。
  • /B で、バックアップファイルを作成しない。
ファイル:

hosts.wsf(スタンドアローン版) (Shift_JIS CR/LF)

  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
<?xml version="1.0" encoding="Shift_JIS" standalone="yes" ?>
<package>
<job id="hosts">
<?job error="true" debug="true" ?>
<runtime>
  <description>hostsファイルに定義を追加する。</description>
  <unnamed name="ip" helpstring="IPアドレス" many="false" required="1" />
  <unnamed name="hostName" helpstring="ホスト名" many="false" required="1" />
  <named name="Y" helpstring="確認のメッセージを表示しない。" type="boolean" required="false" />
  <named name="B" helpstring="バックアップファイルを生成しない。" type="boolean" required="false" />
  <example>例: hosts.wsf 192.168.33.10 example.com [/Y][/B]</example>
</runtime>
<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[
  // 引数解析
  function parseArguments(param) {
    var ans = {ip:'',hn:'',isValid:false,isYes:false,isBackup:true};
    if (typeof param === 'string') {
      param = param.replace(/\s+/g, ' ').split(' ');
    }
    var l = param.length;
    for (var i = 0; i < l; ++i) {
      if (/^([0-9a-f.:]+)$/gi.test(param[i]) && ans.ip === '') {
        ans.ip = param[i];
        if (ans.hn !== '') { ans.isValid = true; }
      } else if (ans.hn === '') {
        ans.hn = param[i];
        if (ans.ip !== '') { ans.isValid = true; }
      } else {
        ans.isValid = false;
      }
    }
    return ans;
  }
  if (!WshExtends.isLocalAdmin()) {
    WScript.Echo('このスクリプトは管理者権限で実行して下さい。処理を中止します。');
    WScript.Quit(3);
  }
  var objNamed = WScript.Arguments.Named;
  var arg = parseArguments(WshExtends.getUnnamedArgumentsArray());
  arg.isYes = objNamed.Exists('Y');
  arg.isBackup = !objNamed.Exists('B');
  if (!arg.isValid) {
    if (WshExtends.isWScript()) {
      // WScriptの場合、32bit版で起動しなおす。
      if (WshExtends.ensureScript(null, true) === false) {
        // 32bit版のWScriptが起動できない場合、CScriptで起動する。
        if (WshExtends.ensureScript(true) === false) {
          WScript.Echo('32bit版のWScript、および、CScriptの起動に失敗しました。処理を中止します。');
          WScript.Quit(2);
        }
      }
    }
    do {
      var input = WshExtends.inputbox('定義する[IPアドレス]と[サーバー名]をスペース区切りで入力して下さい。', WScript.ScriptName);
      if (typeof input === 'undefined') {
        WScript.Echo('処理を中止しました。');
        WScript.Quit(1);
      }
      arg = parseArguments(input);
      if (!arg.isValid) {
        WScript.Echo('入力の解析に失敗しました。');
      }
    } while (!arg.isValid);
  }
  try {
    // hostsファイルのパスをレジストリから取得
    var dataBasePath = objShell.RegRead('HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters\\DataBasePath');
    var pathHosts = WshExtends.buildPathExists(objShell.ExpandEnvironmentStrings(dataBasePath), 'hosts');
    var pathHostsBackup = pathHosts + '-' + (new Date).toYYYYMMDDHHMMSS();
    if (!arg.isYes) {
      var msg = '[File]' + pathHosts +
        '\r\n[Backup]作成' + ((arg.isBackup) ? ('する(' + pathHostsBackup + ')') : 'しない') +
        '\r\n[IP]' + arg.ip +
        '\r\n[Name]' + arg.hn +
        '\r\n\r\n定義を追加します。よろしいですか?[Y/N]';
      var ans = WshExtends.popup(msg, 0, WScript.ScriptName, 36);
      if (ans !== 6 && ans !== 'Y' && ans !== 'y') {
        WScript.Echo('処理を中止しました。');
        WScript.Quit(1);
      }
    }
    var contents = WshExtends.readAllTextFile(pathHosts);
    var newSubStr = '   ' + arg.ip + '                '.slice(arg.ip.length) + arg.hn;
    var regexp = new RegExp('^[ \\t]*([0-9a-f.:]+)[ \\t]+' + escapeRegExp(arg.hn) + '(.*)$', 'gim');
    var isChange = false;
    if (regexp.test(contents)) {
      if (RegExp.$1 !== arg.ip) {
        contents = contents.replace(regexp, newSubStr + RegExp.$2);
        isChange = true;
      }
    } else {
      contents += newSubStr + RegExp.$2 + '\r\n';
      isChange = true;
    }
    if (isChange) {
      if (arg.isBackup) {
        objFs.CopyFile(pathHosts, pathHostsBackup);
        WScript.Echo('Backupファイル(' + pathHostsBackup + ')を生成しました。');
      }
      WshExtends.writeFile(contents, pathHosts);
      WScript.Echo('hostsファイルを更新しました。');
    } else {
      WScript.Echo('定義済みのため、hostsファイルに変更はありません。');
    }
  } catch(e) {
    objShell.Popup(e.message, 0, WScript.ScriptName, 64);
    WScript.Quit(2);
  }
//]]>
</script>
</job>
</package>