В следующем примере (сценарий MakeCalc.js) свойство ProcessID
используется для активизации стандартного калькулятора Windows. Напомним, что для этой цели также можно при вызове метода WshShell.AppActivate
использовать название окна "Calculator".
Листинг 1.25. Активизация приложений с помощью PID
/*****************************************************************/
/* Имя: MakeCalc.js */
/* Язык: JScript */
/* Описание: Активизация приложений с помощью PID */
/*****************************************************************/
var WshShell, theCalculator;
//Создаем объект WshShell
WshShell = WScript.CreateObject("WScript.Shell");
//Запускаем калькулятор
theCalculator = WshShell.Exec("calc");
//Приостанавливаем выполнение сценария для того, чтобы окно
//калькулятора появилось на экране
WScript.Sleep(500);
//Активизируем окно калькулятора
WshShell.AppActivate(theCalculator.ProcessID);
//Посылаем нажатия клавиш в окно калькулятора
WshShell.SendKeys("1{+}");
WScript.Sleep(500);
WshShell.SendKeys("2");
WScript.Sleep(500);
WshShell.SendKeys("~");
/************* Конец *********************************************/
После запуска дочернего процесса сценарий-родитель продолжает выполняться асинхронно, поэтому необходимо уметь определять, выполняется ли еще запущенная задача, или она уже завершена. Для этой цели используется свойство Status
: если значение Status
равно 0, то это означает, что дочерний процесс находится в стадии выполнения, если Status
равно 1, то запущенная задача уже завершена. Например, в результате выполнения приведенного в листинге 1.26 сценария ChildStatus.js на экран выведется несколько строк "Команда еще выполняется" (рис. 1.12).
Листинг 1.26. Контроль состояния дочернего процесса
/*****************************************************************/
/* Имя: ChildStatus.js */
/* Язык: JScript */
/* Описание: Контроль состояния дочернего процесса */
/*****************************************************************/
var WshShell,theJob;
//Создаем объект WshShell
WshShell=WScript.CreateObject("WScript.Shell");
//Запускаем дочернее приложение
theJob = WshShell.Exec("xcopy /?");
for (;;) {
if (theJob.status==1) //Проверяем завершение дочернего процесса
break; //Выходим из цикла
else WScript.Echo("Команда еще выполняется");
}
WScript.Echo("Выполнение завершено");
/************* Конец *********************************************/
Рис. 1.12.Результат выполнения сценария ChildStatus.js
Свойства 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
if (RusDict.Exists(s.charAt(i))) //Проверяем наличие символа в словаре
//Преобразуем i-й символ в Windows-кодировку
ss+=RusDict.Item(s.charAt(i));
Читать дальше