<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[Серый форум &mdash; JScript: Проблема с WshScriptExec.Exec]]></title>
		<link>http://forum.script-coding.com/viewtopic.php?id=5839</link>
		<atom:link href="http://forum.script-coding.com/extern.php?action=feed&amp;tid=5839&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «JScript: Проблема с WshScriptExec.Exec».]]></description>
		<lastBuildDate>Mon, 15 Feb 2016 20:14:59 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Re: JScript: Проблема с WshScriptExec.Exec]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=101124#p101124</link>
			<description><![CDATA[<p><strong>Xameleon</strong></p><p>Спасибо друзья!&nbsp; &nbsp;не думал что тут живенько так.<br />С этим&nbsp; ReadLine - хрен с ним, он то работает после&nbsp; &nbsp;AtEndOfStream</p><p>Зависает и чего-то ждет именно AtEndOfStream<br />Т.е. я не могу узнать когда закончились строки в потоке, где же последняя.<br />Видать да, движок не завершает поток. Он как бы асинхронный, одновременно и принимает и выдает в обе дырки.</p><p>Пока выручила идея такая. <br />Я всегда знаю что движок должен ответить на каждый из запросов. Например я ему - &quot;Эй&quot;,&nbsp; он мне всегда - &quot;тут&quot;<br />Поэтому составил таблицу вопрос-ответ - и у меня последняя строка всегда ожидаемый ответ и я принудительно выхожу из цикла.</p><p>Но это все как-то неправильно.&nbsp; Вдруг он не выдаст ожидаемый ответ, тогда зависон позорный. Не хорошо.</p><p>К сожалению я не очень продвинутый програмер, я по своему - в 1С ковыряю.<br />С этим только столкнулся по причине одного хобби, замутить интересное дело захотелось.</p><p>Поэтому такие вещи:&nbsp; &quot;попробуйте в качестве «движка» сценарий WSH, в котором перед долгим Sleep отсутствует/присутствует WScript.StdOut.Close.&quot;&nbsp; &nbsp;<br />меня вводят в ступор&nbsp; &nbsp;:-)))</p><p>Кста, подозреваю что в этом СЛИП чета кроется хорошее.</p><p>&quot;поможет метод Read&quot;<br />надо это попробовать, хорошая идея, поищу примеры скриптов....<br />Т.е. надежда на то что&nbsp; Read&nbsp; как-то остановится?&nbsp; Т,е. он читает сплошным текстом а не построчно? Это было бы гуд.<br /> а вдруг он после последнего символа также залипнет?</p>]]></description>
			<author><![CDATA[null@example.com (daap)]]></author>
			<pubDate>Mon, 15 Feb 2016 20:14:59 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=101124#p101124</guid>
		</item>
		<item>
			<title><![CDATA[Re: JScript: Проблема с WshScriptExec.Exec]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=101081#p101081</link>
			<description><![CDATA[<p>Господа, помню, что беда метода <strong>ReadLine</strong> именно в том, что он <span class="bbu">ждёт появления перевода строки</span> в <strong>StdOut</strong>. Поэтому если ничего не вернулось, то он реально повисает на этом моменте. Предполагаю, что Вам поможет метод <strong>Read</strong>, который читает N-ое количество символов. Вроде бы на форуме эта тема уже поднималась.</p>]]></description>
			<author><![CDATA[null@example.com (Xameleon)]]></author>
			<pubDate>Mon, 15 Feb 2016 07:53:49 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=101081#p101081</guid>
		</item>
		<item>
			<title><![CDATA[Re: JScript: Проблема с WshScriptExec.Exec]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=101074#p101074</link>
			<description><![CDATA[<div class="quotebox"><cite>daap пишет:</cite><blockquote><p>AtEndOfStream&nbsp; и <br />ReadLine()</p><p>работают до тех пор, пока из потока чего-нибудь читается, когда доходит дело до того, что<br />AtEndOfStream&nbsp; должно вернуть конец - зависон глубокий пока не вырубишь консоль дочернего процесса</p><p>че делать не понятно. другие ж GUI работают с движком этим как-то ....</p><p>похоже что поток как-то не завершается как положено. Или это такой постоянно открытый поток</p></blockquote></div><p>(Сейчас не перепроверял, пишу по воспоминаниям…)</p><p>Да, <em>AtEndOfStream</em> возвращает истинное значение,&nbsp; а <em>ReadLine</em> — пустую строку не в том случае, если поток пуст в данный момент, а если он закрыт, иначе — ждут пока в нём что-нибудь появится или он всё-таки наконец закроется.</p><p>Для проверки попробуйте в качестве «движка» сценарий WSH, в котором перед долгим <em>Sleep</em> отсутствует/присутствует <em>WScript.StdOut.Close</em>.</p><p>Если такое поведение «движка» не устраивает — перенаправьте его вывод в файл, — в этом случае будет определятся конец файла, если считано всё его текущее содержимое, даже если он не закрыт и в него может быть дописано что-то ещё.</p>]]></description>
			<author><![CDATA[null@example.com (wisgest)]]></author>
			<pubDate>Sun, 14 Feb 2016 23:04:04 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=101074#p101074</guid>
		</item>
		<item>
			<title><![CDATA[Re: JScript: Проблема с WshScriptExec.Exec]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=101066#p101066</link>
			<description><![CDATA[<div class="quotebox"><cite>Rumata пишет:</cite><blockquote><p>Тогда пример выше зависает на первом <strong>if</strong></p></blockquote></div><p>Похоже та же картина. Пытаюсь найти с одним консольным движком общий язык.</p><p>AtEndOfStream&nbsp; и <br />ReadLine()</p><p>работают до тех пор, пока из потока чего-нибудь читается, когда доходит дело до того, что<br />AtEndOfStream&nbsp; должно вернуть конец - зависон глубокий пока не вырубишь консоль дочернего процесса</p><p>че делать не понятно. другие ж GUI работают с движком этим как-то ....</p><p>похоже что поток как-то не завершается как положено. Или это такой постоянно открытый поток ..</p>]]></description>
			<author><![CDATA[null@example.com (daap)]]></author>
			<pubDate>Sun, 14 Feb 2016 17:03:57 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=101066#p101066</guid>
		</item>
		<item>
			<title><![CDATA[Re: JScript: Проблема с WshScriptExec.Exec]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=88390#p88390</link>
			<description><![CDATA[<p>Мои последние эксперименты на Win7 Enterprise SP 1 показывают, что не все гладко с этим решением 3-годичной давности. Иногда вышеприведенный код не работает. Например, в случае запуска приложения, которое в случае успеха ничего не пишет в консоль и уходит в фоновый режим. Тогда пример выше зависает на первом <strong>if</strong>. </p><p>Приложение, запущенное в фоне возвращает статус ex.Status == 0, но проблема не в этом. Проблема именно в том, что стандартные потоки открыты/закрыты/заблокированы/ожидают (что-то еще?). Схожий пример я наблюдал в случае проверки STDIN:<br /></p><div class="codebox"><pre><code>
// z.js
WScript.Echo ( WScript.StdIn.AtEndOfStream );
</code></pre></div><p>Если запустить &quot;голый&quot; скрипт, то он подвиснет, пока принудительно не завершите скрипт по CTRL-C:<br /></p><div class="codebox"><pre><code>cscript //nologo z.js</code></pre></div><p>Любое перенаправление - завершает скрипт<br /></p><div class="codebox"><pre><code>
:: выведет -1 (конец файла достигнут)
cscript //nologo z.js&lt;nul

:: выведет 0 (есть данные, конец файла не достигнут)
cscript //nologo z.js&lt;z.js
</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (Rumata)]]></author>
			<pubDate>Sun, 16 Nov 2014 10:33:22 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=88390#p88390</guid>
		</item>
		<item>
			<title><![CDATA[Re: JScript: Проблема с WshScriptExec.Exec]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=50108#p50108</link>
			<description><![CDATA[<p>На официальном сайте MSDN <a href="http://msdn.microsoft.com/en-us/library/za76z6hh%28v=VS.85%29.aspx">есть хороший пример</a>. <br />Привожу чуть сокращенную, не оптимизированную, но рабочую версию исходного кода, который можно посмотреть, пройдя по ссылке. </p><div class="codebox"><pre><code>

var sh = new ActiveXObject(&#039;WScript.Shell&#039;);
var ex = sh.Exec(&#039;%comspec% /c dire&#039;);

var stdout = [];
var stderr = [];

while ( true ) {
	if ( ! ex.StdOut.AtEndOfStream ) {
		stdout.push(ex.StdOut.ReadLine());
		continue;
	}
	if ( ! ex.StdErr.AtEndOfStream ) {
		stderr.push(ex.StdErr.ReadLine());
		continue;
	}
	if ( ex.Status == 1 ) {
		break;
	}
}

WScript.Echo(&#039;\nEXIT CODE :\n&#039; + ex.ExitCode);
WScript.Echo(&#039;\nSTDERR    :\n&#039; + stderr.join(&#039;\n&#039;));
WScript.Echo(&#039;\nSTDOUT    :\n&#039; + stdout.join(&#039;\n&#039;));
WScript.Quit();</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (Rumata)]]></author>
			<pubDate>Fri, 22 Jul 2011 14:51:12 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=50108#p50108</guid>
		</item>
		<item>
			<title><![CDATA[Re: JScript: Проблема с WshScriptExec.Exec]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=49080#p49080</link>
			<description><![CDATA[<div class="quotebox"><cite>jite пишет:</cite><blockquote><p>Задачку принудительного завершения действительно легко сделал...</p></blockquote></div><p>А вот и не работает, если приложение &quot;решает&quot; всерьез зависнуть, а не просто делает большие паузы.<br />Попробую продолжить данные рассуждения в теме <a href="http://forum.script-coding.com/viewtopic.php?pid=49079#p49079">WSH: Работа с командной строкой</a></p>]]></description>
			<author><![CDATA[null@example.com (jite)]]></author>
			<pubDate>Sat, 11 Jun 2011 00:35:45 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=49080#p49080</guid>
		</item>
		<item>
			<title><![CDATA[Re: JScript: Проблема с WshScriptExec.Exec]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=48992#p48992</link>
			<description><![CDATA[<p>Задачку принудительного завершения действительно легко сделал (внутри while перед чтением просто добавляем проверку по времени). Теперь даже непонятно, что же вызывало затруднения раньше? Возможно, что и те самые зависания из примера с MSDN...</p><p>Словом, спасибо за идею (ex.Status == 0)! <img src="//forum.script-coding.com/img/smilies/big_smile.png" width="15" height="15" /></p><div class="quotebox"><cite>jite пишет:</cite><blockquote><p>Странно: раньше пример делал, вроде бы пока стороннее приложение не отрабатывало полностью, оно StdOut.AtEndOfStream не включало. А здесь включает после каждой строки.</p></blockquote></div><p>Поправка. StdOut.AtEndOfStream всегда переходит в true после окончания всей отработки вывода приложения. На момент писания предыдущего поста просто не так понял алгоритм.</p>]]></description>
			<author><![CDATA[null@example.com (jite)]]></author>
			<pubDate>Mon, 06 Jun 2011 21:54:18 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=48992#p48992</guid>
		</item>
		<item>
			<title><![CDATA[Re: JScript: Проблема с WshScriptExec.Exec]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=48976#p48976</link>
			<description><![CDATA[<p>Win XP - то же поведение. До 4KB способ MSDN читает, после - виснет. Продвинутый способ работает хорошо, тестировались размеры буфера до 3 MB (42 сек. на Intel E7200) <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" /></p><p>Реального использования &quot;дочитывания&quot; буфера в продвинутом способе замечено не было.</p><p>Решил помониторить объемы считывания с хронометражом. Одна строка нулей читалась, как можно догадаться, все время одним куском. Для приближения к реальности дописал генератор строк случайной длины из случайных символов. Вот код:<br /></p><div class="codebox"><pre><code>// размер буфера в байтах
var n = Math.floor(1024 * 3);
var sNL = &quot;\n&quot;; //Символ(ы) переноса строки
// вывод заданного количества символов
// количество опеделяется переменной n
if (WScript.Arguments.Named.Exists(&#039;INIT&#039;)) {
  //var s = new Array(n + 1).join(&#039;0&#039;); //Было
  var nLinesCount = 0;
  var nNewLineLen;
  var s = &quot;&quot;;
  while (s.length &lt; n) {
    nNewLineLen = Math.floor(Math.random() * 400); //Случайная длина строки 0...399 символов
    var ss = &quot;&quot;; //Строчка, заканчивающаяся переносом
    for ( var i = 0; i &lt; nNewLineLen; i++) {
      var nCode = Math.floor(Math.random() * (123 - 33)) + 33; //Латинские + точки-звездочки-и-тд.
      ss += String.fromCharCode(nCode);
    }
    s += ss + sNL;
    nLinesCount++;
  }
  s = s.substring(0, n);
  WScript.StdOut.Write(s);
  WScript.Quit(nLinesCount);
}

// внутренняя команда вывода
var cmd = &#039;cscript //nologo &#039; + WScript.ScriptName + &#039; /INIT&#039;;

var sh = new ActiveXObject(&#039;WScript.Shell&#039;);
var ex = sh.Exec(cmd);

// массив для заполнения данными внутреннего скрипта
var result = [], times = [];
var t = new Timer();
if (WScript.Arguments.Named.Exists(&#039;ADV&#039;)) {
  // &quot;расширенный алгоритм
  while (ex.Status == 0) {
    if (ex.StdOut.AtEndOfStream) {
      break;
    }
    result.push(ex.StdOut.ReadLine());
    t.Stop();
    times.push(t + &quot;  &quot; + result[result.length - 1].length + &quot; символов&quot;);
  }
  while (!ex.StdOut.AtEndOfStream) {
    result.push(ex.StdOut.ReadLine());
    t.Stop();
    times.push(&quot;дочитывание &quot; + t + &quot;  &quot; + result[result.length - 1].length + &quot; символов&quot;);
  }
}
else {
  // стандартный алгоритм (взят из документации MSDN)
  while (ex.Status == 0) {
    WScript.Sleep(100);
  }
  while (!ex.StdOut.AtEndOfStream) {
    result.push(ex.StdOut.ReadLine());
    t.Stop();
    times.push(t + &quot;  &quot; + result[result.length - 1].length + &quot; символов&quot;);
  }
}

// Вывод статуса внутреннего процесса и размера буфера
//vard(result, &quot;Считанные блоки&quot;); //Посмотреть генерируемый текст :)
vard(times, &quot;Хронология чтений&quot;);
WScript.Echo(&quot;Скрипт-генератор &quot; + (ex.Status ? (&quot;завершен, сгенерировано строк: &quot; + ex.ExitCode) : &quot;не завершен&quot;));
WScript.Echo(&quot;Символов прочтено &quot; + result.join(sNL).length);
t.Stop();
WScript.Echo(&quot;Конец работы &quot; + t);

//=== DEBUG_STUFF ==========================================================

/** Возвращает строку рекурсивного описания содержимого объекта oBj
 * @param sParentName - имя объекта, произвольное, по сути комментарий (можно опустить)
 * @param nEsting - максимальный уровень вложенности объектов/значений (можно опустить)
 */
function vardump(oBj, sParentName, nEsting) {
  var sNL = &quot;\r\n&quot;; // Перенос строки 
  var nEsting_max = 12; //Максимальный исследуемый уровень вложенности, против бесконечных ссылок на самого себя
  var nPadding = 2; //Структурный отступ сдвига потомков относительно родителей, в пробелах
  //Ограничивать ли слишком длинное отображение объекта в поле &gt;значения&lt;
  var bRestrictObjectVal = true, nRestrictWidth = 80, sCutSign = &quot;...&quot;;
  var bShowOnlyOwnProps = false; //Показывать только собственные (уникальные) свойства объекта или все приобретенные
  var bShowFunctionsCode = false; //Показывать ли код функций
  if (sParentName == undefined) sParentName = &quot;&quot;;
  if (isNaN(parseInt(nEsting))) nEsting = nEsting_max;
  var sRes = &quot;&quot;;
  for ( var i = 0; i &lt; nPadding * (nEsting_max - nEsting); i++)
    sRes += &quot; &quot;;
  if (nEsting &gt;= 0) {
    var sPrototype = Object.prototype.toString.call(oBj); //[object НекийТип], вызов через ***
    sRes += sParentName + &quot;  &quot;;
    switch (typeof oBj) { //Описание элемента toString() и обрамление в соответствии с его типом 
    case &quot;string&quot;:
      sRes += &quot;\&quot;&quot; + oBj + &quot;\&quot;&quot;;
      break;
    case &quot;function&quot;:
      if (sPrototype == &quot;[object RegExp]&quot;) sRes += oBj + &quot;  as function&quot;; //В Chrome typeof =&gt; function
      else {
        var s = &quot;&quot; + oBj;
        var nIdx = s.indexOf(&quot;)&quot;) + 1;
        if (nIdx) s = s.substring(0, nIdx);
        else
          s = &quot;function&quot;; //Не должно произойти
        sRes += s;
      }
      break;
    case &quot;object&quot;:
      if (Object.prototype.toString.call(oBj) == &quot;[object Array]&quot;) { //Для массива - еще длину
        sRes += &quot;Array[&quot; + oBj.length + &quot;]  &quot;;
      }
      if (Object.prototype.toString.call(oBj) == &quot;[object Date]&quot; //Объекты с простым и информативным содерж. toString() 
        || Object.prototype.toString.call(oBj) == &quot;[object RegExp]&quot;) {
        sRes += oBj;
      }
      else { //Вывод прочих объектов и массивов
        sRes += &quot;&gt;&quot;;
        var sOTS = (&quot;&quot; + oBj).replace(/\r/g, &quot;\\r&quot;).replace(/\n/g, &quot;\\n&quot;);
        if (bRestrictObjectVal) { //Если надо, подрезаем слишком длинные описания в строку
          var nMaxOTSLength = nRestrictWidth - sRes.length - 1; //-1 под &quot;&lt;&quot;
          var nCutOSTLength = nMaxOTSLength - sCutSign.length;
          if (nCutOSTLength &lt; 0) nCutOSTLength = 0; //Ну да, вылезет...
          if (sOTS.length &gt; nMaxOTSLength) sOTS = sOTS.substr(0, nCutOSTLength) + sCutSign;
        }
        sRes += sOTS + &quot;&lt;&quot;;
      }
      break;
    default: //числа, спецзначения, логические
      sRes += oBj;
    }
    sRes += sNL;
    //Вывод содержимого объекта: строками следующего уровня иерархии
    var sEl;
    var sGetChildName =
      function(oParent, sParentName, sChildName) { //Формирование имени потомка
        var sFullChildName = sParentName;
        var bIsIndex = false;
        if (Object.prototype.toString.call(oParent) == &quot;[object Array]&quot;) {
          var nIdx = parseInt(sChildName, 10);
          if (!isNaN(nIdx) &amp;&amp; nIdx.toString() === sChildName.toString() &amp;&amp; nIdx &gt;= 0 &amp;&amp; nIdx &lt; oParent.length)
            bIsIndex = true;
        }
        if (bIsIndex) sFullChildName += &quot;[&quot; + sChildName + &quot;]&quot;;
        else {
          if (sFullChildName != &quot;&quot;) sFullChildName += &quot;.&quot;; //Если есть что отделять, отделяем точкой
          sFullChildName += sChildName;
        }
        return sFullChildName;
      }; //sGetChildName

    if (Object.prototype.toString.call(oBj) == &quot;[object RegExp]&quot;) { //В завис. от браузера typeof то object, то function
      sEl = &quot;lastIndex&quot;;
      sRes += arguments.callee(oBj[sEl], sGetChildName(oBj, sParentName, sEl), nEsting - 1);
    }
    else { //Осмотрим внутренности
      switch (typeof oBj) {
      case &quot;object&quot;: //Объекты и массивы
        if (!oBj) break; //null
        for (sEl in oBj) {
          if (bShowOnlyOwnProps &amp;&amp; !oBj.hasOwnProperty(sEl)) break;
          sRes += arguments.callee(oBj[sEl], sGetChildName(oBj, sParentName, sEl), nEsting - 1);
        }
        break;
      case &quot;function&quot;:
        if (bShowFunctionsCode) sRes += &quot;&gt;&gt;&gt;&quot; + sNL + oBj + &quot;&lt;&lt;&lt;&quot; + sNL;
        break;
      //Остальное содержимого не имеет
      }
    }
  }
  else
    sRes += sParentName + &quot; ! Nesting limit !&quot; + sNL;
  return(sRes);
}

/** Echo-обертка
 */
function vard() {
  WScript.Echo(vardump.apply(null, arguments));
}

/** Класс замеров временных промежутков ------------------------------------
 */
function Timer() {
  this.StartTime = this.StopTime = new Date(); //Сразу начинает отсчет

  //--- Методы

  /** Начинает отсчет, возвращает дату начала
   */
  this.Start = function() {
    return this.StartTime = this.StopTime = new Date();
  };

  /** Отмечает конечную точку отсчета (при этом по сути отсчет не останавливается), возвращает дату конца
   */
  this.Stop = function() {
    return this.StopTime = new Date();
  };

  /** Возвращает время (мс) между StartTime и StopTime
   */
  this.Interval = function() {
    return this.StopTime - this.StartTime;
  };

  /** Возвращает текстовое представление интервала &quot;чч:мм:сс.мсс&quot;
   */
  this.toString = function() {
    var nInt = this.Interval();
    var aInt = [0, 0, 0, 0]; //Период поделенный на мс, с, м, ч 
    var aDivs = [1000, 60, 60, 10000000]; //Делители
    var aDelims = [&quot;.&quot;, &quot;:&quot;, &quot;:&quot;, &quot;&quot;]; //Разделители
    for ( var i = 0; i &lt; 4; i++) {
      aInt[i] = nInt % aDivs[i];
      if (aInt[i] == nInt) break; //Все поделено
      nInt = Math.floor(nInt / aDivs[i]);
    }
    var sInt = &quot;&quot;;
    for ( var i = 0; i &lt; 4; i++)
      sInt = aDelims[i] + sLeadingSigns(aInt[i]) + sInt;
    return sInt;
  };

  /** Дополняет текстовое представление oBj знаками sSign (по ум. нулями) до длины nOutLength. 
   * Минус выносится вперед, если не выставленно bDoNotMinusMove
   */
  function sLeadingSigns(oBj, nOutLength, sSign, bDoNotMinusMove) {
    if (sSign == undefined) sSign = &quot;0&quot;;
    sSign = &quot;&quot; + sSign;
    nOutLength = parseInt(nOutLength, 10);
    if (isNaN(nOutLength) || nOutLength &lt; 1) nOutLength = 2; //По ум.
    var sObj = &quot;&quot; + oBj;
    if (sObj.length &lt; nOutLength) { //Если надо удлинять
      var nZeros = nOutLength - sObj.length;
      var sZeros = &quot;&quot;;
      for ( var i = 0; i &lt; nZeros; i++)
        sZeros += sSign;
      return bDoNotMinusMove ? sZeros + sObj : sObj.replace(/(\-{0,1})(.+)/, &quot;$1&quot; + sZeros + &quot;$2&quot;);
    }
    else
      return sObj;
  }

} //Timer()</code></pre></div><p>Как можно видеть, все читается четко построчно: сколько строк выдано, столько раз и ReadLine(). Собсно, как и ожидалось в теории.</p><p>А вся затея с хронометражом произошла из-за желания понять особенности чтения и решить задачу чтения вывода приложения, которое может зависнуть, <strong>с возможностью его принудительного завершения</strong> по таймлимиту или по результатам чтения вывода. А тут как раз родственная тема! <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" /></p><p>Надеюсь, из приведенного примера вполне удастся такое соорудить. Странно: раньше пример делал, вроде бы пока стороннее приложение не отрабатывало полностью, оно StdOut.AtEndOfStream не включало. А здесь включает после каждой строки. <img src="//forum.script-coding.com/img/smilies/roll.png" width="15" height="15" /> Надо перепроверить...</p>]]></description>
			<author><![CDATA[null@example.com (jite)]]></author>
			<pubDate>Sun, 05 Jun 2011 23:46:00 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=48976#p48976</guid>
		</item>
		<item>
			<title><![CDATA[Re: JScript: Проблема с WshScriptExec.Exec]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=48923#p48923</link>
			<description><![CDATA[<p>Коллеги, спасибо за обсуждение. Кажется общими усилиями мы нашли причину проблемы. </p><p>В какой-то момент я начал догадываться, что проблема как-то связана с размером выходного потока запускаемого процесса. Честно говоря, какое-то время мне было несколько лениво запускать тесты в поисках лимита размера буфера выходного потока. Еще более лениво было искать в интернетах описание этой проблемы. Но желание решить проблему пересилило первую лень. Следующий скрипт помогает найти этот пресловутый лимит. </p><p>Как это работает<br />1. Скрипт запускается из командной строки с или без ключа /GOOD или /BAD<br />2. Скрипт запускает самого себя с ключом /INIT чтобы вывести в выходной поток n-ное количество символов<br />3. Скрипт из п.1 читает выходной поток скрипта из п.2 и &quot;собирает&quot; его вывод в массив<br />4. По окончании выводит количество считанных байт. </p><p>Количество выводимых символов задается переменной n в первой строке скрипта. Примеры вызова:<br /></p><div class="quotebox"><blockquote><p>// проверка &quot;стандартного&quot; алгоритма<br />cscript 1.js</p><p>// поверка &quot;расширенного&quot; алгоритма<br />cscript 1.js /ADV</p></blockquote></div><p>необходимо варьировать значение переменной n. Мои результаты утверждают, что стандартный алгоритм &quot;вешается&quot; при размере выходного потока превышающем 4 КБ. </p><p>&quot;Стандартный&quot; алгоритм запускает внешний скрипт и ожидает его завершение (while WshScriptExec.Exec.Status == 0). После этого считывает выходной поток.</p><p>&quot;Расширенный&quot; алгоритм запускает внешний скрипт и ожидая его завершения считывает выходной поток. Так как чтение потока теоретически может завершиться раньше полной записи процессом в поток, выполняется повторное чтение потока до его конца. Такая схема гарантирует а) корректное завершение работы внешнего процесса; б) полное чтение его выходного потока. </p><div class="codebox"><pre><code>
// размер буфера в байтах
var n = Math.floor(1024 * 4);

// вывод заданного количества символов
// количество опеделяется переменной n
if ( WScript.Arguments.Named.Exists(&#039;INIT&#039;) ) {
	var s = new Array(n + 1).join(&#039;0&#039;);
	WScript.StdOut.Write(s);
	WScript.Quit();
}

// внутренняя команда вывода
var cmd = &#039;cscript //nologo &#039; + WScript.ScriptName + &#039; /INIT&#039;;

var sh = new ActiveXObject(&#039;WScript.Shell&#039;);
var ex = sh.Exec(cmd);

// массив для заполнения данными внутреннего скрипта
var result = [];
if ( WScript.Arguments.Named.Exists(&#039;ADV&#039;) ) {
	// &quot;расширенный алгоритм
	while ( ex.Status == 0 ) {
		if ( ex.StdOut.AtEndOfStream ) {
			break;
		}
		result.push(ex.StdOut.ReadLine());
	}
	while ( ! ex.StdOut.AtEndOfStream ) {
		result.push(ex.StdOut.ReadLine());
	}
} else {
	// стандартный алгоритм (взят из документации MSDN)
	while ( ex.Status == 0 ) {
		WScript.Sleep(100);
	}
	while ( ! ex.StdOut.AtEndOfStream ) {
		result.push(ex.StdOut.ReadLine());
	}
}

// Вывод статуса внутреннего процесса и размера буфера
WScript.Echo(ex.Status);
WScript.Echo(result.join(&#039;&#039;).length);</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (Rumata)]]></author>
			<pubDate>Thu, 02 Jun 2011 19:23:57 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=48923#p48923</guid>
		</item>
		<item>
			<title><![CDATA[Re: JScript: Проблема с WshScriptExec.Exec]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=48897#p48897</link>
			<description><![CDATA[<p><strong>2 shiz:</strong> Посмотрел примеры. <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" /> Благодарю. Видимо и правда я ошибался. Значит всё таки <strong>AtEndOfStream</strong> срабатывает один раз.</p>]]></description>
			<author><![CDATA[null@example.com (Xameleon)]]></author>
			<pubDate>Thu, 02 Jun 2011 08:58:41 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=48897#p48897</guid>
		</item>
		<item>
			<title><![CDATA[Re: JScript: Проблема с WshScriptExec.Exec]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=48874#p48874</link>
			<description><![CDATA[<div class="quotebox"><cite>Rumata пишет:</cite><blockquote><p>То есть я столкнулся с ситуацией о которой говорил коллега Xameleon: </p><div class="quotebox"><cite>Xameleon пишет:</cite><blockquote><p>... StdOut.AtEndOfStream может принимать значение True, если Вы успели считать из него (буфера) все данные, а новые ещё не были положены. Такое может происходить в процессе перебора в любой момент...</p></blockquote></div></blockquote></div><p>Коллега Xameleon был бы прав, если бы мы запустили приложение перенаправив его выходной поток в физический файл и одновременно производили бы чтение из этого файла.<br />В данном же случае это не так. Для проверки предлагаю создать 2-3 простейших скрипта:</p><p>- ведомый (test1.js) </p><div class="codebox"><pre><code>var n=10;   //число повторов
var t=1000; //задержка между повторами, мс

for (var i=0; i&lt;n; i++) {WScript.Sleep(t); WScript.Echo(i);}</code></pre></div><p>- и запускающий его ведущий (в 2-х вариантах):<br /></p><div class="codebox"><pre><code>var WshShell=new ActiveXObject(&quot;WScript.Shell&quot;);
var WshExec=WshShell.Exec(&quot;CScript.exe //nologo test1.js&quot;);
WScript.Echo(WshExec.StdOut.ReadAll());</code></pre></div><div class="codebox"><pre><code>var WshShell=new ActiveXObject(&quot;WScript.Shell&quot;);
var WshExec=WshShell.Exec(&quot;CScript.exe //nologo test1.js&quot;);
var result=&quot;&quot;;
while (!WshExec.StdOut.AtEndOfStream) result+=WshExec.StdOut.ReadLine()+&quot;\n&quot;;
WScript.Echo(result);</code></pre></div><p>Так что ваши трудности, вероятно, связаны с чем-то другим.</p>]]></description>
			<author><![CDATA[null@example.com (shiz)]]></author>
			<pubDate>Wed, 01 Jun 2011 21:35:05 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=48874#p48874</guid>
		</item>
		<item>
			<title><![CDATA[Re: JScript: Проблема с WshScriptExec.Exec]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=48845#p48845</link>
			<description><![CDATA[<p><strong>shiz</strong>, не делайте скоропалительных выводов. &quot;Ненужное&quot; ожидание необходимо, чтобы скрипт дождался окончания вызванного процесса. Из моих экспериментов я увидел, что скрипт не может дождаться окончания выполнения процесса. Простым удалением фрагмента кода ожидания проблема не решается. Хотя я и писал в #13, что код рабочий, но иногда он не прочитывает весь выходной поток процесса. То есть я столкнулся с ситуацией о которой говорил коллега <strong>Xameleon</strong>:</p><div class="quotebox"><cite>Xameleon пишет:</cite><blockquote><p>... <strong>StdOut.AtEndOfStream</strong> может принимать значение <strong>True</strong>, если Вы успели считать из него (буфера) все данные, а новые ещё не были положены. Такое может происходить в процессе перебора в любой момент...</p></blockquote></div>]]></description>
			<author><![CDATA[null@example.com (Rumata)]]></author>
			<pubDate>Tue, 31 May 2011 05:12:21 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=48845#p48845</guid>
		</item>
		<item>
			<title><![CDATA[Re: JScript: Проблема с WshScriptExec.Exec]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=48839#p48839</link>
			<description><![CDATA[<p>Удивительно, что такой простой вопрос вызвал такое мощное обсуждение!<br />Просто уберите из исходного примера ненужное ожидание<br /></p><div class="codebox"><pre><code>while ( ex.Status == 0 ) {
    WScript.Sleep(100);
}</code></pre></div><p>- WshScriptExec.StdOut.ReadAll() всё равно будет ждать пока запущенное приложение не закроет свой выходной поток (во многих случаях это крайне неудобно, но не в этом).</p>]]></description>
			<author><![CDATA[null@example.com (shiz)]]></author>
			<pubDate>Mon, 30 May 2011 21:14:18 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=48839#p48839</guid>
		</item>
		<item>
			<title><![CDATA[Re: JScript: Проблема с WshScriptExec.Exec]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=48775#p48775</link>
			<description><![CDATA[<p><strong>JSman</strong>, имеется в виду поиск файлов? Пока еще нет. Решение пока сыровато и требует некоторой доработки. Добавлю, как только приду к выводу, что решение может быть опубликовано.</p>]]></description>
			<author><![CDATA[null@example.com (Rumata)]]></author>
			<pubDate>Sun, 29 May 2011 12:01:37 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=48775#p48775</guid>
		</item>
	</channel>
</rss>
