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

         

Windows Script Host (WSH)


Windows Script Host, или сокращенно WSH, является одной из интереснейших тем, рассматриваемых при работе с Windows. Именно благодаря скриптам, написанным на языке JScript или VBScript, можно существенно облегчить свой труд на компьютере, избавиться от массы рутинной работы, автоматизировать многие операции и процессы, да и просто поприкалываться над друзьями.

Обработка исключений

Довольно важный момент при работе с WSH-скриптами. Некоторые задачи вообще невозможно решить без обработки исключений

Файлы и папки

Как работать со всеми файлами и папками, находящимися в одной директории, сразу, а не перебирать их по одному поименно

MS Office

Работа с ActiveX объектами на примере Word и Excel. Высший пилотаж. Дальнейшее развитие темы управления приложениями

Управление программами

Пожалуй, самая зрелищная возможность WSH. Делаем на JScript за 15 минут то, что требует десятка часов напряженного программирования на C++

Работа с сетевым окружением

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

Чтение и редактирование файлов

Хотите отредактировать файл? Проверить наличие строки в autoexec.bat? Вести лог работы на компьютере? Легко!

Файловая система

Один из ключевых вопросов, без досконального знания которого нельзя писать полноценные скрипты

Ярлыки

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

Запуск программ

Даже в таком простом деле, как запуск программ, видно неоспоримое превосходство WSH над bat-файлами

Теория, реестр



В статье рассматриваются основы работы с WSH, а также работа с реестром Windows (добавление, редактирование, изменение информации)

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

Об ошибках в работе интерфейса или неправильных ссылках в статьях сообщайте по адресу



Windows Script Host (WSH) - файлы и папки



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

Сперва рассмотрим работу с каталогами. Список каталогов хранится в коллекции Folders, получить которую можно с помощью свойства SubFolders объекта Folder (может немного запутанно, но в приведенном ниже примере все станет ясно). Folders имеет свойство Count и методы Item и Add. Вот небольшой пример на JScript, выводящий список имен всех папок на диске С:, демонстрирующий как работать с коллекцией Folders:

var fso, f, fc, fc1, s; fso = new ActiveXObject("Scripting.FileSystemObject"); f = fso.GetFolder("C:"); fc = new Enumerator(f.SubFolders); fc1 = f.SubFolders; s = ""; for (; !fc.atEnd(); fc.moveNext()) { s += fc.item(); s += "\n"; } s = s + "Всего папок: " + fc1.Count; WScript.Echo(s);

Аналогично на VBScript:

Dim fso, f, f1, fc, s Set fso = CreateObject("Scripting.FileSystemObject") Set f = fso.GetFolder("C:") Set fc = f.SubFolders For Each f1 in fc s = s & f1.name s = s & CHR(10) Next s = s & "Всего папок: " & fc.Count WScript.Echo s

Для иллюстрации метода Add приведу небольшой пример на JScript:

var fso, f, fc; fso = WScript.CreateObject("Scripting.FileSystemObject"); f = fso.GetFolder("C:"); fc = f.SubFolders; fc.Add("NewFolder");

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

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

var fso, f, f1, fc, s; fso = new ActiveXObject("Scripting.FileSystemObject"); f = fso.GetFolder("C:"); fc = new Enumerator(f.files); s = ""; for (; !fc.atEnd(); fc.moveNext()) { s += fc.item(); s += "\n"; } WScript.Echo(s);

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

Set fso = CreateObject("Scripting.FileSystemObject") Set UFolder = fso.getfolder("C:\Folder1") set UFile = UFolder.files Set OFolder = fso.getfolder("C:\Folder2") Set OFile = OFolder.files

If (fso.FileExists("C:\LOG\copy.log")) Then Set MyFile = fso.OpenTextFile("C:\LOG\copy.log", 8, True) Else Set MyFile = fso.CreateTextFile("C:\LOG\copy.log") end if

For Each f1 in UFile FileToCopy = UFolder&"\"&f1.Name For Each f2 in OFile if f1.Name = f2.Name then if f1.Size = f2.Size then else fso.CopyFile FileToCopy, OFolder&"\"&f1.Name MyFile.WriteLine(Cstr(Date)&" "&Cstr(Time)&" Файл "&f1.Name&" обновлен. Размер "&f1.Size) end if else end if Next Next

MyFile.Close

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


Windows Script Host (WSH) - обработка исключений



Вначале стоит определиться с терминами, ведь если любой программист прекрасно знает что такое "исключения", то остальные далеко не все точно представляют о чем идет речь. Говоря простым языком исключения или исключительные ситуации - это ошибки, возникающие в ходе работы программы (в нашем случае скрипта). Но это не те ошибки, когда вы забыли поставить закрывающую скобку, запятую или ошиблись в имени переменной. Это ошибки, возникающие в некоторых (исключительных) ситуациях во время выполнения РАБОЧЕГО скрипта.

Рассмотрим простенький пример скрипта на VBScript, пытающегося прочитать значение какого-то параметра в реестре и выдать его в сообщении:

Dim Perem set WSHShell = WScript.CreateObject("WScript.Shell")

WSHShell.Popup "Начало скрипта"

Perem = "" Perem = WSHShell.RegRead("HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Test") WSHShell.Popup Perem WSHShell.Popup "Конец скрипта"

Сообщение "Начало скрипта" появилось, следовательно, синтаксических ошибок мы не допустили, но вот затем появляется сообщение об ошибке

что и неудивительно - параметра с именем Test в разделе HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer не существует. Из-за этого наш пример не отработал до конца. Возникает логичный вопрос: а нельзя ли каким-то образом отловить момент появления ошибки, как-то его обработать и продолжить выполнение скрипта дальше? Оказывается, можно. Перепишем наш пример следующим образом:

Dim Perem set WSHShell = WScript.CreateObject("WScript.Shell")

WSHShell.Popup "Начало скрипта" Perem = ""

On Error Resume Next GetErr() if Err.Source="WshShell.RegRead" then Perem = "Параметр не существует" else Perem = WSHShell.RegRead("HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Test") end if Err.Clear

WSHShell.Popup Perem WSHShell.Popup "Конец скрипта"

Function GetErr() If WSHShell.RegRead("HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Test") Then End If End Function


Попытка прочитать параметр из реестра вынесена в отдельную функцию. Если происходит ошибка - функция возвращает код ошибки (Err.Number) и источник (Err.Source). В операторе if мы проверяем та ли это ошибка, что нам нужна и если это именно так, значит параметр не удалось прочитать по причине его отсутствия, о чем нас честно и предупреждают в появившемся сообщении. При этом скрипт корректно отрабатывает до конца. Если же ошибки не возникло, мы спокойно прочитываем значение нужного нам параметра.

Обратите внимание на объект Err. Это стандартный объект VBScript, содержащий информацию о так называемых run-time errors (ошибках времени выполнения). Свойство Source указывает на источник ошибки (в сообщении на рисунке это последняя строка). Метод Clear очищает свойства объекта, удаляя сведения об ошибке. Помимо Source и Clear у объекта есть и другие свойства и методы, но реально может понадобиться, пожалуй, свойство Number и Description. Number возвращает код произошедшей ошибки, а Description ее описание. Измените в скрипте строку

Perem = "Параметр не существует"

на

Perem = "Ошибка " & Err.Number & ". " Err.Description

Во время выполнения скрипта появится сообщение: "Ошибка -2147024894. Не удается открыть для чтения раздел реестра "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Test"". Это большое отрицательное число и есть код ошибки. При обработке исключений можно пользоваться и номерами ошибок.

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

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

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