Недокументированные и малоизвестные возможности Windows XP — страница 16 из 28

Сервер сценариев Windows

При рассказе об инструментарии управления WMI уже рассматривались примеры создания сценариев сервера сценариев Windows с использованием WMI, сейчас же рассмотрим некоторые объекты, доступ к которым можно получить в Windows XP, а также методы для работы с ними. Глава будет оформлена как справочник, так как работа с объектами легче, чем работа с инструментарием WMI, тем более что в Интернете можно найти очень много примеров работы с объектами.

Реестр

Для доступа к реестру необходимо подключить объект WshShell. Для этого нужно воспользоваться следующим объявлением: Set имя_нового_объекта = WScript.CreateObject("WScript. Shell"). Объект поддерживает следующие методы.

■ RegRead(путь к ветви реестра и имя параметра) — считывает из реестра значение параметра, указанного в качестве входного значения. При этом если входное значение будет завершаться косой чертой (\), то будет считываться значение по умолчанию данной ветви реестра. Следует также напомнить, что путь к ветви реестра должен начинаться не с полного названия корневого раздела, а с его аббревиатуры. Например, возможны следующие аббревиатуры:

 • HKCU — соответствует корневому разделу HKEY_CURRENT_USER;

 • HKLM — HKEY_LOCAL_MACHINE;

 • HKCR — HKEY_CLASSES_ROOT.

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

 • REG_SZ — строковый параметр;

 • REG_DWORD — параметр REG_DWORD-типа;

 • REG_BINARY — параметр REG_BINARY-типа.

Как и в методе RegRead, если путь к создаваемому параметру будет заканчиваться косой чертой, то будет изменяться значение параметра (По умолчанию).

■ RegDelete путь к ветви реестра и имя параметра, который мы удаляем — удаляет из реестра указанный во входящем значении параметр. При этом если входящее значение оканчивается косой чертой, то будет удалена вся ветвь.

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

Листинг 16.1. Работа с методами для доступа к реестру

set wshshell = WScript.CreateObject("WScript.Shell")

wshshell.RegWrite "HKCU\Primer_sozdania_vetvi\hello_world", "BIG_WORLD", "REG_SZ" 

wshshell.RegWrite "HKCU\Primer_sozdania_vetvi\", "Изменяем значение параметра По умолчанию", "REG_SZ"

MsgBox wshshell. RegRead("HKCU\Primer_sozdania_vetvi\hello_world") 

MsgBox wshshell.RegRead("HKCU\Primer_sozdania_vetvi\")

wshshell.RegDelete "HKCU\Primer_sozdania_vetvi\hello_world" 

wshshell.RegDelete "HKCU\Primer_sozdania_vetvi\"

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

Для доступа к файловой системе используется следующий вызов: Set имя_объекта = CreateObject("Scripting.FileSystemObject"). Объект поддерживает следующие методы.

■ BuildPath("путь к каталогу", "название файла") — создает путь на основе указанного пути к каталогу и имени файла. Иными словами, он просто возвращает строку формата «путь к каталогу» & "\" & «имя файла».

■ CopyFile «путь и имя копируемого файла», «путь и имя нового файла», «флаг перезаписи» — копирует файл, указанный в первом входном параметре, туда, куда указывает второй входной параметр (и, если необходимо, меняет имя файла). При этом третий входной параметр определяет, будет ли перезаписываться файл, если он уже существует. Если значение третьего входного параметра равно false, то в случае существования файла в каталоге назначения будет происходить ошибка и файл копироваться не будет. Если же значение третьего входного параметра равно true, то файл, если он существу ет в каталоге назначения, будет перезаписан.

■ CopyFolder «путь и имя копируемой папки», «путь и имя новой папки», «флаг перезаписи» — работа данного метода аналогична работе предыдущего метода, но вместо файла он копирует папку.

■ CreateFolder(«путь к новой папке и ее название») — создает указанную во входном значении папку. При этом после своей работы метод возвращает ссылку на объект, указывающий на созданную папку. Данный объект, ссылка на который возвращается, поддерживает несколько методов. Метод возвращает:

 • Path — путь к созданной папке, если же путь не определен, то папка создана не была;

 • Size — размер созданной папки и ее содержимого;

 • Attributes — битовую маску, указывающую, какие атрибуты определены для данной папки;

 • DateCreated — дату создания папки (как время, так и день, месяц и год создания);

 • DateLastAccessed — дату последнего доступа к папке (как время, так и день, месяц и год создания);

 • DateLastModified — дату последнего изменения содержимого папки (как время, так и день, месяц и год создания);

 • Drive — букву логического диска, на котором расположена папка;

 • IsRootFolder — значение false, если папка не является корневой;

 • Name — название папки. Его же можно получить использованием метода ShortName;

 • ParentFolder — каталог, в котором расположена папка;

 • Type — тип папки, например, может возвратить значение Папка с файлами;

 • ShortPath — путь к папке, включая ее имя.

■ CreateTextFile(«путь к текстовому файлу и его название», «флаг перезаписи», «флаг Unicode») — создает указанный текстовый файл и возвращает объект, ссылающийся на созданный текстовый файл. Данный метод требует следующих входных значений:

 • Путь к текстовому файлу и его название — именно указанный в данном входном значении текстовый файл и будет создан;

 • Флаг перезаписи — если значение данного флага равно true, то в случае существования указанного в первом входном значении файла он будет перезаписан;

 • Флаг Unicode — если значение флага равно true, то текстовый файл будет создан с поддержкой Unicode.

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

 • Close — завершить работу с данным файлом;

 • Column — возвращает количество столбцов, содержащихся в последней строке данного текстового файла;

 • Line — возвращает количество строк, содержащихся в данном текстовом файле;

 • Write «текст» — записывает в данный файл указанную строку, но не переходит на следующую строку при окончании записи;

 • WriteLine «текст» — записывает в данный файл указанную строку и переходит на следующую строку при окончании записи;

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

■  DeleteFile «путь к файлу» — удаляет указанный во входном значении файл.

■ DeleteFolder «путь к файлу» — удаляет указанную во входном значении папку.

■ DriveExists(«буква диска:») — возвращает значение true, если указанный во входном параметре логический диск существует. Иначе возвращает значение false.

■ Drives(«буква диска:») — возвращает ссылку на объект, с помощью которого можно просмотреть параметры указанного во входном значении диска.

Объект, ссылка на который возвращается, поддерживает следующие методы.

 • AvailableSpace — количество свободного места на логическом диске в мегабайтах. Можно также воспользоваться методом FreeSpace.

 • DriveLetter — возвращает букву диска (без символа «:»).

 • DriveType — идентификатор типа диска. Возможны следующие идентификаторы: 0 — неизвестный тип диска; 1 — съемный; 2 — фиксированный; 3 — удаленный; 4 — компакт-диск; 5 — ОЗУ.

 • FileSystem — название файловой системы, установленной на диске.

 • Path — путь к диску.

 • IsReady — определяет, готов ли диск к работе. Например, если данный метод возвращает значение false при работе с оптическим диском, значит, в данном оптическом приводе отсутствует компакт-диск.

 • SerialNumber — серийный номер диска.

 • TotalSize — общий размер данного логического диска в мегабайтах.

 • VolumeName — название метки диска.

■ FileExists «путь к файлу» — возвращает значение true, если указанный во входном значении файл существует.

■ FolderExists «путь к папке» — возвращает значение true, если указанная во входном значении папка существует.

■ GetBaseName «путь к каталогу» — возвращает название конечного каталога в пути, указанном во входном значении.

■ GetDrive «буква диска» — возвращает объект, являющийся ссылкой на указанный логический диск. После получения объекта к нему можно применить те же методы, что и к объекту, получаемому с помощью метода Drives. Например, можно воспользоваться методом TotalSpace, чтобы узнать общий размер диска.

■ GetFile «путь к файлу» — возвращает объект, являющийся ссылкой на указанный файл. После получения объекта к нему можно применить те же методы, что и к объекту, получаемому с помощью метода CreateFolder. Например, можно воспользоваться методом DateCreated, чтобы узнать дату создания файла.

■ GetFolder «путь к папке» — возвращает объект, являющийся ссылкой на указанную папку. После получения объекта к нему можно применить те же методы, что и к объекту, получаемому с помощью метода CreateFolder. На пример, можно воспользоваться методом DateCreated, чтобы узнать дату создания папки.

■ GetFileVersion «путь к файлу» — возвращает версию файла, приведенного во входном значении метода.

■ GetTempName — возвращает имя последнего файла ТМР, создаваемого на данном компьютере.

■ MoveFile «путь и имя файла», «путь, куда файл будет перемещен, а также его новое имя» — перемещает файл, указанный в первом входном параметре, туда, куда указывает второй входной параметр (и, если необходимо, меняет имя файла).

■ MoveFolder «путь и имя каталога», «путь, куда каталог будет перемещен, а также его новое имя» — перемещает каталог, указанный в первом входном параметре, туда, куда указывает второй входной параметр (и, если необходимо, меняет имя каталога).

■ OpenTextFile «путь и имя файла», «флаг открытия файла» — открывает файл, указанный в первом входном параметре, с доступом, указанным во втором входном параметре. Второй входной параметр может содержать следующие значения:

 • 1 — открыть файл для чтения;

 • 2 — открыть файл для перезаписи;

 • 8 — открыть файл для дозаписи (записи в конец файла, то есть, не переписывая его содержимое).

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

■ ReadLine — считать значение строки и перейти на следующую строку данного файла;

■ Read(количество символов) — считать первые n символов из строки данного файла;

■ ReadAll — считать все содержимое данного файла;

■ Skip — пропустить данное количество символов;

■ SkipLine — пропустить следующую строку символов;

■ AtEndOfLine — возвращает значение true, если достигнут конец строки;

■ AtEndOfStream — возвращает значение true, если достигнут конец файла.

Другие возможности

Рассмотрим другие возможности, которые предоставляют объекты сервера сценариев Windows. При этом будут рассмотрены как новые объекты, так и уже описанные ранее, ведь при их описании мы не всегда знакомились со всеми доступными в них методами.

Объект WshShell

Popup («текст сообщения», «количество секунд», «текст заголовка», «тип окна»)

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

■ Количество секунд — определяет количество секунд, которое вызванный диалог будет отображаться. По истечении этого времени текстовое сообщение само исчезнет.

■ Текст заголовка — указывает текст заголовка диалога текстового сообщения.

■ Тип окна — константное выражение, определяющее количество кнопок текстового окна, а также тип выводимого окна. Возможны следующие константы (в скобках указаны числовые выражения, которым соответствуют эти константы).

Константы количества кнопок.

■ vbOkOnly — отображать только кнопку OK (0).

■ vbOkCancel — отображает кнопки OK и Отмена (1).

■ vbAbortRetryIgnore — кнопки Прервать, Повтор и Пропустить (2).

■ vbYesNoCancel — кнопки Да, Нет и Отмена (3).

■ vbYesNo — кнопки Да и Нет (4).

■ vbRetryCancel — кнопки Повтор и Отмена (5).

Константы типа окна. Они могут добавляться к одной из предыдущих констант (например, vbOkOnly + vbCritical).

■ vbCritical — выводит знак ошибки (16).

■ vbQuestion — знак вопроса (32).

■ vbExclamation — знак восклицания (48).

■ vbInformation — знак информации (64).

Константы кнопки по умолчанию. Они могут добавляться к одной из предыдущих констант (например, vbYesNoCancel + vbQuestion + vbDefaultButton3).

■ vbDefaultButton1 — первая кнопка имеет фокус (0).

■ vbDefaultButton2 — вторая кнопка имеет фокус (256).

■ vbDefaultButton3 — третья кнопка имеет фокус (512).

■ vbDefaultButton4 — четвертая кнопка имеет фокус (768).

Константы модальности. Они могут добавляться к одной из предыдущих констант (например, vbYesNoCancel + vbQuestion + vbDefaultButton3 + vbApplicationModal).

■ vbApplicationModal — окно является модальным для текущего приложения (0).

■ vbSystemModal — для всех приложений системы (4096)

ПРИМЕЧАНИЕ

Вы заметили, что входные значения некоторых методов берутся в скобки, а некоторых не берутся? На самом деле здесь все просто. Если метод возвращает значение и вы это значение получаете (то есть имеет место строка «переменная»=«метод»), то входные значения нужно брать в скобки, иначе, даже если метод возвращает значение, но вы его не принимаете (то есть имеет место строка «метод»), входные значения в скобки брать не нужно. 

Метод может возвращать константу той кнопки, которую выбрал пользователь. Возможны следующие константы:

■ vbOk — пользователь выбрал кнопку OK (1);

■ vbCancel — кнопку Отмена (2);

■ vbAbort — кнопку Прервать (3);

■ vbRetry — кнопку Повтор (4);

■ vbIgnore — кнопку Пропустить (5);

■ vbYes — кнопку Да (6);

■ vbNo — кнопку Нет (7).

CreateShortcut("путь к ярлыку и его имя")

Метод создает ярлык, названный в честь входного параметра. При этом следует учитывать, что указанный во входном параметре файл должен завершаться расширением LNK или URL. 

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

■ TargetPath — определяет путь к файлу, на который будет создаваться ярлык;

■ Save — после вызова этого метода ярлык будет создан.

CurrentDirectory

Свойство возвращает текущую директорию, в которой находится сценарий или которая используется в данный момент командной строкой, если сценарий вызывается из командной строки.

Рассмотрим пример работы с этим и двумя предыдущими методами. В этом примере будет создан ярлык файла, путь к которому задаст пользователь. При этом ярлык будет располагаться либо в текущем каталоге (если пользователь нажмет кнопку Да), либо в каталоге, который пользователь сам укажет.

Листинг 16.2. Работа с ярлыком и текстовым диалогом

set wshshell = WScript.CreateObject("WScript.Shell")

vibor = wshshell.Popup("Создать ярлык в каталоге " & wshshell.CurrentDirectory & "?", "100", "Создание ярлыка", vbYesNoCancel)

select case vibor

case vbYes

 set yarlik = wshshell.CreateShortcut(wshshell.CurrentDirectory & "\eto_yarlik.lnk")

 yarlik.TargetPath = "d:\aa.bmp"

 yarlik.Save

case vbNo

 path = InputBox("Введите путь и имя ярлыка","Создание ярлыка",

 wshshell.CurrentDirectory & "\eto_yarlik.lnk")

 If path <> "" Then

  set yarlik = wshshell.CreateShortcut(path)

  yarlik.TargetPath = "d:\aa.bmp"

  yarlik.Save

 Else

  MsgBox "Ну как хотите…"

 End if

case vbCancel

 MsgBox "Ну как хотите…" 

end select

Environment

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

■ Count — возвращает общее количество системных переменных, созданных на данный момент.

■ Length — аналогичен предыдущему методу.

■ Remove(имя переменной) — удаляет указанную системную переменную.

■ Item(имя переменной) — возвращает значение данной системной переменной.

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

ПРИМЕЧАНИЕ

Получить значение переменной можно также с помощью подобного вызова: MsgBox wshshell.ExpandEnvironmentStrings("%systemroot%"). 

Листинг 16.3. Работа с системными переменными 

set wshshell = WScript.CreateObject("WScript.Shell")

MsgBox wshshell.Environment.Count 

MsgBox wshshell.Environment.item("winbootdir") 

wshshell.Environment.Remove("winbootdir") 

MsgBox wshshell.Environment.Count

Exec (путь и название исполняемого файла)

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

ПРИМЕЧАНИЕ

Выполнить команду можно также с помощью метода Run. Он имеет следующий синтаксис: «переменная» = wshshell.run("путь к программе", TRUE).

■ Terminate — завершить вызванную программу.

■ ExitCode — код, возвращаемый при открытии программы. Если значение этого кода равно 0, то программа была вызвана успешно. Для этих целей можно также воспользоваться методом Status.

■ ProcessID — возвращает идентификатор, присвоенный нашей вызванной программе.  

Рассмотрим простой пример работы с данным методом. В этом примере вызывается Проводник, после чего отображается PID созданного нами процесса, а затем процесс завершится.

Листинг 16.4. Вызов процесса 

set wshshell = WScript.CreateObject("WScript.Shell")

set prog = wshshell.Exec("explorer.exe")

if prog.Status = 0 then

 MsgBox prog.ProcessID

 prog.Terminate 

End if

SendKeys

Работа этого метода довольно интересна. Он возвращает произвольное значение после завершения работы сценария. Например, если запустить в командном процессоре (cmd.exe) сценарий, содержащий строку wshshell.SendKeys "This message return over by script", то после завершения работы сценария в командном процессоре (то есть в строке для ввода команд командного процессора) появится указанное сообщение.

SpecialFolders

Метод предназначен для работы с пользовательскими папками. Он также поддерживает следующие методы.

■ Count — возвращает общее количество пользовательских папок.

■ Length — аналогичен предыдущему методу.

■ Item (индекс) — возвращает путь к папке, определенной данным индексом. Индекс может принимать значения от 0 до общего числа папок (возвращаемое методом Count значение).

Рассмотрим пример, отображающий пути ко всем возможным пользовательским папкам.

Листинг 16.5. Перечисление пользовательских папок

set wshshell = WScript.CreateObject("WScript.Shell")

For i = 0 to wshshell.SpecialFolders.Count – 1

 MsgBox wshshell.SpecialFolders.Item(i) 

Next

Как обычно, были рассмотрены далеко не все объекты и методы, которые доступны в Windows XP. Например, был пропущен такой интересный и знаменитый объект (знаменитый потому, что в свое время именно он использовался в почтовом черве ILOVEYOU), как объект для доступа к почтовым функциям программы Outlook Express. Объект поддерживает очень много методов, не говоря уже о других объектах Windows XP, поэтому их описание могло вылиться в отдельную книгу. В любом случае, автор рассчитывал создать лишь введение в возможности сервера сценариев Windows. Если эта тема вам интересна, рекомендуется купить отдельную книгу, посвященную только ей.

Глава 17