Запуск дочерних консольных приложений и команд 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;