Чтение онлайн

на главную - закладки

Жанры

Windows Script Host для Windows 2000/XP

Попов Андрей Викторович

Шрифт:

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

s+=ObjExec.StdOut.ReadAll;

 if (IsBreak) break; //Выходим из цикла

 if (ObjExec.Status==1) //Проверяем, не завершилось ли выполнение DIR

IsBreak=true;

 else WScript.Sleep(100); //Приостанавливаем сценарий на 0,1 сек

}

Рис. 2.14. Результат выполнения команды

DIR /B

Родительский и дочерний процессы работают асинхронно, поэтому пока команда

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

После того как считаны все данные из выходного потока команды

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

ArrS=s.split("\n");

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

ArrS
:

ColFiles=ArrS.length-1;

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

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

for (i=0;i<=ColFiles-1; i++ )

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

Замечание

В дочернем консольном приложении вывод строк в выходной поток происходит в DOS-кодировке, поэтому при наличии символов кириллицы эти строки нужно преобразовывать в кодировку Windows (примеры соответствующих функций конвертации на языках JScript и VBScript приведены в листингах 2.14 и 2.15).

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

/*******************************************************************/

/* Имя: ExecConApp.js */

/* Язык: JScript */

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

/*******************************************************************/

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

var ObjExec,WshShell,s,IsBreak,ArrS,ColStr,ColFiles,i;

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

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

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

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

s="";

IsBreak=false;

for (;;) { //Бесконечный цикл

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

 if (!ObjExec.StdOut.AtEndOfStream)

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

s+=ObjExec.StdOut.ReadAll;

 if (IsBreak) break; //Выходим из цикла

 if (ObjExec.Status==1) //Проверяем, не завершилось ли выполнение DIR

IsBreak=true;

 else WScript.Sleep(100); //Приостанавливаем сценарий на 0,1 сек

}

ArrS=s.split("\n"); //Формируем массив строк

ColFiles=ArrS.length-1; // Количество файлов в текущем каталоге

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

for (i=0;i<=ColFiles-1;i++)

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

/************* Конец *********************************************/

Аналогичный сценарий на языке VBScript приведен в листинге 2.37.

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

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

' Имя: ExecConApp.vbs

' Язык: VbScript

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

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

Option Explicit

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

Dim ObjExec,WshShell,s,IsBreak,ArrS,ColStr,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

Поделиться:
Популярные книги

Охотник за головами

Вайс Александр
1. Фронтир
Фантастика:
боевая фантастика
космическая фантастика
5.00
рейтинг книги
Охотник за головами

Тыл-фронт

Головин Андрей
Проза:
военная проза
проза прочее
5.00
рейтинг книги
Тыл-фронт

Наследник старого рода

Шелег Дмитрий Витальевич
1. Живой лёд
Фантастика:
фэнтези
8.19
рейтинг книги
Наследник старого рода

Я все еще не царь. Книга XXVI

Дрейк Сириус
26. Дорогой барон!
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Я все еще не царь. Книга XXVI

Кодекс Императора II

Сапфир Олег
2. Кодекс Императора
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Кодекс Императора II

Двойник Короля 8

Скабер Артемий
8. Двойник Короля
Фантастика:
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Двойник Короля 8

Око василиска

Кас Маркус
2. Артефактор
Фантастика:
городское фэнтези
попаданцы
аниме
5.00
рейтинг книги
Око василиска

Неправильный лекарь. Том 1

Измайлов Сергей
1. Неправильный лекарь
Фантастика:
городское фэнтези
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Неправильный лекарь. Том 1

Развод. Без права на ошибку

Ярина Диана
Любовные романы:
современные любовные романы
короткие любовные романы
5.00
рейтинг книги
Развод. Без права на ошибку

Я не царь. Книга XXIV

Дрейк Сириус
24. Дорогой барон!
Фантастика:
юмористическое фэнтези
аниме
попаданцы
5.00
рейтинг книги
Я не царь. Книга XXIV

Гранит науки. Том 2

Зот Бакалавр
2. Героями не становятся, ими умирают
Фантастика:
фэнтези
5.00
рейтинг книги
Гранит науки. Том 2

Сирийский рубеж

Дорин Михаил
5. Рубеж
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Сирийский рубеж

Двойник короля 14

Скабер Артемий
14. Двойник Короля
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Двойник короля 14

Законы Рода. Том 7

Мельник Андрей
7. Граф Берестьев
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Законы Рода. Том 7