Запуск дочерних консольных приложений и команд DOS, использование их входных и выходных потоков

Консольное приложение или команду DOS можно запустить из сценария как дочернюю задачу, т. е. с теми же переменными среды, что у процесса-родителя. При этом информация, выводимая дочерним процессом, на экран дублироваться не будет, однако из родительского сценария можно считывать информацию из выходного потока и посылать данные во входной поток дочерней задачи (это напоминает конвейеризацию команд Windows, при которой данные выходного потока одной команды поступают во входной поток другой команды, например DIR | MORE ). Таким образом, из сценария можно запускать ту или иную утилиту командной строки и обрабатывать выводимые ей данные; иногда таким образом получить нужную информацию бывает проще и быстрее, чем при использовании объектной модели WSH или другого сервера автоматизации.

В качестве примера рассмотрим сценарий ExecConApp.vbs (листинг 7.5), который выводит на экран общее количество файлов в текущем каталоге и их имена. Данную информацию можно получить в сеансе командной строки с помощью команды DIR /B. Поэтому в сценарии мы запустим в качестве дочернего процесса внутреннюю команду DIR с ключом /B:

Set ObjExec=WshShell.Exec("%COMSPEC% /c dir /b")

и полностью считаем данные, появляющиеся в выходном потоке этого процесса. Для этого в цикле вызывается метод ReadAll, считывающий всю информацию, имеющуюся к тому времени в потоке StdOut объекта ObjExec, в переменную s:

IsBreak=False

Do While True ' Бесконечный цикл

' Проверяем, достигнут ли конец выходного потока команды DIR

If (Not ObjExec.StdOut.AtEndOfStream) Then

' Считываем полностью выходной поток команды DIR

s=s+ObjExec.StdOut.ReadAll

End If

If IsBreak Then

Exit Do ' Выходим из цикла

End If

' Проверяем, не завершилось ли выполнение DIR

If ObjExec.Status=1 Then

IsBreak=True

Else

WScript.Sleep 100 ' Приостанавливаем сценарий на 0,1 сек

End If

Loop

Родительский и дочерний процессы работают асинхронно, поэтому пока команда DIR не перестанет выдавать данные, т. е. пока свойство Status объекта ObjExec не станет равным 1, выполнение сценария с помощью метода WScript.Sleep периодически приостанавливается на 0,1 секунды.

После того как считаны все данные из выходного потока команды DIR (свойство ObjExec.StdOut.AtEndOfStream равно True ), происходит выход из цикла и формирование из переменной s массива выведенных строк:

ArrS=Split(s,vbCrLf) ' Формируем массив строк

Теперь остается подсчитать количество файлов в каталоге, которое на единицу меньше количества строк в массиве ArrS:

ColFiles=UBound(ArrS) ' Количество файлов в текущем каталоге

и вывести нужные строки на экран:

WScript.StdOut.WriteLine "Всего файлов в текущем каталоге: " & ColFiles

For i=0 To ColFiles-1

WScript.StdOut.WriteLine ArrS(i) ' Выводим строки на экран

Next

'*******************************************************************

' Имя: ExecConApp.vbs

' Язык: VbScript

' Описание: Запуск дочернего консольного приложения

'*******************************************************************

Option Explicit

' Объявляем переменные

Dim ObjExec,WshShell,s,IsBreak,ArrS,ColFiles,i

' Создаем объект WshShell

Set WshShell = WScript.CreateObject("WScript.Shell")

' Запускаем команду DIR

Set ObjExec=WshShell.Exec("%COMSPEC% /c dir /b")

s=""

IsBreak=False

Do While True ' Бесконечный цикл

' Проверяем, достигнут ли конец выходного потока команды DIR

If (Not ObjExec.StdOut.AtEndOfStream) Then

' Считываем полностью выходной поток команды DIR

s=s+ObjExec.StdOut.ReadAll

End If

If IsBreak Then

Exit Do ' Выходим из цикла

End If

' Проверяем, не завершилось ли выполнение DIR

If ObjExec.Status=1 Then

IsBreak=True

Else

WScript.Sleep 100 ' Приостанавливаем сценарий на 0,1 сек

End If

Loop

ArrS=Split(s,vbCrLf) ' Формируем массив строк

ColFiles=UBound(ArrS) ' Количество файлов в текущем каталоге

WScript.StdOut.WriteLine "Всего файлов в текущем каталоге: " & ColFiles

For i=0 To ColFiles-1

WScript.StdOut.WriteLine ArrS(i) ' Выводим строки на экран

Next

'************* Конец *********************************************

Листинг 7.5. Запуск дочернего консольного приложения (VBScript)

 








Дата добавления: 2018-03-01; просмотров: 487;


Поиск по сайту:

При помощи поиска вы сможете найти нужную вам информацию.

Поделитесь с друзьями:

Если вам перенёс пользу информационный материал, или помог в учебе – поделитесь этим сайтом с друзьями и знакомыми.
helpiks.org - Хелпикс.Орг - 2014-2024 год. Материал сайта представляется для ознакомительного и учебного использования. | Поддержка
Генерация страницы за: 0.009 сек.