Во-первых, ваш цикл прерывается тем, что он всегда сначала пытается прочитать из oExec.StdOut
. Если нет фактического вывода, то он будет зависать, пока не будет. Вы не увидите никаких выводов StdErr
, пока StdOut.atEndOfStream
не станет истинным (возможно, когда ребенок завершит работу). К сожалению, в скриптовом движке нет концепции неблокирующего ввода-вывода. Это означает вызов read
и немедленное его возвращение, если в буфере нет данных. Таким образом, вероятно, нет способа заставить этот цикл работать так, как вы хотите. Во-вторых, WShell.Run
не предоставляет никаких свойств или методов для доступа к стандартному вводу-выводу дочернего процесса. Он создает дочерний элемент в отдельном окне, полностью изолированном от родительского, за исключением кода возврата. Однако, если все, что вам нужно, это иметь возможность УВИДЕТЬ выходные данные от потомка, тогда это может быть приемлемым Вы также сможете взаимодействовать с ребенком (ввод), но только через новое окно (см. SendKeys
).
Что касается использования ReadAll()
, это было бы еще хуже, поскольку он собирает все входные данные из потока перед возвратом, поэтому вы ничего не увидите, пока поток не будет закрыт. Я понятия не имею, почему пример помещает ReadAll
в цикл, который строит строку, одного if (!WScript.StdIn.AtEndOfStream)
должно быть достаточно, чтобы избежать исключений.
Другой альтернативой может быть использование методов создания процесса в WMI. Как обрабатывается стандартный ввод / вывод, неясно, и, похоже, нет никакого способа выделить определенные потоки как StdIn
/ Out
/ Err
. Единственная надежда будет состоять в том, что ребенок унаследует это от родителя, но это то, что вы хотите, не так ли? (Этот комментарий основан на идее и небольшом исследовании, но не на реальных тестах.)
По сути, система сценариев не предназначена для сложной межпроцессной коммуникации / синхронизации.
Примечание. Тесты, подтверждающие вышесказанное, были выполнены в Windows XP Sp2 с использованием версии 5.6 Script. Ссылка на текущие (5.8) руководства предполагает отсутствие изменений.