Книга: Windows Script Host для Windows 2000/XP

Свойства StdOut, StdIn и StdErr

Свойства StdOut, StdIn и StdErr

Работать c потоками StdOut, StdIn и StdErr объекта WshScriptExec можно с помощью тех же методов, которые применяются в объекте WScript для доступа к соответствующим стандартным потокам (см. табл. 1.3). Например, запустив приведенный в листинге 1.27 сценарий ConToWin.js с помощью wscript.exe, мы выведем в графическое окно информацию о ключах программы cscript.exe (рис. 1.13).


Рис. 1.13. Результат выполнения сценария ConToWin.js

Отметим, что запускаемое консольное приложение cscript.exe выводит символы кириллицы в DOS-кодировке, поэтому для вывода таких символов в графическое окно их нужно преобразовать в Windows-кодировку. В рассматриваемом сценарии это делается с помощью функции DosToWin, которая преобразует переданную в качестве параметра строку следующим образом: все символы кириллицы в этой строке переводятся в Windows-кодировку, остальные символы остаются без изменений:

function DosToWin(s) {
 var i,ss;  //Объявляем переменные
 //Проверяем, создан ли объект RusDict
 if (typeof(RusDict)=="undefined")
  //Если объект RusDict не создан, создаем его
  MakeRusDict();
 ss="";
 for (i=0;i<s.length;i++) {  //Цикл по всем символам в строке
  if (RusDict.Exists(s.charAt(i)))  //Проверяем наличие символа в словаре
   //Преобразуем i-й символ в Windows-кодировку
   ss+=RusDict.Item(s.charAt(i));
  else ss+=s.charAt(i);
 }
 return ss;
}

Основным в функции DosToWin является использование объекта Dictionary с именем RusDict. Этот объект формируется в функции MakeRusDict и содержит пары "ключ"–"знaчeниe" для всех букв русского алфавита, причем в качестве ключа указывается буква в DOS-кодировке, а в качестве значения — символ с кодом, который соответствует этой букве в Windows-кодировке.

//Функция для создания объекта Dictionary с парами "ключ-значение", где
//"ключ"-буква в DOS-кодировке, "значение"- символ, соответствующий этой
//букве в Windows-кодировке
function MakeRusDict() {
 //Создаем объект Dictionary
 RusDict = WScript.CreateObject("Scripting.Dictionary");
 //Заполняем пары "ключ" (символ в DOS-кодировке)- "значение" (символ в
 //Window-кодировке) для всех букв русского алфавита
 RusDict.add("Ђ", "А"); RusDict.add("Ѓ", "Б"); RusDict.add("‚", "В");
 RusDict.add("ѓ", "Г"); RusDict.add("„", "Д"); RusDict.add("…", "Е");
 RusDict.add("р", "Ё"); RusDict.add("†", "Ж"); RusDict.add("‡", "З");
 RusDict.add("€", "И"); RusDict.add("‰", "Й"); RusDict.add("Љ", "К");
 RusDict.add("‹", "Л"); RusDict.add("Њ", "М"); RusDict.add("Ќ", "Н");
 RusDict.add("Ћ", "О"); RusDict.add("Џ", "П"); RusDict.add("ђ", "Р");
 RusDict.add("‘", "С"); RusDict.add("’", "Т"); RusDict.add("“", "У");
 RusDict.add("”", "Ф"); RusDict.add("•", "Х"); RusDict.add("–", "Ц");
 RusDict.add("—", "Ч"); RusDict.add("?", "Ш"); RusDict.add("™", "Щ");
 RusDict.add("љ", "Ъ"); RusDict.add("›", "Ы"); RusDict.add("њ", "Ь");
 RusDict.add("ќ", "Э"); RusDict.add("ћ", "Ю"); RusDict.add("џ", "Я");
 RusDict.add(" ", "а"); RusDict.add("Ў", "б"); RusDict.add("ў", "в");
 RusDict.add("Ј", "г"); RusDict.add("¤", "д"); RusDict.add("Ґ", "е");
 RusDict.add("с", "ё"); RusDict.add("¦", "ж"); RusDict.add("§", "з");
 RusDict.add("Ё", "и"); RusDict.add("©", "й"); RusDict.add("Є", "к");
 RusDict.add("«", "л"); RusDict.add("¬", "м"); RusDict.add("­", "н");
 RusDict.add("®", "о"); RusDict.add("Ї", "п"); RusDict.add("а", "р");
 RusDict.add("б", "с"); RusDict.add("в", "т"); RusDict.add("г", "у");
 RusDict.add("д", "ф"); RusDict.add("е", "х"); RusDict.add("ж", "ц");
 RusDict.add("з", "ч"); RusDict.add("и", "ш"); RusDict.add("й", "щ");
 RusDict.add("к", "ъ"); RusDict.add("л", "ы"); RusDict.add("м", "ь");
 RusDict.add("н", "э"); RusDict.add("о", "ю"); RusDict.add("п", "я");
}

Листинг 1.27. Доступ к потоку StdOut дочернего процесса

/*****************************************************************/
/* Имя: ConToWin.js                                              */
/* Язык: JScript                                                 */
/* Кодировка: DOS                                            */
/* Описание: Доступ к потоку StdOut дочернего процесса           */
/*****************************************************************/
var WshShell,theJob,s,IsBreak,RusDict;  //Объявляем переменные
//Функция для создания объекта Dictionary с парами "ключ-значение", где
//"ключ"-буква в DOS-кодировке, "значение"- символ, соответствующий этой
//букве в Windows-кодировке
function MakeRusDict() {
 //Создаем объект Dictionary
 RusDict = WScript.CreateObject("Scripting.Dictionary");
 //Заполняем пары "ключ" (символ в DOS-кодировке)- "значение" (символ в
 //Window-кодировке) для всех букв русского алфавита
 RusDict.add("Ђ", "А"); RusDict.add("Ѓ", "Б"); RusDict.add("‚", "В");
 RusDict.add("ѓ", "Г"); RusDict.add("„", "Д"); RusDict.add("…", "Е");
 RusDict.add("р", "Ё"); RusDict.add("†", "Ж"); RusDict.add("‡", "З");
 RusDict.add("€", "И"); RusDict.add("‰", "Й"); RusDict.add("Љ", "К");
 RusDict.add("‹", "Л"); RusDict.add("Њ", "М"); RusDict.add("Ќ", "Н");
 RusDict.add("Ћ", "О"); RusDict.add("Џ", "П"); RusDict.add("ђ", "Р");
 RusDict.add("‘", "С"); RusDict.add("’", "Т"); RusDict.add("“", "У");
 RusDict.add("”", "Ф"); RusDict.add("•", "Х"); RusDict.add("–", "Ц");
 RusDict.add("—", "Ч"); RusDict.add("?", "Ш"); RusDict.add("™", "Щ");
 RusDict.add("љ", "Ъ"); RusDict.add("›", "Ы"); RusDict.add("њ", "Ь");
 RusDict.add("ќ", "Э"); RusDict.add("ћ", "Ю"); RusDict.add("џ", "Я");
 RusDict.add(" ", "а"); RusDict.add("Ў", "б"); RusDict.add("ў", "в");
 RusDict.add("Ј", "г"); RusDict.add("¤", "д"); RusDict.add("Ґ", "е");
 RusDict.add("с", "ё"); RusDict.add("¦", "ж"); RusDict.add("§", "з");
 RusDict.add("Ё", "и"); RusDict.add("©", "й"); RusDict.add("Є", "к");
 RusDict.add("«", "л"); RusDict.add("¬", "м"); RusDict.add("­", "н");
 RusDict.add("®", "о"); RusDict.add("Ї", "п"); RusDict.add("а", "р");
 RusDict.add("б", "с"); RusDict.add("в", "т"); RusDict.add("г", "у");
 RusDict.add("д", "ф"); RusDict.add("е", "х"); RusDict.add("ж", "ц");
 RusDict.add("з", "ч"); RusDict.add("и", "ш"); RusDict.add("й", "щ");
 RusDict.add("к", "ъ"); RusDict.add("л", "ы"); RusDict.add("м", "ь");
 RusDict.add("н", "э"); RusDict.add("о", "ю"); RusDict.add("п", "я");
}
//Функция для перевода строки из DOS- в Windows-кодировку
function DosToWin(s) {
 var i,ss;  //Объявляем переменные
 //Проверяем, создан ли объект RusDict
 if (typeof(RusDict)=="undefined")
  //Если объект RusDict не создан, создаем его
  MakeRusDict();
 ss="";
 for (i=0;i<s.length;i++) {  //Цикл по всем символам в строке
  if (RusDict.Exists(s.charAt(i)))  //Проверяем наличие символа в словаре
   //Преобразуем i-й символ в Windows-кодировку
   ss+=RusDict.Item(s.charAt(i));
  else ss+=s.charAt(i);
 }
 return ss;
}
/*************  Начало *********************************************/
//Создаем объект WshShell
WshShell=WScript.CreateObject("WScript.Shell");
//Запускаем дочернее приложение
theJob = WshShell.Exec("cscript");
IsBreak=false;
for (;;) {
 if (!theJob.StdOut.AtEndOfStream)
  //Считываем всю информацию, находящуюся в потоке StdOut
  //дочернего процесса
  s+=theJob.StdOut.ReadAll();
 if (IsBreak) break;
 if (theJob.status==1) //Проверяем, не завершилась ли запущенная задача
  IsBreak=true;
 else WScript.Sleep(100);
}
//Преобразуем сформированные строки в Windows-кодировку
//и выводим их на экран
WScript.Echo(DosToWin(s));
/*************  Конец *********************************************/

Таким образом, можно с помощью метода Exec запустить утилиту командной строки, передавать ей нужную входную информацию с помощью свойства StdIn и с помощью свойства StdOut получать и анализировать выдаваемые этой утилитой строки (соответствующие примеры приведены также в листингах 2.37 и 2.38).

Оглавление книги


Генерация: 0.047. Запросов К БД/Cache: 0 / 0
поделиться
Вверх Вниз