<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[Серый форум &mdash; JS: менеджер версий Node.js]]></title>
	<link rel="self" href="https://forum.script-coding.com/extern.php?action=feed&amp;tid=10381&amp;type=atom" />
	<updated>2015-02-07T15:27:43Z</updated>
	<generator>PunBB</generator>
	<id>https://forum.script-coding.com/viewtopic.php?id=10381</id>
		<entry>
			<title type="html"><![CDATA[Re: JS: менеджер версий Node.js]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=91331#p91331" />
			<content type="html"><![CDATA[<p>Отредактировал код <a href="http://forum.script-coding.com/viewtopic.php?pid=91152#p91152">исходного поста</a>, ну и версию <a href="https://github.com/dab00/nvmx">приложения</a>: <br />- изменил код определения разрядности оси согласно рекомендации <strong>Flasher</strong><br />- добавил аргумент <em>uninstall</em> благодаря замечанию <strong>Rumata</strong><br />- плюс еще несколько несущественных улучшений<br />Надеюсь что окончательно победил ошибку &quot;Не удается создать объект с именем &quot;InternetExplorer.Application&quot;&quot;. Решил следующим образом:<br /></p><div class="codebox"><pre><code>
function getIE(path) {
  var ie = ie_(), i = 0, timeout = 200;
  while (!ie) {
    if (timeout &gt; 5000) return err(&#039;Failed getting InternetExplorer.Application. Please try again&#039;);
    if (timeout%1000 === 0) log(&#039;Please wait...&#039;);
    WScript.Sleep(timeout += 200);
    ie = ie_();
  }
  ie.visible = false;
  ie.navigate(path);
  while (ie.busy || ie.readyState !== 4) {
    if (++i &gt; 300) return err(&#039;Failed getting response from &#039; + path);
    WScript.Sleep(200);
  }
  return ie;

  function ie_() {
    try {
      return WScript.CreateObject(&#039;InternetExplorer.Application&#039;);
    } catch(e) {
      // log(e.message &amp;&amp; e.message.toString());
    }
  }
}
</code></pre></div><p>Наверное есть решение лучше... но пока вот как-то так <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" />. <br />Спасибо всем кто не прошел мимо.</p>]]></content>
			<author>
				<name><![CDATA[dab00]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=27085</uri>
			</author>
			<updated>2015-02-07T15:27:43Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=91331#p91331</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: JS: менеджер версий Node.js]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=91182#p91182" />
			<content type="html"><![CDATA[<div class="quotebox"><blockquote><p>думаю что у таковых нет необходимости эмулировать сколько-нибудь-битную Windows</p></blockquote></div><p>Никто не пишет про эмуляцию операционной системы (к чему она?).&nbsp; Речь идёт о 32-х битных приложениях, из которых будет запускаться скрипт.</p>]]></content>
			<author>
				<name><![CDATA[Flasher]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=27593</uri>
			</author>
			<updated>2015-02-02T11:39:41Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=91182#p91182</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: JS: менеджер версий Node.js]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=91181#p91181" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>Flasher пишет:</cite><blockquote><p>Глубоко ошибаетесь</p></blockquote></div><p>Потенциальные пользователи приложения - Node.js девелоперы, которым приходится работать в Windows, думаю что у таковых нет необходимости эмулировать сколько-нибудь-битную Windows, скорее Red Hat какой-нибудь, типа CentOS, а &quot;продвинутым&quot; это ни к чему</p>]]></content>
			<author>
				<name><![CDATA[dab00]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=27085</uri>
			</author>
			<updated>2015-02-02T11:33:17Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=91181#p91181</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: JS: менеджер версий Node.js]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=91176#p91176" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>dab00 пишет:</cite><blockquote><p>Ну и по разрядности оси: по-моему вероятность необходимости использования этого решения в условиях &quot;эмуляций&quot; и т.п. близка к нулю.</p></blockquote></div><p>Глубоко ошибаетесь. Продвинутые пользователи, коевы и будут данное детище потенциально рассматривать для своих нужд, вместо проводника предпочитают использовать совсем другие оболочки, и чаще именно 32-битные.</p>]]></content>
			<author>
				<name><![CDATA[Flasher]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=27593</uri>
			</author>
			<updated>2015-02-02T10:15:43Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=91176#p91176</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: JS: менеджер версий Node.js]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=91168#p91168" />
			<content type="html"><![CDATA[<p>Спасибо за участие. </p><p>По оптимизации: если про то чтобы вытащить <em>trimFirst</em> и <em>indexOf</em> из <em>trimLeft</em> - выше цикл все-таки, то я не думаю что здесь это имеет смысл, если бы там был какой-нибудь мегацикл... а здесь как рука взяла так и осталось <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" />, да и вряд ли это особенно оптимизирует, в общем по-моему на любителя, если я конечно правильно догадался что подразумевалось под оптимизацией.</p><p>По аргументам: здесь я конечно немного перегнул, скрипт задумывался с претензией на универсальность и на мой взгляд &quot;интуитивность&quot; у каждого своя, вот я и навтыкал алиасов на сколько фантазии хватило. Кроме того кому-то интуитивнее написать <em>nvmx install io</em>, а кому-то <em>nvmx io install</em>, поэтому постарался предусмотреть и этот вариант. <br />Дальше. Мне не хотелось &quot;мистифицировать&quot; это приложение и сделать его работу максимально &quot;прозрачной&quot;, <em>Install</em> и <em>Remove</em> я бы не назвал противоположными понятиями: <em>Install</em> - качает версию, распаковывает, после чего копирует распакованный каталог из темпового каталога юзера в каталог приложения, <em>Remove</em> - просто удаляет каталог из каталога приложения, я бы не назвал это <em>Uninstall</em>... хотя как вариант наверное имеет смысл добавить <em>Uninstall</em> в список алиасов, да и у &quot;<a href="https://github.com/dab00/nvmx#alternatives">альтернатив</a>&quot; это называется <em>uninstall</em>. <br />Но удалять многочисленные алиасы не буду, мне например удобнее написать <em>nvmx rm</em> ... чем <em>nvmx uninstall</em> ... , короче же <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" /></p><p>На счет &quot;откусывания&quot;: думаю неважно как написать, главное чтобы сработало, хотя в справке действительно вариант типа <em>nvmx /list /node</em> не отражен.</p><p>Ну и по разрядности оси: по-моему вероятность необходимости использования этого решения в условиях &quot;эмуляций&quot; и т.п. близка к нулю.</p><p>И еще. Если не считать таких мелочей как отсутствие <em>indexOf </em>или неверная работа <em>substr </em>с отрицательным аргументом позиции мне больше всего хлопот доставил <em>InternetExplorer.Application</em> и поиск вариантов вернуть строку из скрипта в батник, ну и для <em>xhr</em> наверное можно было что-то &quot;покруче&quot; чем <em>MSXML2.XMLHTTP</em> применить, к примеру чтобы можно было прокси указать. Откровенно говоря думал что по этим вопросам какие-нибудь замечания будут. </p><p>Спасибо еще раз, все услышал.</p>]]></content>
			<author>
				<name><![CDATA[dab00]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=27085</uri>
			</author>
			<updated>2015-02-02T09:21:15Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=91168#p91168</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: JS: менеджер версий Node.js]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=91161#p91161" />
			<content type="html"><![CDATA[<div class="quotebox"><blockquote><p>Кстати, возвращаясь к одной из предыдущих тем форума: здесь я использую тот же код для определения разрядности оси.</p></blockquote></div><p>Вот и будете иметь проблему на Winx64, запуская скрипт из среды в режиме эмуляции x32.</p>]]></content>
			<author>
				<name><![CDATA[Flasher]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=27593</uri>
			</author>
			<updated>2015-02-01T23:08:53Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=91161#p91161</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: JS: менеджер версий Node.js]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=91157#p91157" />
			<content type="html"><![CDATA[<p>Первоначальная моя мысль была пройтись с целью оптимизации некоторых функций (например, trimLeft, trimFirst, indexOf), но по мере знакомства со скриптом намерения немного изменились . </p><p>Мне кажется поддерживать такое большое количество вариантов аргументов излишне (слово, /слово, --слолво, /с, -с, с). Пусть это будут полные имена (latest, all, install и т.д.) и некоторые короткие варианты (ls, rm). Например, &quot;l&quot; (строчная латинская &quot;эль&quot;) интуитивнее как сокрашение для list, но не для latest. </p><p>Install и Remove это взаимно противоположные действия? Тогда - Install и Uninstall. </p><p>Такое большое количество вариантов для справки (help, --help, /help, -h, /h. /?, ?) подавляет: запуск без параметров уже выводит справку. </p><p>Только первый аргумент является указателем действия, остальные - это параметры этого действия. Но &quot;откусывание&quot; ведущих слеша, тире и двойного тире производится для для всех. То есть я могу написать <strong>nvmx /list /node</strong>. Наверно, это не совсем так. Да и в справке не отражено такое поведение. </p><p>Обработку аргументов командной строки можно существенно сократить. Например, так:</p><div class="codebox"><pre><code>
var actionList = {
    &#039;latest&#039;: latest, 
    &#039;all&#039;: all, 

    &#039;install&#039;: install, 
    &#039;uninstall&#039;: uninstall, 

    &#039;list&#039;: list, 
    &#039;ls&#039;: list, 

    &#039;use&#039;: use, 

    &#039;help&#039;: help
};

var action = args.shift();

actionList[action](args) || help();
</code></pre></div>]]></content>
			<author>
				<name><![CDATA[Rumata]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=24846</uri>
			</author>
			<updated>2015-02-01T19:04:10Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=91157#p91157</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[JS: менеджер версий Node.js]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=91152#p91152" />
			<content type="html"><![CDATA[<p>Всем привет. Разрешите представить: <a href="https://github.com/dab00/nvmx">Node Version Manager</a> на WSH.<br />Не уверен что лучшим образом подошел к решению вопроса... в общем кому интересно - добро пожаловать: ваши замечания, pull request&#039;ы и просто комменты.</p><p>nvmx.js:<br /></p><div class="codebox"><pre><code>

var args = (function() {
  var args = WScript.Arguments, arr = [];
  for (var i = 0, len = args.length; i &lt; len; i += 1) {
    arr[i] = trimLeft(args.item(i));
  }
  return arr;

  function trimLeft(item) {
    var str = trimFirst(item), substr = str.substring(0,2);
    return indexOf(substr) ? substr : str;
  }

  function trimFirst(item) {
    var s = item.substring(0,1);
    if (s === &#039;/&#039;) return item.substr(1);
    if (s === &#039;-&#039;) return item.substring(1,2) === &#039;-&#039; ? item.substr(2) : item.substr(1);
    return item;
  }

  function indexOf(s) {
    var arr = [&#039;no&#039;, &#039;io&#039;, &#039;lt&#039;, &#039;la&#039;, &#039;a&#039;, &#039;al&#039;, &#039;i&#039;, &#039;in&#039;, &#039;ls&#039;, &#039;li&#039;, &#039;rm&#039;, &#039;re&#039;, &#039;ui&#039;, &#039;un&#039;, &#039;u&#039;, &#039;us&#039;, &#039;h&#039;, &#039;he&#039;, &#039;?&#039;], i = arr.length;
    while (i--) {
      if (arr[i] === s) return true;
    }
  }
})();

(function() {
  switch(args[0]) {
  case &#039;h&#039;:
  case &#039;he&#039;:
  case &#039;?&#039;:
    return help();
  case &#039;no&#039;:
  case &#039;io&#039;:
    return go(args[1], args[0]); // Wrong sequence of arguments
  default:
    return go(args[0], args[1]); // Wright sequence of arguments
  }
})();

function go(command, arg) { // arg = platform || version || architecture || undefined
  switch(command) {
  case &#039;lt&#039;:
  case &#039;la&#039;:
    latest(arg);
  case &#039;a&#039;:
  case &#039;al&#039;:
    all(arg);
  case &#039;i&#039;:
  case &#039;in&#039;:
    install(arg);
  case &#039;ls&#039;:
  case &#039;li&#039;:
    list(arg);
  case &#039;u&#039;:
  case &#039;us&#039;:
    use(arg);
  case &#039;rm&#039;:
  case &#039;re&#039;:
  case &#039;ui&#039;:
  case &#039;un&#039;:
    remove(arg);
  case &#039;off&#039;:
    off();
  case &#039;path&#039;:
    path();
  default:
    last();
  }
}

function platform(arg) {
  var config = {
    no: {
      distUrl: &#039;http://nodejs.org/dist/&#039;,
      latestUrl: &#039;http://nodejs.org/dist/latest&#039;,
      name: &#039;node&#039;,
      folder: &#039;nodejs&#039;,
      exe: &#039;node.exe&#039;,
      getUrl: function(name, version) {
        var url = this.distUrl + version, arch = getArch();
        if (arch === &#039;x64&#039;) url += &#039;/x64&#039;;
        return url + &#039;/&#039; + name + &#039;.msi&#039;;
      }
    },
    io: {
      distUrl: &#039;https://iojs.org/dist/&#039;,
      latestUrl: &#039;https://iojs.org/dist/latest&#039;,
      name: &#039;iojs&#039;,
      folder: &#039;iojs&#039;,
      exe: &#039;iojs.exe&#039;,
      getUrl: function(name, version) {
        return this.distUrl + version + &#039;/&#039; + name + &#039;.msi&#039;;
      }
    }
  };
  return config[ arg in config ? arg : &#039;no&#039; ]; // default = node
}

//-----
function latest(arg) {
  var obj = platform(arg), version = getLatest(obj.latestUrl);
  if (!version) return err(&#039;Failed getting latest &#039; + obj.name + &#039; version&#039;);
  log(&#039;Latest &#039; + obj.name + &#039; version: &#039; + version);
  return quit(0);
}

function getLatest(path) { // latest version
  var ie = getIE(path);
  var elements = ie.document.getElementsByTagName(&#039;a&#039;), i = elements.length;
  var arr, text, ret;
  if (i) {
    while (i--) {
      text = elements[i].innerText;
      if (!text) continue;
      arr = text.split(&#039;-&#039;);
      if (isVersion(arr)) {
        ie.quit();
        return arr[1].split(&#039;.&#039;).splice(0,3).join(&#039;.&#039;);
      }
    }
  }
}

function isVersion(arr) {
  return arr[1] &amp;&amp; arr[1].substring(0,1) &amp;&amp; arr[1].substring(0,1).toLowerCase() === &#039;v&#039;;
}

function getIE(path) {
  var ie = ie_(), i = 0, timeout = 200;
  while (!ie) {
    if (timeout &gt; 5000) return err(&#039;Failed getting InternetExplorer.Application. Please try again&#039;);
    if (timeout%1000 === 0) log(&#039;Please wait...&#039;);
    WScript.Sleep(timeout += 200);
    ie = ie_();
  }
  ie.visible = false;
  ie.navigate(path);
  while (ie.busy || ie.readyState !== 4) {
    if (++i &gt; 300) return err(&#039;Failed getting response from &#039; + path);
    WScript.Sleep(200);
  }
  return ie;

  function ie_() {
    try {
      return WScript.CreateObject(&#039;InternetExplorer.Application&#039;);
    } catch(e) {
      // log(e.message &amp;&amp; e.message.toString());
    }
  }
}
//-----

//-----
function all(arg) { // all versions
  var obj = platform(arg);
  var ie = getIE(obj.distUrl);
  var elements = ie.document.getElementsByTagName(&#039;a&#039;), i = elements.length;
  var arr, text;
  if (i) {
    log(&#039;Available &#039; + obj.name + &#039; versions:&#039;);
    while (i--) {
      text = elements[i].innerText;
      if (!text) continue;
      if (text.indexOf(&#039;-&#039;) !== -1) continue;
      arr = text.split(&#039;.&#039;);
      if (arr.length &lt; 3 || arr[1] === &#039;&#039;) continue;
      if (obj.name === &#039;node&#039;) {
        if (7 &lt; arr[1]) log(text.substring(0, text.length - 1));
      } else {
        log(text.substring(0, text.length - 1));
      }
    }
  } else {
    return err(&#039;Failed getting &#039; + obj.name + &#039; available versions&#039;);
  }
  ie.quit();
  return quit(0);
}
//-----

//-----
function install(arg) {
  var obj = platform(arg);
  var param = (function() {
    var version = fixArg(arg);
    if (!version || version === &#039;latest&#039;) return getLatest(obj.latestUrl); // default
    return fixVersion(version);
  })();
  var dirName = obj.name + &#039;-&#039; + param + &#039;-&#039; + getArch();
  log(&#039;Installing &#039; + dirName);
  var remote = obj.getUrl(dirName, param);
  var fso = WScript.CreateObject(&#039;Scripting.FileSystemObject&#039;);
  var local = fso.GetSpecialFolder(2) + &#039;\\&#039; + dirName, localmsi = local + &#039;.msi&#039;;
  log(&#039;Downloading...&#039;);
  // log(&#039;Downloading \nfrom: &#039; + remote + &#039;\nto:&#039; + localmsi);
  download(remote, localmsi);
  log(&#039;Extracting...&#039;);
  // log(&#039;Extracting to: &#039; + local);
  WScript.CreateObject(&#039;WScript.Shell&#039;).Run(&#039;msiexec /a &#039;  + localmsi + &#039; /qn TARGETDIR=&#039; + local, 0, true);
  var copyFrom = local + &#039;\\&#039; + obj.folder, copyTo = getCurr(fso) + &#039;\\&#039; + dirName;
  log(&#039;Copying...&#039;);
  // log(&#039;Copying \nfrom: &#039; + copyFrom + &#039;\nto: &#039; + copyTo);
  if (!fso.folderExists(copyFrom)) err(&#039;Folder &#039; + copyFrom + &#039; not found&#039;);
  fso.copyFolder(copyFrom, copyTo);
  var binPath = copyTo + &#039;\\&#039; + &#039;node.exe&#039;;
  if (!fso.fileExists(binPath)) fso.copyFile(copyTo + &#039;\\&#039; + obj.exe, binPath);
  log(&#039;Installed &#039; + dirName);
  return quit(0);

  function download(remote, local) {
    var xhr = WScript.CreateObject(&#039;MSXML2.XMLHTTP&#039;);
    xhr.open(&#039;GET&#039;, remote, 0);
    xhr.send();
    if (xhr.readyState !== 4) return err(&#039;Failed to download from &#039; + remote);
    if (xhr.status !== 200) return err(&#039;Failed to download from &#039; + remote);
    var stream = WScript.CreateObject(&#039;ADODB.Stream&#039;);
    stream.mode = 3;
    stream.type = 1;
    stream.open()
    stream.write(xhr.responseBody);
    stream.saveToFile(local, 2);
  }
}
//-----

//-----
function list(arg) {
  var platforms = arg ? [platform(arg)] : [platform(&#039;no&#039;), platform(&#039;io&#039;)];
  var bins = [], names = [], i = platforms.length, arch = getArch();
  while (i--) {
    bins[i] = platforms[i].exe;
    names[i] = platforms[i].name;
  }
  var fso = WScript.CreateObject(&#039;Scripting.FileSystemObject&#039;);
  var folders = new Enumerator(fso.GetFolder(getCurr(fso)).subFolders);
  var files;
  for (; !folders.atEnd(); folders.moveNext()) {
    if (!isTargetFolder(folders.item().Name, arch)) continue;
    files = new Enumerator(folders.item().Files);
    for (; !files.atEnd(); files.moveNext()) {
      if (isTargetBin(files.item().Name)) {
        log(folders.item().Name)
        break;
      }
    }
  }
  return quit(0);

  function isTargetFolder(folderName, arch) {
    var i = names.length, arr = folderName.split(&#039;-&#039;);
    while (i--) {
      if (names[i] === arr[0] &amp;&amp; arch === arr[2]) return true;
    }
  }

  function isTargetBin(fileName) {
    var i = bins.length;
    while (i--) {
      if (bins[i] === fileName) return true;
    }
  }
}
//-----

//-----
function use(arg) {
  if (!arg) return last(); // last used version
  var arr = getPath();
  var version = fixVersion(fixArg(arg));
  var dirName = platform(arg).name + &#039;-&#039; + version + &#039;-&#039; + getArch();
  var fso = WScript.CreateObject(&#039;Scripting.FileSystemObject&#039;);
  var current = getCurr(fso);
  var folders = new Enumerator(fso.GetFolder(current).subFolders);
  for (; !folders.atEnd(); folders.moveNext()) {
    if (folders.item().Name === dirName) {
      var file = fso.CreateTextFile(current + &#039;\\&#039; + &#039;path.txt&#039;, true);
      file.write((function() {
        var first = arr[0].split(&#039;\\&#039;);
        if (first.slice(0, first.length - 1).join(&#039;\\&#039;) === current) arr.shift();
        return current + &#039;\\&#039; + dirName + &#039;;&#039; + arr.join(&#039;;&#039;);
      })());
      file.close();
      log(&#039;Now using &#039; + dirName);
      return quit(9);
    }
  }
  err(&#039;Version &#039; + dirName + &#039; not found&#039;);
}

function getPath() {
  var path = WScript.CreateObject(&#039;WScript.Shell&#039;).ExpandEnvironmentStrings(&#039;%PATH%&#039;);
  return !(path &amp;&amp; path.length) ? err(&#039;Invalid %PATH%&#039;) : path.split(&#039;;&#039;);
}
//-----

//-----
function remove(arg) {
  if (!arg) err(&#039;Invalid version&#039;);
  var version = fixVersion(fixArg(arg));
  var dirName = platform(arg).name + &#039;-&#039; + version + &#039;-&#039; + getArch();
  var fso = WScript.CreateObject(&#039;Scripting.FileSystemObject&#039;);
  var folders = new Enumerator(fso.GetFolder(getCurr(fso)).subFolders);
  for (; !folders.atEnd(); folders.moveNext()) {
    if (folders.item().Name === dirName) {
      fso.deleteFolder(folders.item().Path, true);
      log(&#039;Removed &#039; + dirName);
      return quit(0);
    }
  }
  err(&#039;Version &#039; + dirName + &#039; not found&#039;);
}
//-----

//-----
function last() { // last used version
  var fso = WScript.CreateObject(&#039;Scripting.FileSystemObject&#039;);
  var current = getCurr(fso), path = current + &#039;\\&#039; + &#039;path.txt&#039;;
  if (!fso.fileExists(path)) return help();
  var file = fso.OpenTextFile(path, 1), arr = file.readAll().split(&#039;;&#039;);
  file.close();
  if (arr.length === 0) return err(&#039;Invalid path.txt&#039;);
  var first = arr[0].split(&#039;\\&#039;), version = first.pop();
  if (first.join(&#039;\\&#039;) !== current) return log(&#039;Last used version not found&#039;);
  if (isVersion(version.split(&#039;-&#039;))) {
    log(&#039;Now using &#039; + version);
    return quit(9);
  }
}
//-----

//-----
function off() {
  var arr = getPath();
  var fso = WScript.CreateObject(&#039;Scripting.FileSystemObject&#039;);
  var current = getCurr(fso);
  var first = arr[0].split(&#039;\\&#039;);
  log(&#039;Now nvmx is off&#039;);
  if (first.slice(0, first.length - 1).join(&#039;\\&#039;) === current) {
    var file = fso.CreateTextFile(current + &#039;\\&#039; + &#039;path.txt&#039;, true);
    file.write(arr.slice(1).join(&#039;;&#039;));
    file.close();
    return quit(9);
  }
  return quit(0);
}
//-----

//-----
function path() {
  log(getCurr(WScript.CreateObject(&#039;Scripting.FileSystemObject&#039;)));
  quit(0);
}
//-----

function fixVersion(version) {
  var arr = version.split(&#039;.&#039;);
  if (arr.length !== 3 || arr[2].length === 0 || arr[1].length === 0 || arr[0].length === 0) return err(&#039;Invalid version&#039;);
  if (version.substring(0,1).toLowerCase() === &#039;v&#039;) return version;
  return &#039;v&#039; + version;
}

function fixArg(arg) {
  return arg === &#039;io&#039; ||  arg === &#039;no&#039; ? args[2] : arg; // may be blank
}

function getArch() { // architecture
  var a = args[args.length - 1]; // last arg
  if (a.substring(0,1).toLowerCase() === &#039;x&#039;) a = a.substr(1);
  if (a === &#039;64&#039; || a === &#039;86&#039;) return &#039;x&#039; + a;
  return WScript.CreateObject(&#039;WScript.Shell&#039;).Environment(&#039;System&#039;)(&#039;PROCESSOR_ARCHITECTURE&#039;) === &#039;x86&#039; ? &#039;x86&#039; : &#039;x64&#039;;
}

function getCurr(fso) {
  return fso.GetParentFolderName(fso.GetFile(WScript.ScriptFullName));
}

function help() {
  var version = &#039;v0.1.1&#039;, desc = &#039;Lightweight Node Version Manager for Windows&#039;;
  log(desc + &#039; &#039;  + version + &#039;\n&#039; +
      &#039;Commands:&#039; + &#039;\n&#039; +
      &#039;  nvmx latest    [platform]                          Output latest available version&#039; + &#039;\n&#039; +
      &#039;  nvmx all       [platform]                          Output all available versions&#039; + &#039;\n&#039; +
      &#039;  nvmx install   [platform] &lt;version&gt; [architecture] Download and extract (install) &lt;version&gt;&#039; + &#039;\n&#039; +
      &#039;  nvmx list      [platform]           [architecture] Output local versions&#039; + &#039;\n&#039; +
      &#039;  nvmx use       [platform] &lt;version&gt; [architecture] Modify PATH to use &lt;version&gt;&#039; + &#039;\n&#039; +
      &#039;  nvmx remove    [platform] &lt;version&gt; [architecture] Remove (uninstall) &lt;version&gt;&#039; + &#039;\n&#039; +
      &#039;  nvmx uninstall [platform] &lt;version&gt; [architecture] Same as remove&#039; + &#039;\n&#039; +
      &#039;  nvmx ?                                             Output help message&#039; + &#039;\n&#039; +
      &#039;  nvmx                                               Modify PATH to use last used version&#039; + &#039;\n&#039; +
      &#039;  nvmx off                                           Modify PATH to not use nvmx&#039; + &#039;\n&#039; +
      &#039;  nvmx path                                          Output path to nvmx folder&#039; + &#039;\n&#039; +
      &#039;Aliases:&#039; + &#039;\n&#039; +
      &#039;  lt latest    -lt --latest    /lt /latest&#039; + &#039;\n&#039; +
      &#039;  a  all       -a  --all       /a  /all&#039; + &#039;\n&#039; +
      &#039;  i  install   -i  --install   /i  /install&#039; + &#039;\n&#039; +
      &#039;  ls list      -ls --list      /ls /list&#039; + &#039;\n&#039; +
      &#039;  u  use       -u  --use       /u  /use&#039; + &#039;\n&#039; +
      &#039;  rm remove    -rm --remove    /rm /remove&#039; + &#039;\n&#039; +
      &#039;  ui uninstall -ui --uninstall /ui /uninstall&#039; + &#039;\n&#039; +
      &#039;  h  help      -h  --help      /h  /help      ? /?&#039; + &#039;\n&#039; +
      &#039;Platforms:&#039; + &#039;\n&#039; +
      &#039;  node nodejs node.js&#039; + &#039;\n&#039; +
      &#039;  io   iojs   io.js&#039; + &#039;\n&#039; +
      &#039;Architectures:&#039; + &#039;\n&#039; +
      &#039;  x64 64&#039; + &#039;\n&#039; +
      &#039;  x86 86&#039; + &#039;\n&#039; +
      &#039;Defaults:&#039; + &#039;\n&#039; +
      &#039;  platform     = node&#039; + &#039;\n&#039; +
      &#039;  architecture = os architecture&#039;);
}

function quit(code) {
  WScript.Quit(code);
}

function log(s) {
  WScript.Echo(s);
}

function err(s, code) {
  log(s);
  quit(code || 0);
}

</code></pre></div><p>nvmx.bat:<br /></p><div class="codebox"><pre><code>
@echo off
cscript.exe //nologo &quot;%~dp0nvmx.js&quot; %*
if %errorlevel% == 9 (
  call :use
  exit /b
)
exit /b
:use
set /p nvmx=&lt;%~dp0path.txt
set &quot;path=%nvmx%&quot;
</code></pre></div><p>Кстати, возвращаясь к <a href="http://forum.script-coding.com/viewtopic.php?id=10354">одной из предыдущих тем форума</a>: здесь я использую <a href="http://forum.script-coding.com/viewtopic.php?pid=91066#p91066">тот же код</a> для определения разрядности оси.</p>]]></content>
			<author>
				<name><![CDATA[dab00]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=27085</uri>
			</author>
			<updated>2015-02-01T15:58:33Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=91152#p91152</id>
		</entry>
</feed>
