Настройка Windows с использованием реестра

         

Windows Script Host (WSH) - чтение и редактирование файлов



Копировать, переносить и удалять файлы и папки мы научились в , теперь давайте попробуем просматривать содержимое файлов и редактировать их. Областей применения данного умения масса: от редактирования autoexec.bat и config.sys, до проверки значения параметра run в win.ini, от вывода на экран содержимого файла в качестве сообщения до ведения логов работы пользователей и действий скрипта.

Так как файлы у нас относятся к объектам файловой системы, то нам надо в первую очередь инициализировать объект файловой системы, а затем воспользоваться одним из его методов для открытия файла:

//JScript var fso = new ActiveXObject("Scripting.FileSystemObject"); var file = fso.OpenTextFile("C:\\TEST\\test.txt", 2, true);

//VBScript Set fso = CreateObject("Scripting.FileSystemObject") Set file = fso.OpenTextFile("C:\TEST\test.txt", 2, true)

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

1 - файл открывается только для чтения;

2 - файл открывается для записи. Причем, все содержимое файла, которое было до этого, уничтожится;

8 - файл открывается для добавления данных. Все, что вы запишите, будет добавлено в конец файла. Довольно удобно для ведения различных логов.

Третья переменная может принимать значение true или false. Она показывает, создавать ли новый файл, если его до этого не существовало. Если значение равно true, то новый файл будет создан.

Есть еще и четвертый параметр, который указывает кодировку для открытия файла. Его возможные значения:

- 2 - открывается, используя системную кодировку;

- 1 - открывается в кодировке Unicode;

0 - открывается в кодировке ASCII.

Но, просто открыть файл мало, надо туда и записать что-нибудь! Именно для этого служат следующие методы:


Write - записывает данные в файл в одну строку, без перевода курсора;

WriteLine - записывает в файл отдельную строку;

WriteBlankLines - записывает пустую строку (в качестве параметра принимает количество пустых строк, которые надо записать).

Вот небольшой пример их использования:

//JScript fso = new ActiveXObject("Scripting.FileSystemObject"); file = fso.OpenTextFile("c:\\TEST\\test.txt", 2, true); file.Write("Hello, World!"); file.WriteBlankLines(2); file.WriteLine("Hello");

Для чтения данных из файла используются методы:

Read - читает из файла указанное в качестве параметра количество символов;



ReadLine - читает строку из файла;

ReadAll - считывает весь файл;

Skip - пропускает указанное количество символов;

SkipLine - пропускает строку.

Давайте попробуем написать на основе этого один весьма полезный скрипт:

//JScript fso = new ActiveXObject("Scripting.FileSystemObject"); //Откроем файл на чтение //При необходимости поменяйте путь расположения файла file = fso.OpenTextFile("c:\\windows\\win.ini", 1, false); //Предполагаем, что параметр run находится во 2-й строке //поэтому устанавливаем туда курсор, пропустив первую строку file.SkipLine(); //Считываем строку и сравниваем с пустой записью //Если они не совпадают, то бъем тревогу if (file.ReadLine()!="run=") { WScript.Echo("Параметр run не пустой!!!"); } //Это просто для контроля. В реальной работе можно отключить else { WScript.Echo("OK!"); }

Некоторые вирусы и трояны прописывают свой запуск в файле win.ini в параметре run. Этот скрипт проверяет, есть ли там какая-то запись, и если с помощью него что-то запускается, то скрипт об этом честно предупреждает. Конечно, это самый примитивный вариант, можно сделать, чтобы была проверка, действительно ли это параметр run, выводить его содержимое если он не пустой, но в учебных целях такого вполне достаточно. Прописываете его в автозагрузку и можете спать спокойно (только не сильно увлекайтесь "засорением" автозагрузки - хоть и не на много, но загружаться будет медленнее).

При работе с файлами учтите такой момент: если вы открываете файл для записи, то читать из него данные вам не позволят, аналогично и наоборот.

Думаю теперь чтение и запись данных в файл с помощью WSH у вас не вызовет никаких проблем.

© 2003 К. Тарасов, И. Чеботарев


Windows Script Host (WSH) - файловая система



В этой статье речь пойдет о работе с объектами файловой системы, а именно, с самими файлами и локальными дисками (дисководы, жесткие диски, CD-ROM'ы). Сетевые диски будут рассмотрены в одной из следующих статей.

Приведу небольшой пример и на его основе объясню принципы работы с дисками в Windows Script Host. Если вы еще не отключили сообщение системы о том что какой-то диск переполнен, то, наверняка, уже не раз лицезрели его. Мерзкая штука! Оно вам надо? Давайте, лучше, сами создадим такое сообщение :).

'Проверка количества свободного места на дисках. VBScript Set fso = WScript.CreateObject("Scripting.FileSystemObject") Set WSHShell = WScript.CreateObject("WScript.Shell") 'Проверяем все драйвы (HDD, FDD, CDD) в системе For each i In fso.Drives 'DriveType=2 - логические диски. Зачем нам дисковод и т.п. ерунда? If i.DriveType=2 Then 'Получаем букву диска drive=i.DriveLetter 'Узнаем свободное место и переводим его в Мб с 'точностью до 1 знака после запятой free = FormatNumber(fso.GetDrive(drive).FreeSpace/1048576, 1) 'Если места меньше 100 Мб If free < 100 Then 'то выводим сообщение об этом WSHShell.Popup("На диске "+drive+" осталось меньше 100 Мб. Свободно "+free+" Мб!") End If End If Next

Добавьте получившийся файл в автозагрузку и каждый раз при старте системы у вас будет проверяться наличие свободного места на диске. Как только его окажется меньше порогового значения, заданного вами (в примере 100 Мб), выскочит информационное окно, уведомляющее об этом.

Если вы не будете фильтровать тип диска (строка If i.DriveType=2), то объем свободного места будет проверяться и на дискете в дисководе и на CD-ROM'e. А если в приводе не будет носителя, то скрипт прервется и будет выдано сообщение об ошибке.

DriveType имеет следующие значения:

0 - Тип не может быть определен

1 - Сменный носитель или дисковод для гибких дисков

2 - Обычный HDD

3 - Сетевой диск

4 - CD-ROM

5 - Виртуальный RAM-диск

Остановимся подробнее на строке free = FormatNumber (fso.GetDrive(drive).FreeSpace /1048576, 1).
Свойство FreeSpace возвращает количество свободного дискового места в байтах. Конечно, работать с такими большими цифрами некомфортно, поэтому мы переводим байты в мегабайты, делением на 1048576. А чтобы не лицезреть кучу знаков после запятой, округляем до одного значащего символа с помощью FormatNumber() - количество знаков после запятой устанавливается с помощью второй переменной.

Если вам надо получить полный объем диска, то вместо FreeSpace используйте свойство TotalSize.

Вы можете явно указать диск, с которым хотите работать. Для этого используется метод GetDrive:

Set fso = WScript.CreateObject("Scripting.FileSystemObject") Set Drive = fso.GetDrive("c")

Чтобы узнать файловую систему диска используйте свойство FileSystem:

MsgBox(Drive.FileSystem)

Остальные свойства и методы работы с диском не так интересны. Среди них такие как:

DriveExists - проверяет на наличие заданного диска: fso.DriveExists("c").

IsReady - если диск готов к использованию, возвращает true, в противном случае - false.

RootFolder - возвращает путь к корневому каталогу.

SerialNumber - возвращает серийный номер диска.

ShareName - возвращает сетевое имя диска.

VolumeName - возвращает либо устанавливает метку диска.

Теперь обратим внимание на работу с файлами и папками. Редактирование файлов я бы хотел вынести в отдельную статью, а здесь коснемся вопросов создания, копирования, удаления файлов, установки атрибутов и т.п.

Для примера давайте создадим на диске С:\ папку TEST, а в ней файл test.txt:

//Создание папки и файла. JScript var fso = new ActiveXObject("Scripting.FileSystemObject"); //Проверяем, есть ли такая папка if (fso.FolderExists("C:\\TEST")) WScript.Echo("Такая папка уже существует"); else //Если нет - создаем var Folder = fso.CreateFolder("C:\\TEST"); //Проверяем, есть ли уже такой файл if (fso.FileExists("C:\\TEST\\test.txt")) WScript.Echo("Такой файл уже существует"); else //Если нет, то создаем его var File = fso.CreateTextFile("C:\\TEST\\test.txt", true);



Комментарии наглядно демонстрируют работу скрипта. Давайте только подробнее остановимся на создании файла (последняя строка). Вторым параметром передается значение true. Этот параметр является необязательным и указывает, перезаписывать ли файл с таким именем. Здесь же может передаваться и третий параметр. Если он отсутствует или равен false, то файл будет создан в кодировке ASCII. Если параметр равен true - в unicode.

В примере мы не просто создали папку и файл, но и создали объекты этой папки и файла (Folder и File соответственно). Если надо создать объект для уже существующей папки/файла, используйте метод GetFile/GetFolder:

var File1 = fso.GetFile("C:\\autoexec.bat");

К этим объектам применимы различные методы, позволяющие копировать, переименовывать, удалять файлы, получать о них различные сведения, устанавливать атрибуты. Как несложно догадаться для копирования, перемещения и удаления файлов и папок применяются методы Copy, Move и Delete. При этом в Copy и Move передается имя файла, в который надо скопировать/перенести исходный, а в Delete ничего не передается. Так, чтобы скопировать autoexec.bat в autoexec.tmp надо добавить строку

File1.Copy("C:\\autoexec.tmp");

Различные свойства объектов, созданных с помощью GetFile/GetFolder позволяют получить различные сведения о файлах и папках на которые они указывают. Вот эти свойства:

Size - возвращает размер файла/папки;

DateCreated - время создания;

DateLastAccessed - время последнего обращения к объекту;

DateLastModified - время последнего изменения.

Например:

WScript.Echo(File1.Size);

Бывают ситуации, когда надо получить имя файла, на который ссылается объект. Например:

var fso = new ActiveXObject("Scripting.FileSystemObject"); var File1 = fso.GetFile("C:\\autoexec.bat"); var File2 = fso.GetFile("C:\\config.sys"); var File3 = fso.GetFile("C:\\netlog.txt"); if (fso.FileExists("C:\\config.sys")) File1 = File2; else File1 = File3; WScript.Echo (File1.Name);



В зависимости от того, есть ли файл config.sys, объект File1 будет указывать на разные файлы. Конечно, в таком виде этот пример в реальной ситуации вряд ли встретится, но для иллюстрации неопределенности с файлом вполне подходит. Для определения имени файла (папки) и пути к нему служат еще несколько свойств:

Name - возвращает обычное имя файла (папки);

ShortName - короткое имя (в формате MS-DOS). Длинные имена будут урезаны до формата 8.3;

Path - возвращает обычный путь к файлу (папке);

ShortPath - короткий путь (с тильдой "~");

ParentFolder - возвращает имя родительского каталога.

Как они работают вы уже могли видеть в предыдущем примере в последней строке.

Закончить рассмотрение данной темы мне бы хотелось описанием установки атрибутов файлов/папок и получением сведений о типе файла. Тип файла возвращает свойство Type. Вызывается оно аналогично описанным ранее свойствам:

WScript.Echo (File1.Type);

Если вы вызовите свойства файла по правому клику мышки, то на вкладке "Общие" в поле "Тип" будет как раз то описание, что возвращает это свойство.

Получать или устанавливать атрибуты файлам и папкам позволяет свойство Attributes. Так, посмотреть атрибуты нашего файла можно командой:

WScript.Echo (File1.Attributes);

В таблице приведены значения, которые может принимать данное свойство:

КонстантаЗначениеДействиеОписание
Normal0чтение/записьОбычный файл без атрибутов
ReadOnly1чтение/записьТолько чтение
Hidden2чтение/записьСкрытый
System4чтение/записьСистемный
Volume8только чтениеМетка диска
Directory16только чтениеПапка
Archive32чтение/записьАрхивный
Compressed128только чтениеСжатый файл
Если вам надо установить несколько свойств файлу, значения надо складывать. Например чтобы установить для файла атрибуты только для чтения, скрытый и системный, надо передать значение 1+2+4=7:

File1.Attributes = 7;

На этом объяснения по работе с объектами файловой системы позвольте закончить :). В следующей статье будут подняты вопросы чтения и редактирования файлов.

© 2003 К. Тарасов, И. Чеботарев


Windows Script Host (WSH) - ярлыки



Продолжая тему , в этой статье мне хотелось бы рассказать, как с помощью скрипта создавать ярлыки для файлов и интернет-URL'ов, а также как работать с системными папками Windows.

Давайте для начала попробуем создать ярлык Блокнота на Рабочем столе:

// Создание ярлыка программы. JScript var vbOKCancel = 1; var vbInformation = 64; var vbCancel = 2; var Message = "Вы действительно хотите создать ярлык на Рабочем столе?"; var Title = "Подтвердите действие"; var WSHShell = WScript.CreateObject("WScript.Shell"); Welcome();

// Узнаем путь к Рабочему столу var DesktopPath = WSHShell.SpecialFolders("Desktop"); // Создаем ярлык var MyShortcut = WSHShell.CreateShortcut(DesktopPath + "\\Блокнот.lnk"); // Задаем свойства для ярлыка: // Запускаемый файл MyShortcut.TargetPath = WSHShell.ExpandEnvironmentStrings("%windir%\\notepad.exe"); // Директория запускаемого файла MyShortcut.WorkingDirectory = WSHShell.ExpandEnvironmentStrings("%windir%"); // Клавиши для быстрого вызова программы MyShortcut.HotKey = ("CTRL+ALT+N"); // Тип окна запускаемого файла MyShortcut.WindowStyle = 4; // Иконка, используемая для ярлыка MyShortcut.IconLocation = WSHShell.ExpandEnvironmentStrings("%windir%\\notepad.exe, 0"); // Сохраняем изменения свойств ярлыка MyShortcut.Save(); // Докладываем, что все готово WScript.Echo("Ярлык для Блокнота создан на Вашем Рабочем столе");

function Welcome() { var intDoIt;

intDoIt = WSHShell.Popup(Message, 0, Title, vbOKCancel + vbInformation ); if (intDoIt == vbCancel) { WScript.Quit(); } }

Комментариев более чем достаточно, чтобы понять принцип работы скрипта. Более подробно расскажу о свойстве WindowStyle. Вызовите свойства любого ярлыка и обратите внимание на поле "Окно:". Здесь вы можете задавать способ запуска программы. Вот какие значения можно использовать при задании этого свойства:

3 - при запуске окно программы будет развернуто на весь экран;

4 - стандартный размер окна;


7 - окно будет свернуто в значок на панели задач.

В четвертой строчке вам встречается новый метод - SpecialFolders. Он возвращает путь к системным папкам Windows. Вот список наиболее любопытных папок:

Desktop - Рабочий стол

Favorites - Избранное

Fonts - Шрифты

MyDocuments - Мои документы

NetHood - Сетевое окружение

PrintHood - Принтеры

Programs - подменю Программы из меню Пуск

Recent - подменю Документы из меню Пуск

SendTo - подменю Отправить из контекстного меню файлов

StartMenu - Главное меню

Startup - Автозагрузка из подменю Программы

Templates - Шаблоны

Есть еще несколько папок: AllUsersDesktop, AllUsersStartMenu, AllUsersPrograms, AllUsersStartup - но они присутствуют только в WinNT/2000/XP

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

Теперь от файлов плавно перейдем к линкам. Ярлыки для адресов в Интернете создаются практически так же. Только надо учесть, что у них поменьше свойств, а точнее - только одно:

//Создание файла линка Интернет. JScript var WSHShell = WScript.CreateObject("WScript.Shell"); // Узнаем путь к "Избранному" var FavoritesPath = WSHShell.SpecialFolders("Favorites"); // Создаем ярлык var MyShortcut = WSHShell.CreateShortcut(FavoritesPath + "\\Кормушка для чайников.URL"); // Задаем свойства для ярлыка MyShortcut.TargetPath = WSHShell.ExpandEnvironmentStrings("http://www.whatis.ru"); MyShortcut.Save();

Указав в скрипте расширение .URL для ярлыка, мы даем понять, что нас интересует какой-то адрес в Интернете, а не файл. Ну и конечно, ярлык создаем в Избранном - наиболее логичное место для него.

На этом, собственно, работа с ярлыками заканчивается. Дальнейший материал будет несколько посложней, но если вы хорошо разобрались в предыдущих статьях, то он у вас не вызовет никаких проблем.

© 2003 К. Тарасов, И. Чеботарев


Windows Script Host (WSH) - MS Office



В я рассказывал, как можно управлять различными окнами программ: активизировать их, передавать в них нажатие клавиш... В этой статье мы зайдем немного дальше и научимся управлять приложениями через ActiveX компоненты. Пожалуй, наиболее популярное и частое применение этих знаний может найти отражение в работе с MS Office, а точнее с Word и Excel. Вот над ними мы сегодня и поиздеваемся (все примеры были протестированы в Офис 2000).

Для начала, приведу немножко подредактированный файл примера Microsoft по работе с Excel-ем, сопроводив его попутно своими комментариями:

//JScript //Создаем Екселевский объект, с методами и свойствами которого будем работать var objXL = WScript.CreateObject("Excel.Application"); //Делаем окно видимым и создаем рабочую книгу objXL.Visible = true; objXL.WorkBooks.Add;

//Устанавливаем ширину первых трех колонок objXL.Columns(1).ColumnWidth = 20; objXL.Columns(2).ColumnWidth = 30; objXL.Columns(3).ColumnWidth = 40;

//Первая строка будет у нас шапкой таблицы //Заполняем значения ячеек objXL.Cells(1, 1).Value = "Название свойства"; objXL.Cells(1, 2).Value = "Значение"; objXL.Cells(1, 3).Value = "Описание";

//Форматируем ячейки, чтобы все было красиво objXL.Range("A1:C1").Select; objXL.Selection.Font.Bold = true; objXL.Selection.Interior.ColorIndex = 1; objXL.Selection.Interior.Pattern = 1; objXL.Selection.Font.ColorIndex = 2; objXL.Columns("B:B").Select; objXL.Selection.HorizontalAlignment = -4131;

//Вводим счетчик строк, куда будем записывать информацию var intIndex = 2;

//А эта функция как раз и будет выводить нашу информацию построчно function Show(strName, strValue, strDesc) { objXL.Cells(intIndex, 1).Value = strName; objXL.Cells(intIndex, 2).Value = strValue; objXL.Cells(intIndex, 3).Value = strDesc; intIndex++; objXL.Cells(intIndex, 1).Select; }

//Итак, заполним таблицу данными о версии wscript установленной на компьютере Show("Name", WScript.Name, "Application Friendly Name"); Show("Version", WScript.Version, "Application Version"); Show("FullName", WScript.FullName, "Application Context: Fully Qualified Name"); Show("Path", WScript.Path, "Application Context: Path Only"); Show("Interactive", WScript.Interactive, "State of Interactive Mode"); //До кучи добавим сведения о параметрах, с которыми запускается скрипт var colArgs = WScript.Arguments; Show("Arguments.Count", colArgs.length, "Number of command line arguments"); for (i = 0; i < colArgs.length; i++) { objXL.Cells(intIndex, 1).Value = "Arguments(" + i + ")"; objXL.Cells(intIndex, 2).Value = colArgs(i); intIndex++; objXL.Cells(intIndex, 1).Select; }


Все весьма прозрачно. Приведу аналогичный пример на VBScript, дабы не заставлять любителей этого языка самостоятельно адаптировать код под него:

Dim objXL Set objXL = WScript.CreateObject("Excel.Application") objXL.Visible = TRUE objXL.WorkBooks.Add

objXL.Columns(1).ColumnWidth = 20 objXL.Columns(2).ColumnWidth = 30 objXL.Columns(3).ColumnWidth = 40

objXL.Cells(1, 1).Value = "Название свойства" objXL.Cells(1, 2).Value = "Значение" objXL.Cells(1, 3).Value = "Описание" objXL.Range("A1:C1").Select objXL.Selection.Font.Bold = True objXL.Selection.Interior.ColorIndex = 1 objXL.Selection.Interior.Pattern = 1 objXL.Selection.Font.ColorIndex = 2 objXL.Columns("B:B").Select objXL.Selection.HorizontalAlignment = &hFFFFEFDD

Dim intIndex intIndex = 2

Sub Show(strName, strValue, strDesc) objXL.Cells(intIndex, 1).Value = strName objXL.Cells(intIndex, 2).Value = strValue objXL.Cells(intIndex, 3).Value = strDesc intIndex = intIndex + 1 objXL.Cells(intIndex, 1).Select End Sub

Call Show("Name", WScript.Name, "Application Friendly Name") Call Show("Version", WScript.Version, "Application Version") Call Show("FullName", WScript.FullName, "Application Context: Fully Qualified Name") Call Show("Path", WScript.Path, "Application Context: Path Only") Call Show("Interactive", WScript.Interactive, "State of Interactive Mode") Dim colArgs Set colArgs = WScript.Arguments Call Show("Arguments.Count", colArgs.Count, "Number of command line arguments") For i = 0 to colArgs.Count - 1 objXL.Cells(intIndex, 1).Value = "Arguments(" & i & ")" objXL.Cells(intIndex, 2).Value = colArgs(i) intIndex = intIndex + 1 objXL.Cells(intIndex, 1).Select Next

Хорошо, а как быть если надо сделать какое-то действие не описанное здесь? Вполне логичный вопрос. Но описать все возможности встроенного в Офис VB в этой статье (как и в 10 статьях) просто невозможно.


Эти сведения вам только в качестве информации к размышлению. А все что сверх этой статьи, изучается довольно просто: запускается Word (Excel), включается запись макроса, выполняются нужные вам действия, а потом на основе сгенерированного кода по аналогии пишется скрипт. Нелишним будет почитать и справку (надеюсь вы ее установили?). Замечу, что для работы с приложениями Офиса легче писать скрипты на VBScript, так как справка по встроенному VB сможет удовлетворить даже самым изысканным потребностям.

Именно таким методом (читая справку и анализируя записанные макросы), я сделал практически аналогичный предыдущим скрипт, работающий с Вордом:

//JScript //Создаем объект для работы с Вордом var wrd = new ActiveXObject("Word.Application"); //Создаем новый документ wrd.Documents.Add(); //Получаем указатель на активный документ adoc=wrd.ActiveDocument; //Указатель на область в документе myRange = adoc.Range(Start=0, End=0) //Активизируем Ворд wrd.Visible = true; wrd.Activate();

//Создаем таблицу с одной строкой и тремя столбцами tb0=adoc.tables.Add(Range=myRange, NumRows=1, NumColumns=3); //Задаем ширину столбцов tb0.Columns(1).Width = 80; tb0.Columns(2).Width = 160; tb0.Columns(3).Width = 160;

//Заполняем заголовок таблицы tb0.Cell(1,1).Range.InsertAfter("Название свойства"); tb0.Cell(1,2).Range.InsertAfter("Значение"); tb0.Cell(1,3).Range.InsertAfter("Описание");

//Счетчик строк intIndex = 2;

//Выводимая в строках таблицы информация Show("Name", WScript.Name, "Application Friendly Name"); Show("Version", WScript.Version, "Application Version"); Show("FullName", WScript.FullName, "Application Context: Fully Qualified Name"); Show("Path", WScript.Path, "Application Context: Path Only"); Show("Interactive", WScript.Interactive, "State of Interactive Mode");

//Ну и сама функция для вывода строк function Show(strName, strValue, strDesc) { tb0.Rows.Add(); tb0.Cell(intIndex, 1).Range.InsertAfter(strName); tb0.Cell(intIndex, 2).Range.InsertAfter(strValue); tb0.Cell(intIndex, 3).Range.InsertAfter(strDesc); intIndex++; }

Надеюсь, с задачей указания основного направления при работе с MS Office, мне удалось справиться. Дальше все зависит от вашего терпения и знания английского при переводе справки.

© 2003 К. Тарасов, И. Чеботарев


Windows Script Host (WSH) - работа с сетевым окружением



Наконец-то мы добрались и до работы с сетью. Пожалуй, это одна из самых важных тем при обсуждении вопросов WSH. Ведь основной контингент пользователей, которым наиболее полезен WSH - сетевые администраторы. Ну, а раз они сетевые, то и работать должны с сетью :). Но это все лирика, перейдем к практике.

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

Рассмотрим небольшой пример, в котором выведем в информационное окно сведения об имени пользователя, имени компьютера и домене:

//Пример работы с WshNetwork в JScript //Создаем объект WshNetwork var WshNetwork = new ActiveXObject("WScript.Network"); //Создаем переменную info и заносим туда имя пользователя info = "Имя пользователя: " + WshNetwork.UserName; //Добавляем переход на следующую строку info = info + "\n"; //Добавляем имя компьютера info = info + "Имя компьютера: " + WshNetwork.ComputerName; info = info + "\n"; //Добавляем домен, к которому подключился пользователь info = info + "Домен: " + WshNetwork.UserDomain; //Выводим на экран полученную информацию WScript.Echo (info);

'Тот же пример на VBScript Set WshNetwork = CreateObject("WScript.Network") info = "Имя пользователя: " & WshNetwork.UserName 'Обратите внимание, как осуществляется переход на новую строку info = info & Chr(10) info = info & "Имя компьютера: " & WshNetwork.ComputerName info = info & Chr(10) info = info & "Домен: " & WshNetwork.UserDomain WScript.Echo info

В этих примерах мы использовали свойства объекта WshNetwork: UserName, ComputerName и UserDomain для получения информации о залогинившемся пользователе. Зачем это может понадобиться? Например, если на компьютере работает несколько пользователей и им нужен доступ к разным сетевым дискам, можно обеспечить автоматическое мапирование этих дисков в зависимости от того, какой пользователь сейчас работает.


Таким образом мы незаметно подошли к вопросу работы с сетевыми дисками. Для начала, неплохо бы выяснить, какие сетевые диски подключены в данный момент:

//JScript var vbOKOnly = 0; var vbInformation = 64; var WSHShell = WScript.CreateObject("WScript.Shell"); var WSHNetwork = WScript.CreateObject("WScript.Network") var colDrives = WSHNetwork.EnumNetworkDrives(); if (colDrives.length == 0) { WSHShell.Popup("Подключенных сетевых дисков нет", 0, "Работа с WSHNetwork", vbInformation + vbOKOnly ); } else { strMsg = "Текущие сетевые подключения: \n"; for (i = 0; i < colDrives.length; i += 2) { strMsg = strMsg + "\n" + colDrives(i) + "\t" + colDrives(i + 1); }

WSHShell.Popup(strMsg, 0, "Работа с WSHNetwork", vbInformation + vbOKOnly ); }

'VBScript Set WSHNetwork = WScript.CreateObject("WScript.Network") Set colDrives = WSHNetwork.EnumNetworkDrives If colDrives.Count = 0 Then MsgBox "Подключенных сетевых дисков нет", _ vbInformation + vbOkOnly, _ "Работа с WSHNetwork" Else strMsg = "Текущие сетевые подключения: " & Chr(10) For i = 0 To colDrives.Count - 1 Step 2 strMsg = strMsg & Chr(10) & colDrives(i) & Chr(9) & colDrives(i + 1) Next

MsgBox strMsg, _ vbInformation + vbOkOnly, _ "Работа с WSHNetwork" End If

Думаю, подробно код объяснять не стоит, все довольно прозрачно: создаем нужные переменные, проверяем есть ли вообще подключенные диски, если нет - выводим соответствующее сообщение, если есть - выводим их список.

Для подключения и отключения сетевых дисков существуют методы MapNetworkDrive и RemoveNetworkDrive соответственно. Пример работы с ними (на JScript):

WshNetwork.MapNetworkDrive("X:", "\\\\S2\\Vol1", "true", "User1", "123");

Здесь обязательными являются только первые два параметра: буква, на которую будет подключаться диск и, собственно, путь к сетевому диску.


Третий ( true или false) параметр указывает, осуществлять или нет подключение этого диска при следующем логоне. Четвертый и пятый параметры - это имя пользователя и пароль, с которыми может подключаться этот диск. Конечно, хранить пароль на подключение диска в открытом виде в скрипте не очень мудро. Лучше организовать доступ к диску нужным пользователям на сервере, средствами самой ОС. Тогда посторонние люди не смогут узнать пароль для работы с этим ресурсом.

WshNetwork.RemoveNetworkDrive("X:", "true", "true");

Здесь обязателен только первый параметр - буква отключаемого диска. Второй параметр - если true, отключает диск даже если он в этот момент используется. Третий параметр сохраняет настройки для следующих логонов.

С дисками разобрались, перейдем к сетевым принтерам. Работа с ними мало отличается от работы с дисками, поэтому похожие моменты опишу коротко, а остановлюсь подробнее именно на отличиях.

EnumPrinterCollections - возвращает список подключенных принтеров (аналогично дискам).

AddPrinterConnection - подключает локальный порт компьютера к сетевому принтеру. Параметры у этого метода аналогичны методу MapNetworkDrive, только первым параметром идет не буква диска, а порт принтера (LPT1, например).

RemovePrinterConnection - отключает сетевой принтер (вместо буквы диска - порт принтера).

SetDefaultPrinter - устанавливает заданный сетевой принтер принтером по умолчанию. В качестве параметра методу передается сетевое имя принтера, который будет использован по умолчанию (SetDefaultPrinter("\\\\Comp1\\HP1100");).

AddWindowsPrinterConnections - регистрирует принтер в Windows и подключает его к сетевому ресурсу. Этот метод позволяет создать связь с сетевым принтером без явного перенаправления вывода в локальный порт. Набор параметров этого метода для Windows 9x и Windows NT/2000/XP отличается.

Для Windows 9x:

AddWindowsPrinterConnections(strPrnPath, strDriverName [,strPort]);

strPrnPath - путь к сетевому принтеру;

strDriverName - имя драйвера, необходимого для подключения принтера;

strPort - порт, куда будет перенаправлен вывод.

Для Windows NT/2000/XP последние два параметра игнорируются.

Вот, собственно, и вся информация по работе с сетевым окружением с помощью WSH. Областей, где это можно применить - масса, приведу только один пример, который сейчас активно используется у нас на работе: при каждой регистрации пользователя на компьютере отрабатывает logon-скрипт, который пишет в лог-файл (имеющий имя компьютера, на котором произошла регистрация) имя пользователя и время логона. Таким образом убиваются два зайца: можно выяснить на каком компьютере установлена неверная дата и кто заходит в сеть с чужого компьютера. Пример довольно легкий, так что я не буду приводить здесь его код, пусть это будет вашим домашним заданием :). Другие способы использования материалов этой статьи, надеюсь, придумаете сами.

© 2003 К. Тарасов, И. Чеботарев


Windows Script Host (WSH) - теория, реестр



Когда компьютеры были большими, а программы были маленькими, основной операционной системой большинства домашних компьютеров была DOS. Компьютерщиков в то время было немного и были они все люди занятые, поэтому для выполнения каких-то постоянно повторяющихся действий были придуманы и использовались bat-файлы (или, как они еще называются, пакетные файлы). С тех пор утекло немало воды, компьютеры стали маленькими и вошли в широкие народные массы. Программы, наоборот, стали очень большими и прожорливыми до ресурсов. Операционная система тоже изменилась. Про DOS большинство современных пользователей и не слышало, а если кому и доводилось с ним работать, то чувствовали они себя крайне некомфортно. А что же bat-файлы? Неужели на фоне всеобщего движения вперед они остались неизменны? Да, они по-прежнему исправно служат во многих ситуациях, но вместе с появлением Windows у них появился реальный конкурент: Windows Script Host (WSH).

Что же представляют собой файлы, написанные с использованием WSH? Это сценарии команд, написанные на JScript, VBScript или других скриптовых языках (Active Perl, Python), позволяющие автоматизировать какие-то действия на компьютере. При этом спектр действий по сравнению с bat-файлом существенно расширен. Помимо обычного запуска программ и работы с файлами WSH позволяет создавать ярлыки программ, выключать компьютер, изменять (добавлять и удалять) записи в реестре, работать с сетью и пользователями (выводить список дисков, подключать/отключать сетевые диски, получать имя компьютера и пользователя, ...), работать с переменными окружения, выдавать диалоговые и информационные сообщения и многое другое. Как видите, список различных возможностей WSH весьма впечатляющий. Причем, научиться с ним работать вовсе не сложно.

Из положительных особенностей Windows Script Host хотелось бы отметить возможность работы в "невидимом" режиме. Например, если вы захотите добавить какую-то информацию в реестр с помощью reg-файла, то вам будет выдан запрос с подтверждением этого действия.
При запуске WSH- скрипта никаких вопросов задаваться не будет. Пользователь даже может не подозревать, что на его компьютере выполняются какие-то работы. Думаю, многим администраторам такая возможность придется по душе.

Файлы сценариев WSH представляют собой программы (да-да, это можно уже назвать программой), написанные на JScript (эти файлы имеют расширение .js) или VBScript (соответственно, файлы с расширением .vbs). Синтаксис, естественно, немного отличается, но если вам приходилось раньше сталкиваться с одним из этих языков написания скриптов, то никаких проблем возникнуть не должно.

Если вы пользователь Windows 98/ME/2000/XP то проблем с WSH у вас возникнуть не должно - библиотеки, отвечающие за обработку скриптов изначально присутствуют в системе. Если вы являетесь счастливым обладателем Windows NT, то для включения возможности обработки сценариев WSH вам придется установить сервис пак 4. Тем же, у кого на компьютере установлен Windows 95 придется заглянуть на сайт Microsoft и скачать Windows Scripting Host (msdn.microsoft.com/scripting). Если вы не уверены, есть ли у вас на компьютере Windows Scripting Host, просто запустите поиск файла wscript.exe в каталоге Windows.

Итак, для написания WSH-скрипта вам понадобится любой текстовый редактор (я предпочитаю использовать внутренний редактор FARa), немного терпения и голова на плечах.

Чтобы запустить готовый скрипт, просто дважды щелкните мышкой по файлу, либо введите полное имя файла скрипта в Пуск - Выполнить (учтите, что файл должен иметь расширение .js или .vbs).

Ну вот, на этом, пожалуй, теоретическую часть можно завершить и перейти непосредственно к написанию самих скриптов. В силу привычки я предпочитаю JScript, но по мере возможностей постараюсь приводить примеры как на JS, так и на VBS.

Так как раздел ориентирован в основном на реестр Windows, то и начать хотелось бы со скрипта, работающего с реестром. Итак, попробуем создать какой-нибудь раздел, в нем несколько параметров, а затем все это удалим.


Создайте любой файл с расширением .js (например, test.js) и напишите в нем следующее:

//Пример работы с реестром на JScript var WSHShell = WScript.CreateObject("WScript.Shell"); WSHShell.Popup("Создаем раздел"); WSHShell.RegWrite("HKCU\\MyRegKey\\", "Primer"); WSHShell.Popup("Создаем строковый параметр"); WSHShell.RegWrite("HKCU\\MyRegKey\\String", 1); WSHShell.Popup("Создаем параметр DWORD"); WSHShell.RegWrite("HKCU\\MyRegKey\\DWORD", 2, "REG_DWORD"); WSHShell.Popup("Создаем двоичный параметр"); WSHShell.RegWrite("HKCU\\MyRegKey\\Binary", 3, "REG_BINARY"); WSHShell.Popup("Удаляем все параметры"); WSHShell.RegDelete("HKCU\\MyRegKey\\String"); WSHShell.RegDelete("HKCU\\MyRegKey\\DWORD"); WSHShell.RegDelete("HKCU\\MyRegKey\\Binary"); WSHShell.Popup("Удаляем раздел"); WSHShell.RegDelete("HKCU\\MyRegKey\\");

В первой строке создается объект типа WSHShell с тем же именем. Во второй строке выводится сообщение о том что создается раздел. После нажатия на "ОК" в появившемся окне в реестре будет создан новый раздел. Перед каждым действием будет появляться окно с сообщением о том, что сейчас будет сделано. В нормальном рабочем скрипте такие окна, конечно, не нужны. Здесь они добавлены просто для того, чтобы вы могли отследить изменения в реестре (для обновления информации в редакторе реестра нажимайте F5 после каждого изменения). Последние строчки удаляют наши параметры и раздел, чтобы не забивать реестр разным мусором.

Если вы обратили внимание, то корневой раздел HKEY_CURRENT_USER в скрипте обозначается как HKCU. Здесь возможны сокращенные названия корневых разделов. HKEY_LOCAL_MACHINE будет писаться как HKLM, HKEY_CLASSES_ROOT - HKCR. Остальные разделы не имеют короткого имени.

Теперь проделаем аналогичную операцию на VBScript (test.vbs):

'Пример работы с реестром на VBScript set WSHShell = WScript.CreateObject("WScript.Shell") WSHShell.Popup "Создаем раздел" WSHShell.RegWrite "HKCU\\MyRegKey\\", "Primer" WSHShell.Popup "Создаем строковый параметр" WSHShell.RegWrite "HKCU\\MyRegKey\\String", 1 WSHShell.Popup "Создаем параметр DWORD" WSHShell.RegWrite "HKCU\\MyRegKey\\DWORD", 2, "REG_DWORD" WSHShell.Popup "Создаем двоичный параметр" WSHShell.RegWrite "HKCU\\MyRegKey\\Binary", 3, "REG_BINARY" WSHShell.Popup "Удаляем все параметры" WSHShell.RegDelete "HKCU\\MyRegKey\\String" WSHShell.RegDelete "HKCU\\MyRegKey\\DWORD" WSHShell.RegDelete "HKCU\\MyRegKey\\Binary" WSHShell.Popup "Удаляем раздел" WSHShell.RegDelete "HKCU\\MyRegKey\\"



Как видите, отличия весьма незначительные (по другому задается комментарий, отсутствует ";" в конце строки, нет круглых скобок при задании параметров, var заменена на set). Подробно его разбирать, я думаю, смысла нет - все что справедливо для первого примера, справедливо и для второго.

"Это все здорово, но посоветуй-ка мне что-нибудь полезное!" - скажете вы. И посоветую. Я на 100% уверен, что абсолютно все пользователи интернета сталкивались с такой проблемой, как замена стартовой страницы Internet Explorer'a некоторыми сайтами. Причем, большинство этих сайтов не несет ничего полезного и зачастую видеть их у себя второй раз совсем не хочется. Для борьбы с ними используйте следующий скрипт:

var WSHShell = WScript.CreateObject("WScript.Shell"); //Делаем задержку 10 секунд на случай если //паразитный сайт добавил что-то в автозагрузку WScript.Sleep(10000); //Проверяем что у нас в стартовой странице StartPage = WSHShell.RegRead("HKCU\\SOFTWARE\\Microsoft\\Internet Explorer\\Main\\Start Page"); //И если там не то, что мы задумали, то меняем на свое if (StartPage!="http://www.whatis.ru/") { WSHShell.RegWrite("HKCU\\SOFTWARE\\Microsoft\\Internet Explorer\\Main\\Start Page", "http://www.whatis.ru/"); }

Добавьте его в автозагрузку в разделе HKEY_CURRENT_USER и вам не придется следить самостоятельно за такими сайтами. И даже если они пропишут какую-нибудь гадость в автозагрузку, то скорее всего и в этом случае стартовая страница будет нужная вам. Правда, если у вас работает антивирус Касперского, могут быть проблемы - по крайней мере у меня он этот файл обозвал трояном :). С другой стороны, если у вас постоянно работает антивирус, то врядли нехорошие сайты что-либо поменяют.

В конце приведу еще один небольшой скрипт, выводящий на экран окно с сообщением о версии WSH у вас на компьютере:

//Версия WSH на JScript var WSHShell = WScript.CreateObject("WScript.Shell"); WSHShell.Popup("Версия WSH "+WScript.Version);

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

© 2003 К. Тарасов, И. Чеботарев


Windows Script Host (WSH) - управление программами



Возможно, читая статьи о WSH, вы задавались вопросом: "Да что такого особенного в этом скрипте?". Действительно, можно и из , , работать с , можно из bat-файлов. Да, WSH имеет более богатые возможности в этой области, работать с ним проще и удобнее, но стоят ли эти преимущества того, чтобы изучать данную тему? Для особо сомневающихся в этой статье я хочу затронуть такую область при работе на компьютере, где бессильны все остальные средства (за исключением специально написанных программ). А речь в ней пойдет о возможности управлять другими приложениями Windows (консольными приложениями для MS-DOS управлять не удастся).

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

Итак, что я подразумеваю под управлением другими приложениями? Активизацию существующего окна и имитацию нажатия в нем различных клавиш клавиатуры. Люди для этого пишут умные и сложные программы, а мы напишем простенький скрипт с тем же эффектом.

Начнем с того, что попытаемся активизировать окно уже запущенной программы.

//JScript var WshShell = WScript.CreateObject("WScript.Shell"); WshShell.AppActivate("Блокнот");

Для активизиции окна мы воспользовались методом WshShell.AppActivate(). В качестве параметра передается какая-то текстовая строка. Скрипт осуществляет поиск окна, название которого эквивалентно переданной строке. Если такого окна нет, то будет вестись поиск окна, начало заголовка которого совпадает со строкой и в последнюю очередь ведется поиск окна, окончание заголовка которого эквивалентно переданной строке. Это очень удобно, т.к., например, в Word'e заголовок окна меняется в зависимости от имени редактируемого файла, но начало всегда "Microsoft Word". Если окон, удовлетворяющих условию поиска несколько, то активизируется первое найденное окно. Надо отметить, что если окно программы свернуто на панель задач, то оно не разворачивается, а просто кнопка приложения становится "нажатой".


Но просто сама по себе такая возможность мало что дает полезного, но вот в связке со следующим методом можно добиться потрясающего эффекта. И метод этот SendKeys(). Итак, давайте напишем небольшой забавный скрипт, позволяющий слегка посмеяться над друзьями:

//JScript var WshShell = WScript.CreateObject("WScript.Shell"); KL = true;

while (KL) { if (WshShell.AppActivate("Блокнот")) { WriteWord(); KL = false; } if (WshShell.AppActivate("Microsoft Word")) { WriteWord(); KL = false; } WScript.Sleep(10000); }

function WriteWord() { WshShell.SendKeys("THE "); WScript.Sleep(300); WshShell.SendKeys("MATRIX "); WScript.Sleep(300); WshShell.SendKeys("HAS "); WScript.Sleep(300); WshShell.SendKeys("YOU..."); WScript.Sleep(300); }

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

Вот похожий пример написанный на VBScript:

set WshShell = WScript.CreateObject("WScript.Shell") KL = true

do while KL if WshShell.AppActivate("Microsoft Word") then WriteWord() KL = false end if WScript.Sleep 3000 loop

function WriteWord() WshShell.SendKeys "HELLO WORLD!" end function

Я привел его для того, чтобы любители именно этого скриптового языка могли по аналогии переделать все остальные примеры в данной статье, потому что они будут на JScript.

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

Помимо алфавитно-цифровых символов в приложения можно передавать и нажатие специальных клавиш, например, Enter, Tab, F1...F12, Alt, Shift, Ctrl, и т.п. В таблице приведены специальные обозначения для этих клавиш:



Клавиша Код Клавиша Код
"BackSpace" {BACKSPACE}, {BS} или {BKSP} "Break" {BREAK}
"Caps Lock" {CAPSLOCK} "F1"..."F12" {F1}...{F12}
"Delete" {DELETE} или {DEL} "End" {END}
"Enter" {ENTER} или ~ "Esc" {ESC}
"Help" {HELP} "Home" {HOME}
"Insert" {INSERT} или {INS} "Num Lock" {NUMLOCK}
"Page Down" {PGDN} "Page Up" {PGUP}
"Print Screen" {PRTSC} "Scroll Lock" {SCROLLLOCK}
"Tab" {TAB} "Стрелка вверх" {UP}
"Стрелка влево" {LEFT} "Стрелка вниз" {DOWN}
"Стрелка вправо" {RIGHT}  

 

Для указания клавиш Alt, Shift, Ctrl существуют специальные коды:

Клавиша Код
Shift +
Ctrl ^
Alt %
Так если вы хотите передать нажатие нескольких клавиш с Shift-ом, то вам надо выполнять команду: WshShell.SendKeys("+(ABC)");, если только первую: WshShell.SendKeys("+ABC");.

Легко заметить, что такие символы как +, ^, % зарезервированы под обозначение специальных клавиш, так что просто так передать эти (и некоторые другие) символы не удастся. Для этого надо заключить их в фигурные скобки: "{+}", "{%}"... Вот полный список символов, которые необходимо заключать в фигурные скобки: +, ^, %, ~, (,), {, }, [, ].

Если вы хотите передать несколько нажатий подряд одной клавиши, то вам вовсе не обязательно все их набирать в скрипте, можно просто указать количество повторений. Так, строка WshShell.SendKeys("{A 100}"); эквивалента сотне нажатий клавиши "А". Правда, есть ограничение на количество возможных повторений нажатия клавиш. Это значение лежит где-то между 8150 и 8180 раз (более точно мне было лень выяснять). При превышении этого значения в скрипте будет выдана ошибка.

На этом покончим с теорией и рассмотрим еще парочку примеров работы с программами именно с использованием клавиш, приведенных в таблице.


Для начала поиздеваемся над бедными юзерами, а именно закроем Word без сохранения изменений в файле:

var WshShell = WScript.CreateObject("WScript.Shell"); KL = true;

while (KL) { if (WshShell.AppActivate("Microsoft Word")) { WriteWord(); KL = false; } WScript.Sleep(3000); }

function WriteWord() { WshShell.SendKeys("%{F4}"); WScript.Sleep(300); WshShell.SendKeys("{TAB}"); WScript.Sleep(300); WshShell.SendKeys("{ENTER}"); }

Комментировать не буду, итак все достаточно подробно объяснено по ходу статьи. Конечно, если вы не лишены гуманизма, то можно предварительно сохранить документ в какой-нибудь файл:

var WshShell = WScript.CreateObject("WScript.Shell"); KL = true;

while (KL) { if (WshShell.AppActivate("Microsoft Word")) { WriteWord(); KL = false; } WScript.Sleep(3000); }

function WriteWord() { WshShell.SendKeys("%"); WScript.Sleep(300); WshShell.SendKeys("{ENTER}"); WScript.Sleep(300); WshShell.SendKeys("{DOWN}"); WScript.Sleep(300); WshShell.SendKeys("{DOWN}"); WScript.Sleep(300); WshShell.SendKeys("{DOWN}"); WScript.Sleep(300); WshShell.SendKeys("{DOWN}"); WScript.Sleep(300); WshShell.SendKeys("{ENTER}"); WScript.Sleep(300); WshShell.SendKeys("test"); WScript.Sleep(300); WshShell.SendKeys("{ENTER}"); }

Довольно забавно наблюдать, как пункт меню вдруг сам открывается, курсор перемещается по пунктам, а затем сохраняется документ. Конечно, проще было бы использовать "горячие" клавиши, но в русской версии это не пройдет (из-за некорректной передачи русских букв, о чем я уже писал выше), так что приходится выкручиваться таким способом, ну, а для английской версии легко переделать скрипт под использование "горячих" клавиш, что несколько сократит его размер.

Если вы помните, несколько лет назад был ажиотаж вокруг Spedia.net - спонсора платящего деньги за время, проведенное в интернете. Многие люди пытались на этом заработать, а учитывая тот факт, что некоторые провайдеры давали бесплатный доступ в ночное время, программеры начали писать утилитки, имитирующие работу пользователя за компьютером (запуск браузера, почтового клиента, серфинг по сайтам, получение почты и т.п.).Спедия по мере сил боролась с ними, блокируя оплату юзерам, использующим такие программы... Многим хотелось написать свою утилитку имитации работы, да еще чтобы ее не отловили, но для этого надо было знать программирование, причем там использовались не самые тривиальные знания. С помощью материала данной статьи, я думаю, теперь любой сможет написать нечто похожее :). Правда, сейчас это уже никому не нужно, но найти для полученных знаний более достойное применение вполне возможно.

На этой радостной ноте хотелось бы закончить рассмотрение данного материала.

© 2003 К. Тарасов, И. Чеботарев


Windows Script Host (WSH) - запуск программ



В я рассказал об основах WSH и привел пример скрипта для работы с реестром (добавление и удаление записей). Здесь мне бы хотелось продолжить обсуждение этой интересной темы и предложить вашему вниманию еще несколько скриптов, полнее раскрывающих возможности Windows Script Host.

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

//Пример запуска программы с диалоговым окном запроса //на JScript var vbOKCancel = 1; var vbInformation = 64; var vbCancel = 2; var Message = "Вы действительно хотите запустить программу Notepad?"; var Title = "Подтвердите действие"; Welcome();

var WSHShell = WScript.CreateObject("WScript.Shell"); WSHShell.Run("notepad",5);

function Welcome() { var WSHShell = WScript.CreateObject("WScript.Shell"); var intDoIt;

intDoIt = WSHShell.Popup(Message, 0, Title, vbOKCancel + vbInformation ); if (intDoIt == vbCancel) { WScript.Quit(); } }

В первых пяти строках описываются переменные, которые нам потребуются при вызове функции Welcome(). Эта функция выдает на экран окно с запросом на запуск программы и в случае положительного ответа продолжается выполнение скрипта. Если ответ отрицательный, выполнение прерывается. Строка

WSHShell.Run("notepad",5);

запускает Блокнот. Мы еще рассмотрим ее подробнее чуть позже, а пока обратите внимание на то, что объект WSHShell создается дважды: один раз в функции Welcome() и второй раз непосредственно перед запуском Блокнота. Закономерный вопрос: а нельзя ли обойтись одним созданием объекта? Если закомментировать строку перед запуском Блокнота и попробовать опять запустить скрипт, то будет выдана ошибка что определение WSHShell отсутствует. Почему так происходит? Ведь функция Welcome() вызывается до запуска программы и следовательно создание объекта WSHShell происходит до вызова метода запуска программы. Да простят меня программисты за то, что мне приходится подробно описывать такие элементарные вещи, но не все знакомы с программированием и с таким термином как "область видимости".
Так как объект WSHShell создается внутри функции, то он будет существовать только до тех пор, пока мы из этой функции не выйдем. Т.е. за пределами Welcome() объекта WSHShell нет, поэтому и появляется ошибка. Давайте немного модифицируем скрипт, чтобы объект WSHShell описать только один раз:

//Пример запуска программы с диалоговым окном запроса //на JScript var vbOKCancel = 1; var vbInformation = 64; var vbCancel = 2; var Message = "Вы действительно хотите запустить программу Notepad?"; var Title = "Подтвердите действие"; var WSHShell = WScript.CreateObject("WScript.Shell"); Welcome();

WSHShell.Run("notepad",5);

function Welcome() { var intDoIt;

intDoIt = WSHShell.Popup(Message, 0, Title, vbOKCancel + vbInformation ); if (intDoIt == vbCancel) { WScript.Quit(); } }

Теперь создание WSHShell происходит до вызова функции Welcome() и создавать его повторно внутри функции нет необходимости. Такая переменная называется глобальной. Т.е. она существует на протяжении всего времени выполнения скрипта и видна во всех функциях. Переменная которая создается внутри функции и видна только в этой функции называется локальной.

Давайте вернемся к строке WSHShell.Run("notepad",5); и рассмотрим ее подробнее. При вызове метода Run передаются 2 переменных. Если с первой все понятно - это имя запускаемого файла (т.к. файл notepad находится в каталоге Windows, который присутствует в переменной среды окружения Path, то можно не указывать полный путь к нему. В противном случае для запуска программы надо указывать ее полное имя, например: "C:\polniy\put_k\programme\file.exe"), то со второй не все так просто. Эта цифра указывает состояние окна запускаемой программы. Она может принимать десять различных значений от 0 до 9, но все я описывать не буду, а расскажу только про самые интересные:

0 - запускать программу в скрытом окне. Т.е. если вы попытаетесь запустить Блокнот с таким значением второй переменной, то окно программы будет невидимым и кнопка на панели задач не будет создана.


Чтобы увидеть что Блокнот все-таки запустился, нажмите Ctrl+Alt+Del и вы увидите там строку с текстом Notepad.

6 - запустить программу минимизированной. При этом активным будет следующее окно в Z-последовательности.

2 - запустить программу минимизированной.

3 - запустить программу максимизированной.

5 - запустить программу с текущими размером и позицией окна.

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

В конце статьи хотелось бы привести небольшой скриптик. Я оставлю его без комментария, т.к. он очень простой. Запустите его и посмотрите в действии самостоятельно ;).

//Просто небольшой забавный примерчик ;) //язык JScript var WSHShell = WScript.CreateObject("WScript.Shell"); do { WSHShell.Popup("Hello, World!"); } while (true);

Я не стал приводить эти примеры в исполнении на VBScript - желающие легко смогут осуществить это самостоятельно. Если что не получится, обратитесь к , там было описано коротко различие между JS и VBS.

На этом пока все, но тема еще не закрыта.

© 2003 К. Тарасов, И. Чеботарев