Мало кто из более-менее продвинутих пользователей 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.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.
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 вы сможете упростить и ускорить многие рабочие процессы, настройки компьютера и локальной сети и другие задачи.