16+
ComputerPrice
НА ГЛАВНУЮ СТАТЬИ НОВОСТИ О НАС




Яндекс цитирования


Версия для печати

Модуль поиска не установлен.

Оконный скриптинг

08.11.2005

Дмитрий Репин aka cmapuk[0nline]


Мало кто из более-менее продвинутих пользователей Windows-систем знает о существовании Windows Script Host, о simple-юзерах и говорить не приходится. Кроме того, мало кто знает, какие возможности имеют JScript/VBScript для Windows.


Однажды на просторах ужасного по навигации сайта msdn.microsoft.com я наткнулся на линк для скачивания полной документации по Windows Scripting. Ввиду того, что делать мне было нечего, да и просто из интереса, я скачал сетап этой хелпы, в надежде найти там что-нибудь новенькое для себя, и занялся ее прочтением. Каково же было мое удивление, когда я попал в раздел, посвященный возможностям JScript, не входящим в стандарт ECMA! А вы знали, что JScript/VBScript работают с регулярными выражениями и имеют подобие операторов поиска/замены а-ля Perl? Но... обо всем по порядку.

Кто ты, Windows Script Host?

Windows Script Host (WSH) стал более-менее известен у нас только после бага MSIE и MS Outlook, позволявшего с помощью ActiveX создать WSH-объект. Но толком так никто и не понял, "зачем оно надо". Для чего же все-таки нужен WSH? WSH позволяет работать с файловой системой, реестром, сетевыми соединениями (диски, принтеры, етц), окружением и др. С помощью wsh-скриптов можно управлять запуском программ (даже с доступом к их Stdin/Stdout/Stderr), посылать сигналы другим процессам, удаленно администрировать систему, работать с сетевым(и не только) принтером, управлять входом в систему (login-скрипты) и многое другое. Кроме того, WSH можно совместить с js-, vbs-скриптами, чтобы взять от них "все самое лучшее". Скрипты для Windows Script Host могут быть не только отдельными программами, но и встраиваться в HTML-страницы, дабы быть использованными в технологии Active Server Pages (ASP), так же как JScript, VBScript или PerlScript (www.activestate.com).

JScript - это не JavaScript

В мире скриптовых языков существует стандарт ECMA, в рамках которого каждый из ***Script должен (теоретически =) ) соответствовать общепринятым нормам. Но эти нормы не ограничивают разработчиков в наполнении своего скриптового языка всевозможными инструментами, не входящими в стандарт. Все это выглядит для промежуточного потребителя (скрипт-программист) как два набора возможностей: те, которые он может предложить любому конечному потребителю (пользователю), и те, которые он может использовать для своих целей.

Как пример можно привести JScript. Часть возможностей этого языка можно использовать в создании веб-страниц, причем понять этот язык сможет как MS Internet Explorer, так и Netscape Navigator или Opera. Использование другой части языка - нестандартной - приведет к необходимости оставлять на веб-страницах надписи типа "Только для MSIE", о которых пользователи Сети уже давно забыли и которые в наше время являются просто недопустимыми (хотя такие "клоуны" еще остались). В современном веб-строительстве вполне достаточно стандартных возможностей скриптовых языков - и для совместимости с броузерами и для воплощения всевозможных дизайнерских идей. Во многом этому поспособствовала так долго не получавшая всеобщего признания технология Shockwave Flash.

Вернемся все же к JScript. Нынешнее состояние этого языка располагает к обширной эксплуатации последнего в Windows-системах. Этот язык будет полезен для администраторов локальных сетей, для пользователей, стремящихся автоматизировать свой рабочий процесс, а главное - для программистов, предпочитающих технологию ASP (Active Server Pages).

Для любителей Visual Basic, занимающихся программированием для MSOffice и т.п., подойдет VBScript, который является бра-том-почти-близнецом JScript и может выполнять те же задачи, но VB-программистам в данном случае не придется изучать новый язык.

Кроме стандартных возможностей, вроде мамематических вычислений, простых манипуляций со строками и т.п., JScript предлагает поработать с регулярными выражениями (Regexp), с ActiveX-объектами (OLE), cо строками в "адвансед"-режиме и другое. Рассмотрим примеры.

<script language="JScript">
         var r, re; //Определим переменные
         var str = "Hello, VBscript! VBscript forever!"; //Определяем текст
         re = /VBscript/g; //В re переменной сохраним регулярное выражение
         r = str.replace(re, "JScript"); //Заменяем
         alert(r);
</script>

В данном случае, re - регулярное выражение, str содержит "подопытную" строку. Методом replace() мы заменяем в строке str шаблон re на новую строку - "JScript".

С помощью ActiveXObject можно манипулировать различными объектами, например, работать с таблицами Excel.

<script language="JScript">
         var xl = new ActiveXObject("Excel.Application"); // Можно запустить Excel
         var xl = new ActiveXObject("Excel.Sheet"); // Табличный объект
         xl.Application.Visible = true; // Управляем видимостью
         xl.ActiveSheet.Cells(1,1)="Hello from JScript!"; // Записываем в ячейку A1 текст.
         xl.SaveAs("E:\\Work\\Articles\\WS\\
Testsheet.xls"); // Сохраняемся
         xl.Application.Quit; // и выходим из Excel
</script>

Кроме того, можно создавать объекты прямо из файлов с помощью функции GetObject.

Еще одна довольно интересная возможность JScript не может не привлечь ваше внимание - объекты Dictionary. Правильнее будет сказать, что это не объект JScript, а возможность среды, а точнее - Scripting Runtime Library. Dictionary является аналогом ассоциативных массивов Perl - хэшей. Для тех, кто не знаком с этим понятием, поясню. Элементы обычного массива определяются числовым индексом, в то время как в хэшах этим индексом может быть любая строка. Допустим, к списку данных Имя, Фамилия, E-mail с помощью массива вам придется обращаться так: array[0],array[1],array[2]. С помощью ассоциативных массивов вы можете хранить эти данные как проименованный список. В JS, в отличие от Perl, вы манипулируете объектом ассоциативного массива:

<script language="JScript">
         hash = new ActiveXObject("Scripting.Dictionary");
         hash.Add("name", "cmapuk");
         hash.Add("lastname", "[0nline]");
         hash.Add("e-mail", "cmapuk@comprice.ru");
         alert("Имя:"+hash.Item("name"));
         alert("Фамилия:"+hash.Item("last-name"));
         alert("E-mail:"+hash.Item("e-mail"));
</script>

Кроме Dictionary, SRL предоставляет объект FileSystemObject, позволяющий работать с файлами и директориями в виде объектов. Это несколько удобнее, чем напрямую через WSH.

Чем еще хорош Window Script Host?

Для начала рассмотрим, какие объекты предоставляет нам WSH и для чего они могут пригодиться.

WScript Object - Основной объект WSH

WshArguments Object - Доступ к коллекции аргументов командной строки

WshController Object - Для работы со скриптами удаленного управления

WshEnvironment Object - Доступ к коллекции переменных окружения

WshNamed Object - Доступ к именованным аргументам командной строки

WshNetwork Object - Работа с сетью

WshRemote Object - Удаленные скрипты

WshRemoteError Object - Информация об ошибках (для WshRemote)

WshScriptExec Object - Работа со скриптами

WshShell Object - Работа с консолью

WshShortcut Object - Создание ярлыков

WshSpecialFolders Object - Пути к специальным папкам Windows

WshUnnamed Object - Доступ к безымённым аргументам командной строки

WshUrlShortcut Object - Создание интернет-ссылок

Теперь разберемся, что из себя представляют WSH-скрипты. Скрипты для Windows Script Host могут содержаться в BAT-файлах, подключаются с помощью ActiveXObject в JS- и VBS-скриптах (в т.ч. в HTML). Кроме этого, WSH-скрипты могут содержаться в "своих" файлах - *.wsh и *.wsf (wsh-файлы - это скрипты для старых версий WSH). Эти файлы представляют собой специальные XML-конструкции. В одном файле можно использовать все доступные скриптовые языки.

<job id="Exampel1">
         <script language="VBScript" src="include.vbs"/>
         <script language="JSScript">
                 alert('Hello!');
         </script>
         WScript.Echo("Это пример wsf-файла с включениями JS и VBS");
</job>

В одном wsf-файле может содержаться много таких конструкций. Тогда в этом файле все конструкции job заключаются в тэги <package></package>. Для того чтобы запустить ту или иную конструкцию, следует вызывать скрипт в командной строке следующим образом:

>cscript //Job:Exampel1 mytest.wsf

В этом случае выполнится конструкция <job ID="Exampel1">....</job> из файла mytest.wsf.

Стоит пояснить, что для запуска WSH-скриптов используются две стандартные windows-программы: wscript.exe и cscript.exe. Первая используется для запуска скриптов "двойным кликом" без параметров, вторая - для запуска с параметрами, в данном случае, из командной строки.

Интересная возможность WSH - поддержка Drag'n'Drop. С помощью объекта WScript.Arguments в своем скрипте вы получаете имена файлов, с которыми вам надо работать. Вы сохраняете свой скрипт на диск, и далее можете просто "перетащить" нужные файлы и "бросить" их на ваш скрипт, который примет их имена(пути к ним) и сделает с ними то, что вам нужно.

Теперь перейдем к рассмотрению задач, которые можно выполнять с помощью WSH, на примере JScript+ActiveXObject.

// Сетевые манипуляции
var net;
net = new ActiveXObject("WScript.Network");
net.MapNetworkDrive("X:", "\\\\works\\publish","true","user-name","password");
// Подключили сетевой диск
...
var net;
net = new ActiveXObject("WScript.Network");
net.AddWindowsPrinterConnec-tion("\\\\Printers\\hp5000");
// Подключили принтер
...
var net;
net = new ActiveXObject("WScript.Network");
net.SetDefaultPrinter("\\\\Prin-ters\\hp5000");
// Установили принтер по умолчанию
...
// С помощью объекта FileSystemObject посмотрим, какие у нас есть диски
fso = new ActiveXObject("Scripting.FileSystem-Object");
e = new Enumerator(fso.Drives); //Перебор дисков объектом Enumerator.
// Этот объект является чем-то вроде конструкции For..Each
s = "";
for (;!e.atEnd();e.moveNext()){ // Перебираем диски
x = e.item();
s = s + x.DriveLetter;
s += " - ";
if (x.DriveType == 3) // Если диск сетевой
         n = x.ShareName; //Берем имя
else if (x.IsReady) //Если диск доступен (локальный)
         n = x.VolumeName; //Имя диска.
else
         n = "[Диск недоступен!]";
         s += n + "\n";
}
alert(s);

Теперь можно привести простой пример login-скрипта.

oNet = new ActiveXObject("WScript.Network");
sUser = oNet.UserName; // Берем имя пользователя
// В Win89/Me скрипт может быть запущен раньше,
// чем пользователь "залогинится". Поэтому в цикле ищем его имя
// каждые полсекунды, пока не найдем. Если пользователь долго
// не входит в систему - выйдем (WScript.Quit()).
startTime = new Date();
while (sUser == "")
{
    var curTime = new Date();
    if (curTime - startTime > 30000) WScript.Quit();
    WScript.Sleep(500);
    sUser = oNet.UserName;
}
// Теперь все ОК. Пользователь вошел в систему.
// Подсоединяем его домашнюю директорию
oNet.MapNetworkDrive("x:", "\\\\server\\users\\" + sUser);
// Можно здесь добавить запись в лог входа,
// запустить ту или иную программу или службу, и т.п.

Чтобы получить доступ к какой-либо системной директории, например папке рабочего стола, можно воспользоваться объектом Wscript.SpecialFolders.

// Десктоп текущего пользователя
curdesc=Wscript.SpecialFolders("Desk-top");
// Десктоп общий для всех пользователей
curdesc=Wscript.SpecialFolders("All-UsersDesktop");

WSH-скрипты могут работать со стандартными потоками STDIN, STDOUT, STDERR. Первые два потока могут использоваться только при запуске скрипта с помощью CScript.exe, то есть в командной строке. Стоит сказать, что сообщения об ошибках в WSH-скриптах более информативны, чем обычные сообщения об ошибках Windows или скриптов в броузере.

Манипуляции с реестром WIndows могут производиться с помощью объекта Wscript.Shell. Этот объект позволяет как читать данные, так и записывать их (RegRead, RegWrite, RegDelete).

Теперь еще немного примеров

<job ID="WShell_notepad">
<script language="JScript">
         Wsh = WScript.CreateObject('WScript.She-ll');
         Wsh.Run("notepad", 5);
         Wsh.AppActivate("Untitled - Notepad");
         text = "Hello from Windows Script Host!\n";
         for(i=0; i < text.length;i++) {
                 ch = mess.substr(i, 1);
                 WScript.Sleep(200);
                 Wsh.SendKeys(ch);
         }
</script>
</job>

Этот скрипт запустит программу Блокнот и напишет в ней фразу из переменной text.

<job Id="WshEnv">
<script language=JScript>
         var Wsh = WScript.CreateObject("WScript.Shell");
         var WshEnv = Wsh.Environment("SYSTEM");
         WScript.Echo(WshEnv("NUMBER_OF_PROCES-SORS"));
</script>
</job>
Вот так можно обращаться к переменным окружения.
<job id="js">
<script language="JScript">
         var WshNet = WScript.CreateObject("WScript.Net-work");
         WScript.Echo("Domain = " + WshNet.UserDomain);
         WScript.Echo("Computer Name = " + WshNet.ComputerName);
         WScript.Echo("User Name = " + WshNet.UserName);
</script>
</job>

А вот так можно получить информацию о домене локальной сети, имени компьютера в этой сети и пользователя.

Windows Script Components

Кроме всех описанных и не описанных выше возможностей самих языков JS, VBS и WSH, имеется возможность создавать свои скриптовые компоненты. После создания компонента вы можете обращаться к его методам и данным, создавая в своей программе объект с помощью WScript.CreateObject("My-Scripting.TestScripts"). Файлы скриптовых компонентов имеют расширение *.wsc и представляют собой файлы XML-образной структуры. Вот пример такого файла:

<?xml version="1.0"?>
<component>
<registration
     description="MyScripting"
     progid="MyScripting.TestScripts"
     version="1.00"
     classid="{d0fgb647-fd0c-4c90-a4bd-7473f499d35a}">
     <comment>
         Здесь создастся окно сообщения при регистрации
     </comment>
</registration>
<comment> Здесь описания типов и т.п.</comment>
<public>
     <property name="YourName">
         <get internalName="hiddenGetProperty"/>
         <put internalName="hiddenSetProperty"/>
     </property>
     <method name="SayHello">
     </method>
</public>
<comment> А теперь и сам код</comment>
<script language="JScript">
<![CDATA[
     function hiddenGetProperty() {
         return YourName_Property;
     }
     function hiddenSetProperty(param) {
         YourName_Property = param;
     }
     function SayHello {
         return "Hello "+YourName_Property+"!";
     }
]]>
</script>
</component>

В таких компонентах можно разместить часто используемые программные блоки, например коды подключения к БД или разбора определенных файлов.

The End

Если вы при установке Windows использовали режим Custom, то, вероятно, видели среди компонентов Windows Script Host. В противном случае, можно со 100%-ной уверенностью сказать, что Windows Script Host у вас установлен. Так почему бы не использовать такие богатые возможности?! С помощью Windows Script Host вы сможете упростить и ускорить многие рабочие процессы, настройки компьютера и локальной сети и другие задачи.



статьи
статьи
 / 
новости
новости
 / 
контакты
контакты