Командная строка и сценарии Windows

Собственная объектная модель WSH

Разбить на страницы
Показывать лекцию целиком

Собственная объектная модель WSH

Перейдем к описанию собственной объектной модели Windows Script Host. С помощью внутренних объектов WSH из сценариев можно выполнять следующие основные задачи:

  • выводить информацию в стандартный выходной поток (на экран) или в диалоговое окно Windows;
  • читать данные из стандартного входного потока (то есть вводить данные с клавиатуры) или использовать информацию, выводимую другой командой;
  • использовать свойства и методы внешних объектов, а также обрабатывать события, которые генерируются этими объектами;
  • запускать новые независимые процессы или активизировать уже имеющиеся;
  • запускать дочерние процессы с возможностью контроля их состояния и доступа к их стандартным входным и выходным потокам;
  • работать с локальной сетью: определять имя зарегистрировавшегося пользователя, подключать сетевые диски и принтеры;
  • просматривать и изменять переменные среды;
  • получать доступ к специальным папкам Windows;
  • создавать ярлыки Windows;
  • работать с системным реестром.
  • В WSH версии 5.6 (стандартная версия в Windows XP) входят перечисленные ниже объекты:

  • WScript. Это главный объект WSH, который служит для создания других объектов или связи с ними, содержит сведения о сервере сценариев, а также позволяет вводить данные с клавиатуры и выводить информацию на экран или в окно Windows.
  • WshArguments. Обеспечивает доступ ко всем параметрам командной строки запущенного сценария или ярлыка Windows.
  • WshNamed. Обеспечивает доступ к именным параметрам командной строки запущенного сценария.
  • WshUnnamed. Обеспечивает доступ к безымянным параметрам командной строки запущенного сценария.
  • WshShell. Позволяет запускать независимые процессы, создавать ярлыки, работать с переменными среды, системным реестром и специальными папками Windows.
  • WshSpecialFolders. Обеспечивает доступ к специальным папкам Windows.
  • WshShortcut. Позволяет работать с ярлыками Windows.
  • WshUrlShortcut. Предназначен для работы с ярлыками сетевых ресурсов.
  • WshEnvironment. Предназначен для просмотра, изменения и удаления переменных среды.
  • WshNetwork. Используется при работе с локальной сетью: содержит сетевую информацию для локального компьютера, позволяет подключать сетевые диски и принтеры.
  • WshScriptExec. Позволяет запускать консольные приложения в качестве дочерних процессов, обеспечивает контроль состояния этих приложений и доступ к их стандартным входным и выходным потокам.
  • WshController. Позволяет запускать сценарии на удаленных машинах.
  • WshRemote. Позволяет управлять сценарием, запущенным на удаленной машине.
  • WshRemoteError. Используется для получения информации об ошибке, возникшей в результате выполнения сценария, запущенного на удаленной машине.
  • Кроме этого, имеется объект FileSystemObject, обеспечивающий доступ к файловой системе компьютера (этот объект будет подробно рассмотрен в следующей лекции).

    Рассмотрим более подробно несколько объектов WSH, которые часто используются в сценариях.

    Объект WScript

    Свойства объекта WScript позволяют получить полный путь к использующемуся серверу сценариев (wscript.exe или cscript.exe), параметры командной строки, с которыми запущен сценарий, режим его работы (интерактивный или пакетный). Кроме этого, с помощью свойств объекта WScript можно выводить информацию в стандартный выходной поток и читать данные из стандартного входного потока. Также WScript предоставляет методы для работы внутри сценария с объектами автоматизации и вывода информации на экран (в текстовом режиме) или в окно Windows.

    Отметим, что в сценарии WSH объект WScript можно использовать сразу, без какого-либо предварительного описания или создания, так как его экземпляр создается сервером сценариев автоматически. Для использования же всех остальных объектов нужно использовать либо метод CreateObject, либо определенное свойство другого объекта.

    Свойства объекта WScript представлены в табл. 5.1.

    Свойства объекта WScript
    Свойство Описание
    Application Предоставляет интерфейс Idispatch для объекта WScript
    Arguments Содержит указатель на коллекцию WshArguments, содержащую параметры командной строки для исполняемого сценария
    FullName Содержит полный путь к исполняемому файлу сервера сценариев (в Windows XP обычно это C:\WINDOWS\SYSTEM32\CSCRIPT.EXE или C:\WINDOWS\SYSTEM32\WSCRIPT.EXE)
    Name Содержит название объекта Wscript (Windows Script Host)
    Path Содержит путь к каталогу, в котором находится cscript.exe или wscript.exe (в Windows XP обычно это C:\WINDOWS\SYSTEM32)
    ScriptFullName Содержит полный путь к запущенному сценарию
    ScriptName Содержит имя запущенного сценария
    StdErr Позволяет запущенному сценарию записывать сообщения в стандартный поток для ошибок
    StdIn Позволяет запущенному сценарию читать информацию из стандартного входного потока
    StdOut Позволяет запущенному сценарию записывать информацию в стандартный выходной поток
    Version Содержит версию WSH

    Опишем более подробно некоторые свойства объекта WScript.

    Свойство Arguments

    В следующем примере (листинг 5.1) с помощью цикла For Each … Next на экран выводятся все параметры командной строки, с которыми был запущен сценарий.

    '********************************************************************
    ' Имя: Args.vbs                                                   
    ' Язык: VBScript                                                    
    ' Описание: Работа с аргументами запущенного сценария              
    '********************************************************************
    Option Explicit
    
    Dim s,objArgs,Arg 
    Set objArgs = WScript.Arguments  ' Создаем объект WshArguments
    For Each Arg In objArgs
      s=s  Arg ' Формируем строки со значениями аргументов
    Next
    
    WScript.Echo s   ' Выводим сформированные строки
    '*************  Конец *********************************************

    Свойства StdErr, StdIn, StdOut

    Доступ к стандартным входным и выходным потокам с помощью свойств StdIn, StdOut и StdErr можно получить только в том случае, если сценарий запускался в консольном режиме с помощью cscript.exe. Если сценарий был запущен с помощью wscript.exe, то при попытке обратиться к этим свойствам возникнет ошибка "Invalid Handle".

    Работать с потоками StdOut и StdErr можно с помощью методов Write, WriteLine, WriteBlankLines, а с потоком StdIn — с помощью методов Read, ReadLine, ReadAll, Skip, SkipLine. Эти методы кратко описаны в табл. 5.2.

    Методы для работы с потоками
    МетодОписание
    Read(n) Считывает из потока StdIn заданное параметром n число символов и возвращает полученную строку
    ReadAll() Читает символы из потока StdIn до тех пор, пока не встретится символ конца файла ASCII 26 (<Ctrl>+<Z>), и возвращает полученную строку
    ReadLine() Возвращает строку, считанную из потока StdIn
    Skip(n) Пропускает при чтении из потока StdIn заданное параметром n число символов
    SkipLine() Пропускает целую строку при чтении из потока StdIn
    Write(string) Записывает в поток StdOut или StdErr строку string (без символа конца строки)
    WriteBlankLines(n) Записывает в поток StdOut или StdErr заданное параметром n число пустых строк
    WriteLine(string) Записывает в поток StdOut или StdErr строку string (вместе с символом конца строки)

    Напомним, что операционная система Windows поддерживает механизм конвейеризации (символ "|" в командной строке). Этот механизм делает возможным передачу данных от одной программы к другой. Таким образом, используя стандартные входные и выходные потоки, можно из сценария обрабатывать строки вывода другого приложения или перенаправлять выводимые сценарием данные на вход программ-фильтров ( FIND или SORT ). Например, следующая команда будет сортировать строки вывода сценария example.js и выводить их в файл sort.txt:

    cscript //Nologo example.js | sort > sort.txt

    Опция //Nologo здесь нужна для того, чтобы в файл sort.txt не попадали строки с информацией о разработчике и номере версии WSH.

    Кроме этого, с помощью методов, работающих с входным потоком StdIn, можно организовывать диалог с пользователем, то есть создавать интерактивные сценарии. Соответствующий пример приведен в листинге 5.2.

    '*******************************************************************
    '* Имя: Interact.vbs                                               
    '* Язык: VBScript                                                  
    '* Описание: Ввод/вывод строк в консольном режиме                  
    '*******************************************************************
    Dim  s
    ' Выводим строку на экран
    WScript.StdOut.Write "Введите число: "
    ' Считываем строку
    s = WScript.StdIn.ReadLine
    ' Выводим строку на экран
    WScript.StdOut.WriteLine "Вы ввели число "  s
    '*************  Конец *********************************************

    Методы объекта WScript

    Объект WScript имеет несколько методов, которые описаны в табл. 5.3.

    Методы объекта WScript
    МетодОписание
    CreateObject(strProgID [, strPrefix]) Создает объект, заданный параметром strProgID
    ConnectObject(strObject, strPrefix) Устанавливает соединение с объектом strObject, позволяющее писать функции-обработчики его событий (имена этих функций должны начинаться с префикса strPrefix )
    DisconnectObject(obj) Отсоединяет объект obj, связь с которым была предварительно установлена в сценарии
    Echo([Arg1] [, Arg2] [,…]) Выводит текстовую информацию на консоль или в диалоговое окно
    GetObject(strPathname [, strProgID], [strPrefix]) Активизирует объект автоматизации, определяемый заданным файлом (параметр strPathName ) или объект, заданный параметром strProgID
    Quit([intErrorCode]) Прерывает выполнение сценария с заданным параметром intErrorCode кодом выхода. Если параметр intErrorCode не задан, то объект WScript установит код выхода равным нулю
    Sleep(intTime) Приостанавливает выполнения сценария (переводит его в неактивное состояние) на заданное параметром intTime число миллисекунд

    Приведем дополнительные пояснения и примеры использования для методов, приведенных в табл. 5.3.

    Метод CreateObject

    Строковый параметр strProgID, указываемый в методе CreateObject, называется программным идентификатором объекта (Programmic Identifier, ProgID).

    Если указан необязательный параметр strPrefix, то после создания объекта в сценарии можно обрабатывать события, возникающие в этом объекте (естественно, если объект предоставляет интерфейсы для связи с этими событиями). Когда объект сообщает о возникновении определенного события, сервер сценариев вызывает функцию, имя которой состоит из префикса strPrefix и имени этого события. Например, если в качестве strPrefix указано "MYOBJ_", а объект сообщает о возникновении события "OnBegin," то будет запущена функция "MYOBJ_OnBegin", которая должна быть описана в сценарии.

    В следующем примере метод CreateObject используется для создания объекта WshNetwork:

    var WshNetwork = WScript.CreateObject("WScript.Network");

    Отметим, что объекты автоматизации из сценариев можно создавать и без помощи WSH. В JScript для этого используется объект ActiveXObject, например:

    var WshNetwork = new ActiveXObject("WScript.Network");

    В VBScript для создания объектов может использоваться специальная функция CreateObject, например:

    Set WshNetwork = CreateObject("WScript.Network")

    Однако организовать в сценарии обработку событий создаваемого объекта можно только при использовании метода WScript.CreateObject.

    Метод ConnectObject

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

    В следующем примере в переменной MyObject создается абстрактный объект "SomeObject", затем из сценария вызывается метод SomeMetod этого объекта. После этого устанавливается связь с переменной MyObject и задается префикс "MyEvent" для процедур обработки события этого объекта. Если в объекте возникнет событие с именем "Event", то будет вызвана функция MyEvent_Event. Метод DisconnectObject объекта WScript производит отсоединение объекта MyObject.

    var MyObject = WScript.CreateObject("SomeObject");
    MyObject.SomeMethod();
    WScript.ConnectObject(MyObject,"MyEvent");
    
    function MyEvent_Event(strName){
      WScript.Echo(strName);
      }
    WScript.DisconnectObject(MyObject);

    Метод Echo

    Параметры Arg1, Arg2, … метода Echo задают аргументы для вывода. Если сценарий был запущен с помощью wscript.exe, то метод Echo направляет вывод в диалоговое окно, если же для выполнения сценария применяется cscript.exe, то вывод будет направлен на экран (консоль). Каждый из аргументов при выводе будет разделен пробелом. В случае использования cscript.exe вывод всех аргументов будет завершен символом новой строки. Если в методе Echo не задан ни один аргумент, то будет напечатана пустая строка.

    Например, после выполнения сценария EchoExample.vbs (листинг 5.3) с помощью cscript.exe на экран будут выведены пустая строка, три числа и строка текста.

    '*******************************************************************
    '* Имя: EchoExample.vbs                                            
    '* Язык: VBScript                                                   
    '* Описание: Использование метода WScript.Echo                     
    '*******************************************************************
    WScript.Echo            'Выводим пустую строку
    WScript.Echo 1,2,3      'Выводим числа
    WScript.Echo "Привет!"  'Выводим строку
    '*************  Конец *********************************************

    Метод Sleep

    В следующем примере сценарий переводится в неактивное состояние на 5 секунд:

    '*******************************************************************
    '* Имя: SleepExample.vbs                                            
    '* Язык: VBScript                                                   
    '* Описание: Использование метода WScript.Sleep                     
    '*******************************************************************
    WScript.Echo "Сценарий запущен, отдыхаем…"
    WScript.Sleep 5000
    WScript.Echo "Выполнение сценария завершено"
    '*************  Конец *********************************************

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

    Объект WshShell

    С помощью объекта WshShell можно запускать новый процесс, создавать ярлыки, работать с системным реестром, получать доступ к переменным среды и специальным папкам Windows. Создается этот объект следующим образом:

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

    Объект WshShell имеет три свойства, которые приведены в табл. 5.4.

    Свойства объекта WshShell
    СвойствоОписание
    CurrentDirectory Здесь хранится полный путь к текущему каталогу (к каталогу, из которого был запущен сценарий)
    Environment Содержит объект WshEnvironment, который обеспечивает доступ к переменным среды операционной системы для Windows NT/2000/XP или к переменным среды текущего командного окна для Windows 9x
    SpecialFolders Содержит объект WshSpecialFolders для доступа к специальным папкам Windows (рабочий стол, меню Пуск (Start) и т. д.)

    Опишем теперь методы, имеющиеся у объекта WshShell (табл. 5.5).

    Методы объекта WshShell
    МетодОписание
    AppActivate(title) Активизирует заданное параметром title окно приложения. Строка title задает название окна (например, "calc" или "notepad" ) или идентификатор процесса ( Process ID, PID )
    CreateShortcut(strPathname) Создает объект WshShortcut для связи с ярлыком Windows (расширение lnk) или объект WshUrlShortcut для связи с сетевым ярлыком (расширение url). Параметр strPathname задает полный путь к создаваемому или изменяемому ярлыку
    Environment(strType) Возвращает объект WshEnvironment, содержащий переменные среды заданного вида
    Exec(strCommand) Создает новый дочерний процесс, который запускает консольное приложение, заданное параметром strCommand. В результате возвращается объект WshScriptExec, позволяющий контролировать ход выполнения запущенного приложения и обеспечивающий доступ к потокам StdIn, StdOut и StdErr этого приложения
    ExpandEnvironmentStrings(strString) Возвращает значение переменной среды текущего командного окна, заданной строкой strString (имя переменной должно быть окружено знаками "%" )
    LogEvent(intType, strMessage [,strTarget]) Протоколирует события в журнале Windows NT/2000/XP или в файле WSH.log. Целочисленный параметр intType определяет тип сообщения, строка strMessage — текст сообщения. Параметр strTarget может задаваться только в Windows NT/2000/XP, он определяет название системы, в которой протоколируются события (по умолчанию это локальная система). Метод LogEvent возвращает true, если событие записано успешно и false в противном случае
    Popup(strText,[nSecToWait], [strTitle], [nType]) Выводит на экран информационное окно с сообщением, заданным параметром strText. Параметр nSecToWait задает количество секунд, по истечении которых окно будет автоматически закрыто, параметр strTitle определяет заголовок окна, параметр nType указывает тип кнопок и значка для окна
    RegDelete(strName) Удаляет из системного реестра заданный параметр или раздел целиком
    RegRead(strName) Возвращает значение параметра реестра или значение по умолчанию для раздела реестра
    RegWrite(strName, anyValue [,strType]) Записывает в реестр значение заданного параметра или значение по умолчанию для раздела
    Run(strCommand, [intWindowStyle], [bWaitOnReturn]) Создает новый независимый процесс, который запускает приложение, заданное параметром strCommand
    SendKeys(string) Посылает одно или несколько нажатий клавиш в активное окно (эффект тот же, как если бы вы нажимали эти клавиши на клавиатуре)
    SpecialFolders(strSpecFolder) Возвращает строку, содержащую путь к специальной папке Windows, заданной параметром strSpecFolder

    Рассмотрим более подробно некоторые методы, приведенные в табл. 5.5.

    Метод CreateShortcut

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

    Приведем пример сценария, в котором создаются два ярлыка — на сам выполняемый сценарий (объект oShellLink ) и на сетевой ресурс ( oUrlLink ).

    '*****************************************************************
    '* Имя: MakeShortcuts.vbs                                        
    '* Язык: VBScript                                                 
    '* Описание: Создание ярлыков из сценария                        
    '*****************************************************************
    Dim WshShell,oShellLink,oUrlLink
    ' Создаем объект WshShell
    Set WshShell=WScript.CreateObject("WScript.Shell")
    ' Создаем ярлык на файл
    Set oShellLink=WshShell.CreateShortcut("Current Script.lnk")
    ' Устанавливаем путь к файлу
    oShellLink.TargetPath=WScript.ScriptFullName
    ' Сохраняем ярлык
    oShellLink.Save
    
    ' Создаем ярлык на сетевой ресурс
    Set oUrlLink = WshShell.CreateShortcut("Microsoft Web Site.URL")
    ' Устанавливаем URL
    oUrlLink.TargetPath = "http://www.microsoft.com"
    ' Сохраняем ярлык
    oUrlLink.Save
    '*************  Конец *********************************************

    Метод Environment

    Параметр strType задает вид переменных среды, которые будут записаны в коллекции WshEnvironment ; возможными значениями этого параметра являются "System" (переменные среды операционной системы), "User" (переменные среды пользователя), "Volatile" (временные переменные) или "Process" (переменные среды текущего командного окна).

    В следующем примере (листинг 5.6) мы распечатываем число процессоров, имеющихся в компьютере с операционной системой Windows XP (переменная NUMBER_OF_PROCESSORS ), и тип операционной системы.

    '*****************************************************************
    '* Имя: ShowEnvir.vbs                                             
    '* Язык: VBScript                                                 
    '* Описание: Получение значений некоторых переменных среды       
    '*****************************************************************
    Dim WshShell,WshSysEnv
    ' Создаем объект WshShell
    Set WshShell = WScript.CreateObject("WScript.Shell")
    ' Создание коллекции WshEnvironment
    Set WshSysEnv = WshShell.Environment("SYSTEM")
    WScript.Echo WshSysEnv("OS")
    WScript.Echo WshShell.Environment.Item("NUMBER_OF_PROCESSORS")
    '*************  Конец *********************************************

    Метод Run

    Параметр intWindowStyle устанавливает вид окна для запускаемого приложения (табл. 5.6).

    Типы окна (intWindowStyle)
    ПараметрКонстанта Visual BasicОписание
    0 vbHide Прячет текущее окно и активизирует другое окно (показывает его и передает ему фокус)
    1 vbNormalFocus Активизирует и отображает окно. Если окно было минимизировано или максимизировано, система восстановит его первоначальное положение и размер. Этот флаг должен указываться сценарием во время первого отображения окна
    2 vbMinimizedFocus Активизирует окно и отображает его в минимизированном (свернутом) виде
    3 vbMaximizedFocus Активизирует окно и отображает его в максимизированном (развернутом) виде
    4 vbNormalNoFocus Отображает окно в том виде, в котором оно находилось последний раз. Активное окно при этом остается активным
    5 Активизирует окно и отображает его в текущем состоянии
    6 vbMinimizedNoFocus Минимизирует заданное окно и активизирует следующее (в Z-порядке) окно
    7 Отображает окно в свернутом виде. Активное окно при этом остается активным
    8 Отображает окно в его текущем состоянии. Активное окно при этом остается активным
    9 Активизирует и отображает окно. Если окно было минимизировано или максимизировано, система восстановит его первоначальное положение и размер. Этот флаг должен указываться, если производится восстановление свернутого окна (его нельзя использовать в методе Run )
    10 Устанавливает режим отображения, опирающийся на режим программы, которая запускает приложение

    Необязательный параметр bWaitOnReturn является логической переменной, дающей указание ожидать завершения запущенного процесса. Если этот параметр не указан или установлен в false, то после запуска из сценария нового процесса управление сразу же возвращается обратно в сценарий (не дожидаясь завершения запущенного процесса). Если же bWaitOnReturn установлен в true, то сценарий возобновит работу только после завершения вызванного процесса.

    При этом если параметр bWaitOnReturn равен true, то метод Run возвращает код выхода вызванного приложения. Если же bWaitOnReturn равен false или не задан, то метод Run всегда возвращает ноль.

    Следующий сценарий (листинг 5.7) печатает код выхода вызванного приложения (Блокнот).

    '********************************************************************
    '* Имя: RetCode.vbs                                                  
    '* Язык: VBScript                                                    
    '* Описание: Вывод кода выхода запущенного приложения               
    '********************************************************************
    ' Создаем объект WshShell
    Set WshShell = WScript.CreateObject("WScript.Shell")
    ' Запускаем Блокнот и ожидаем завершения его работы
    Return = WshShell.Run("notepad " + WScript.ScriptFullName, 1, true)
    ' Печатаем код возврата
    WScript.Echo "Код возврата:", Return
    '*************  Конец ***********************************************

    Метод SendKeys

    Каждая клавиша задается одним или несколькими символами. Например, Для того чтобы задать нажатие друг за другом букв А, Б и В нужно указать в качестве параметра для SendKeys строку "АБВ": string="АБВ".

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

    Для задания неотображаемых символов, таких как <Enter> или <Tab>, и специальных клавиш в методе SendKeys используются коды, представленные в табл.5.7.

    Коды специальных клавишей для SendKeys
    Названия клавишиКодНазвания клавишиКод
    <Backspace> {BACKSPACE}, {BS} или {BKSP} < $$\to$$ > {RIGHT}
    <Break> {BREAK} <F1> {F1}
    <Caps Lock> {CAPSLOCK} <F2> {F2}
    <Del> или <Delete> {DELETE} или {DEL} <F3> {F3}
    <End> {END} <F4> {F4}
    <Enter> {ENTER} или ~ <F5> {F5}
    <Esc> {ESC} <F6> {F6}
    <Home> {HOME} <F7> {F7}
    <Ins> или <Insert> {INSERT} или {INS} <F8> {F8}
    <Num Lock> {NUMLOCK} <F9> {F9}
    <Page Down> {PGDN} <F10> {F10}
    <Page Up> {PGUP} <F11> {F11}
    <Print Screen> {PRTSC} <F12> {F12}
    <Scroll Lock> {SCROLLLOCK} <F13> {F13}
    <Tab> {TAB} <F14> {F14}
    < $$\uparrow$$ > {UP} <F15> {F15}
    < $$\gets$$ > {LEFT} <F16> {F16}
    < $$\downarrow$$ > {DOWN}

    Для задания комбинаций клавиш с <Shift>, <Ctrl> или <Alt>, перед соответствующей клавишей нужно поставить один или несколько кодов из табл. 5.8:

    Коды клавиш <Shift>, <Ctrl> и <Alt>
    КлавишаКод
    <Shift> +
    <Ctrl> ^
    <Alt> %

    Для того чтобы задать комбинацию клавиш, которую нужно набирать, удерживая нажатыми клавиши <Shift>, <Ctrl> или <Alt>, нужно заключить коды этих клавиш в скобки. Например, если требуется сымитировать нажатие клавиш G и S при нажатой клавише <Shift>, следует использовать последовательность "+(GS)". Для того же, чтобы задать одновременное нажатие клавиш <Shift>+<G>, а затем <S> (уже без <Shift>), используется "+GS".

    В методе SendKeys можно задать несколько нажатий подряд одной и той же клавиши. Для этого необходимо в фигурных скобках указать код нужной клавиши, а через пробел — число нажатий. Например, {LEFT 42} означает нажатие клавиши <?> 42 раза подряд; {h 10} означает нажатие клавиши h 10 раз подряд.

    В качестве примера использования методов SendKeys и AppActivate приведен сценарий RunCalc.vbs (листинг 5.8), который запускает стандартный калькулятор Windows и выполняет в нем несколько простых арифметических действий.

    '*****************************************************************
    '* Имя: RunCalc.vbs                                               
    '* Язык: VBScript                                                 
    '* Описание: Активизация приложения с помощью имени окна         
    '*****************************************************************
    Dim WshShell
    ' Создаем объект WshShell
    Set WshShell=WScript.CreateObject("WScript.Shell")
    ' Запускаем Калькулятор
    WshShell.Run "calc"
    ' Приостанавливаем сценарий на 1 секунду
    WScript.Sleep 1000
    ' Активизируем Калькулятор
    WshShell.AppActivate "Calculator"
    ' Приостановка сценария на 0,1 секунды
    WScript.Sleep(100)
    ' Посылаем нажатия клавиш в Калькулятор
    WshShell.SendKeys "1{+}"
    WScript.Sleep 500
    WshShell.SendKeys "2"
    WScript.Sleep 500
    WshShell.SendKeys "~"
    WScript.Sleep 2500
    '*************  Конец *********************************************

    Объекты-коллекции

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

  • параметры командной строки запущенного сценария или ярлыка Windows (объекты WshArguments, WshNamed и WshUnnamed );
  • значения переменных среды (объект WshEnvironment );
  • пути к специальным папкам Windows (объект WshSpecialFolders ).
  • Объект WshArguments

    Объект WshArguments содержит коллекцию всех параметров командной строки запущенного сценария или ярлыка Windows. Этот объект можно создать только с помощью свойства Arguments объектов WScript и WshShortcut.

    С помощью объекта WshArguments можно также выделять и отдельно обрабатывать аргументы сценария, у которых имеются имена (например, /Name:Andrey ) и безымянные аргументы. Ясно, что использование именных параметров более удобно, так как в этом случае нет необходимости запоминать, в каком порядке должны быть записаны параметры при запуске того или иного сценария.

    Для доступа к именным и безымянным аргументам используются соответственно два специальных свойства объекта WshArguments: Named и Unnamed. Свойство Named содержит ссылку на коллекцию WshNamed, свойство Unnamed — на коллекцию WshUnnamed.

    Таким образом, обрабатывать параметры командной строки запущенного сценария можно тремя способами:

  • просматривать полный набор всех параметров (как именных, так и безымянных) с помощью коллекции WshArguments ;
  • выделить только те параметры, у которых есть имена (именные параметры) с помощью коллекции WshNamed ;
  • выделить только те параметры, у которых нет имен (безымянные параметры) с помощью коллекции WshUnnamed.
  • В листинге 5.9 приведен пример сценария, в котором на экран выводятся общее количество параметров командной строки, количество именных и безымянных аргументов, а также значения каждой из этих групп параметров.

    '********************************************************************
    ' Имя: Args.vbs
    ' Язык: VBScript
    ' Описание: Работа с аргументами запущенного сценария
    '********************************************************************
    Option Explicit
    
    Dim i,Arg,objArgs,s,objNamedArgs,objUnnamedArgs  ' Объявляем переменные
    
    Set objArgs = WScript.Arguments  ' Создаем объект WshArguments
    ' Определяем общее количество аргументов
    s="Всего аргументов: "  objArgs.Count()  vbCrLf
    For Each Arg In objArgs
      s=s  Arg  vbCrLf  ' Формируем строки со значениями аргументов
    Next
    
    Set objUnnamedArgs=objArgs.Unnamed  ' Создаем объект WshUnnamed
    ' Определяем количество безымянных аргументов
    s=s  vbCrLf  "Безымянных аргументов: "  objUnnamedArgs.length  vbCrLf
    For Each Arg In objUnnamedArgs
      ' Формируем строки со значениями безымянных аргументов
      s=s  Arg  vbCrLf
    Next
    
    Set objNamedArgs=objArgs.Named  ' Создаем объект WshNamed
    ' Определяем количество именных аргументов
    s=s  vbCrLf  "Именных аргументов: "  objNamedArgs.Length  vbCrLf
    ' Проверяем, существует ли аргумент /Имя:
    If objNamedArgs.Exists("Имя") Then
      s=s  objNamedArgs("Имя")  vbCrLf
    End If
    ' Проверяем, существует ли аргумент /Comp:
    If objNamedArgs.Exists("Comp") Then
      s=s  objNamedArgs("Comp")  vbCrLf
    End If
    
    WScript.Echo s   ' Выводим сформированные строки
    '*************  Конец *********************************************

    Объект WshEnvironment

    Объект WshEnvironment позволяет получить доступ к коллекции, содержащей переменные среды заданного типа (переменные среды операционной системы, переменные среды пользователя или переменные среды текущего командного окна). Этот объект можно создать с помощью свойства Environment объекта WshShell или одноименного его метода:

    Set WshShell=WScript.CreateObject("WScript.Shell")
    Set WshSysEnv=WshShell.Environment
    Set WshUserEnv=WshShell.Environment("User")

    Объект WshEnvironment имеет свойство Length, в котором хранится число элементов в коллекции (количество переменных среды), и методы Count и Item. Для того чтобы получить значение определенной переменной среды, в качестве аргумента метода Item указывается имя этой переменной в двойных кавычках. В следующем примере мы выводим на экран значение переменной среды PATH (листинг 5.10):

    '********************************************************************
    ' Имя: Environment.vbs
    ' Язык: VBScript
    ' Описание: Работа с переменными среды
    '********************************************************************
    Dim WshShell, WshSysEnv
    Set WshShell=WScript.CreateObject("WScript.Shell")
    Set WshSysEnv=WshShell.Environment
    WScript.Echo "Системный путь:",WshSysEnv.Item("PATH")

    Можно также просто указать имя переменной в круглых скобках после имени объекта:

    WScript.Echo "Системный путь:",WshSysEnv("PATH")

    Кроме этого у объекта WshEnvironment имеется метод Remove(strName), который удаляет заданную переменную среды.

    Объект WshSpecialFolders

    При установке Windows всегда автоматически создаются несколько специальных папок (например, папка для рабочего стола (Desktop) или папка для меню Пуск (Start)), путь к которым впоследствии может быть тем или иным способом изменен. Объект WshSpecialFolders обеспечивает доступ к коллекции, содержащей пути к специальным папкам Windows; задание путей к таким папкам может понадобиться, например, для создания непосредственно из сценария ярлыков на рабочем столе.

    В Windows XP поддерживаются следующие имена специальных папок:

  • Desktop;
  • Favorites;
  • Fonts;
  • MyDocuments;
  • NetHood;
  • PrintHood;
  • Programs;
  • Recent;
  • SendTo;
  • StartMenu;
  • Startup;
  • Templates;
  • AllUsersDesktop;
  • AllUsersStartMenu;
  • AllUsersPrograms;
  • AllUsersStartup.
  • Объект WshSpecialFolders создается с помощью свойства SpecialFolders объекта WshShell:

    var WshShell=WScript.CreateObject("WScript.Shell"),
        WshSpecFold=WshShell.SpecialFolders;

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

    '*****************************************************************
    ' Имя: SpecFold1.vbs
    ' Язык: VBScript
    ' Описание: Вывод названий всех специальных папок Windows
    '*****************************************************************
    Option Explicit
    
    Dim WshShell, WshFldrs, SpecFldr, s  ' Объявляем переменные
    ' Создаем объект WshShell
    Set WshShell = WScript.CreateObject("Wscript.Shell")
    ' Создаем объект WshSpecialFolders
    Set WshFldrs = WshShell.SpecialFolders
    s="Список всех специальных папок:"  vbCrLf  vbCrLf
    ' Перебираем все элементы коллекции WshFldrs
    For Each SpecFldr In WshFldrs
      ' Формируем строки с путями к специальным папкам
      s=s  SpecFldr  vbCrLf
    Next
    WScript.Echo s
    '*************  Конец *********************************************/

    Объект WshSpecialFolders также позволяет получить путь к конкретно заданной специальной папке. Например, в сценарии SpecFold2.vbs (листинг 5.12) на экран выводятся пути к папкам рабочего стола (Desktop), избранных ссылок (Favorites) и раздела Программы (Programs) меню Пуск (Run).

    '******************************************************************
    ' Имя: SpecFold2.vbs
    ' Язык: VBScript
    ' Описание: Вывод названий заданных специальных папок Windows
    '******************************************************************
    Option Explicit
    
    Dim WshShell, WshFldrs, s   ' Объявляем переменные
    ' Создаем объект WshShell
    Set WshShell = WScript.CreateObject("Wscript.Shell")
    ' Создаем объект WshSpecialFolders
    Set WshFldrs = WshShell.SpecialFolders
    ' Формируем строки с путями к конкретным специальным папкам
    s="Некоторые специальные папки:"  vbCrLf  vbCrLf
    s=s+"Desktop:"+WshFldrs("Desktop")  vbCrLf
    s=s+"Favorites:"+WshFldrs("Favorites")  vbCrLf
    s=s+"Programs:"+WshFldrs("Programs")
    WScript.Echo s   ' Выводим сформированные строки на экран
    '*************  Конец *********************************************/
    Страницы:

    Собственная объектная модель WSH

    Перейдем к описанию собственной объектной модели Windows Script Host. С помощью внутренних объектов WSH из сценариев можно выполнять следующие основные задачи:

  • выводить информацию в стандартный выходной поток (на экран) или в диалоговое окно Windows;
  • читать данные из стандартного входного потока (то есть вводить данные с клавиатуры) или использовать информацию, выводимую другой командой;
  • использовать свойства и методы внешних объектов, а также обрабатывать события, которые генерируются этими объектами;
  • запускать новые независимые процессы или активизировать уже имеющиеся;
  • запускать дочерние процессы с возможностью контроля их состояния и доступа к их стандартным входным и выходным потокам;
  • работать с локальной сетью: определять имя зарегистрировавшегося пользователя, подключать сетевые диски и принтеры;
  • просматривать и изменять переменные среды;
  • получать доступ к специальным папкам Windows;
  • создавать ярлыки Windows;
  • работать с системным реестром.
  • В WSH версии 5.6 (стандартная версия в Windows XP) входят перечисленные ниже объекты:

  • WScript. Это главный объект WSH, который служит для создания других объектов или связи с ними, содержит сведения о сервере сценариев, а также позволяет вводить данные с клавиатуры и выводить информацию на экран или в окно Windows.
  • WshArguments. Обеспечивает доступ ко всем параметрам командной строки запущенного сценария или ярлыка Windows.
  • WshNamed. Обеспечивает доступ к именным параметрам командной строки запущенного сценария.
  • WshUnnamed. Обеспечивает доступ к безымянным параметрам командной строки запущенного сценария.
  • WshShell. Позволяет запускать независимые процессы, создавать ярлыки, работать с переменными среды, системным реестром и специальными папками Windows.
  • WshSpecialFolders. Обеспечивает доступ к специальным папкам Windows.
  • WshShortcut. Позволяет работать с ярлыками Windows.
  • WshUrlShortcut. Предназначен для работы с ярлыками сетевых ресурсов.
  • WshEnvironment. Предназначен для просмотра, изменения и удаления переменных среды.
  • WshNetwork. Используется при работе с локальной сетью: содержит сетевую информацию для локального компьютера, позволяет подключать сетевые диски и принтеры.
  • WshScriptExec. Позволяет запускать консольные приложения в качестве дочерних процессов, обеспечивает контроль состояния этих приложений и доступ к их стандартным входным и выходным потокам.
  • WshController. Позволяет запускать сценарии на удаленных машинах.
  • WshRemote. Позволяет управлять сценарием, запущенным на удаленной машине.
  • WshRemoteError. Используется для получения информации об ошибке, возникшей в результате выполнения сценария, запущенного на удаленной машине.
  • Кроме этого, имеется объект FileSystemObject, обеспечивающий доступ к файловой системе компьютера (этот объект будет подробно рассмотрен в следующей лекции).

    Рассмотрим более подробно несколько объектов WSH, которые часто используются в сценариях.

    Объект WScript

    Свойства объекта WScript позволяют получить полный путь к использующемуся серверу сценариев (wscript.exe или cscript.exe), параметры командной строки, с которыми запущен сценарий, режим его работы (интерактивный или пакетный). Кроме этого, с помощью свойств объекта WScript можно выводить информацию в стандартный выходной поток и читать данные из стандартного входного потока. Также WScript предоставляет методы для работы внутри сценария с объектами автоматизации и вывода информации на экран (в текстовом режиме) или в окно Windows.

    Отметим, что в сценарии WSH объект WScript можно использовать сразу, без какого-либо предварительного описания или создания, так как его экземпляр создается сервером сценариев автоматически. Для использования же всех остальных объектов нужно использовать либо метод CreateObject, либо определенное свойство другого объекта.

    Свойства объекта WScript представлены в табл. 5.1.

    Свойства объекта WScript
    Свойство Описание
    Application Предоставляет интерфейс Idispatch для объекта WScript
    Arguments Содержит указатель на коллекцию WshArguments, содержащую параметры командной строки для исполняемого сценария
    FullName Содержит полный путь к исполняемому файлу сервера сценариев (в Windows XP обычно это C:\WINDOWS\SYSTEM32\CSCRIPT.EXE или C:\WINDOWS\SYSTEM32\WSCRIPT.EXE)
    Name Содержит название объекта Wscript (Windows Script Host)
    Path Содержит путь к каталогу, в котором находится cscript.exe или wscript.exe (в Windows XP обычно это C:\WINDOWS\SYSTEM32)
    ScriptFullName Содержит полный путь к запущенному сценарию
    ScriptName Содержит имя запущенного сценария
    StdErr Позволяет запущенному сценарию записывать сообщения в стандартный поток для ошибок
    StdIn Позволяет запущенному сценарию читать информацию из стандартного входного потока
    StdOut Позволяет запущенному сценарию записывать информацию в стандартный выходной поток
    Version Содержит версию WSH

    Опишем более подробно некоторые свойства объекта WScript.

    Свойство Arguments

    В следующем примере (листинг 5.1) с помощью цикла For Each … Next на экран выводятся все параметры командной строки, с которыми был запущен сценарий.

    '********************************************************************
    ' Имя: Args.vbs                                                   
    ' Язык: VBScript                                                    
    ' Описание: Работа с аргументами запущенного сценария              
    '********************************************************************
    Option Explicit
    
    Dim s,objArgs,Arg 
    Set objArgs = WScript.Arguments  ' Создаем объект WshArguments
    For Each Arg In objArgs
      s=s  Arg ' Формируем строки со значениями аргументов
    Next
    
    WScript.Echo s   ' Выводим сформированные строки
    '*************  Конец *********************************************

    Свойства StdErr, StdIn, StdOut

    Доступ к стандартным входным и выходным потокам с помощью свойств StdIn, StdOut и StdErr можно получить только в том случае, если сценарий запускался в консольном режиме с помощью cscript.exe. Если сценарий был запущен с помощью wscript.exe, то при попытке обратиться к этим свойствам возникнет ошибка "Invalid Handle".

    Работать с потоками StdOut и StdErr можно с помощью методов Write, WriteLine, WriteBlankLines, а с потоком StdIn — с помощью методов Read, ReadLine, ReadAll, Skip, SkipLine. Эти методы кратко описаны в табл. 5.2.

    Методы для работы с потоками
    МетодОписание
    Read(n) Считывает из потока StdIn заданное параметром n число символов и возвращает полученную строку
    ReadAll() Читает символы из потока StdIn до тех пор, пока не встретится символ конца файла ASCII 26 (<Ctrl>+<Z>), и возвращает полученную строку
    ReadLine() Возвращает строку, считанную из потока StdIn
    Skip(n) Пропускает при чтении из потока StdIn заданное параметром n число символов
    SkipLine() Пропускает целую строку при чтении из потока StdIn
    Write(string) Записывает в поток StdOut или StdErr строку string (без символа конца строки)
    WriteBlankLines(n) Записывает в поток StdOut или StdErr заданное параметром n число пустых строк
    WriteLine(string) Записывает в поток StdOut или StdErr строку string (вместе с символом конца строки)

    Напомним, что операционная система Windows поддерживает механизм конвейеризации (символ "|" в командной строке). Этот механизм делает возможным передачу данных от одной программы к другой. Таким образом, используя стандартные входные и выходные потоки, можно из сценария обрабатывать строки вывода другого приложения или перенаправлять выводимые сценарием данные на вход программ-фильтров ( FIND или SORT ). Например, следующая команда будет сортировать строки вывода сценария example.js и выводить их в файл sort.txt:

    cscript //Nologo example.js | sort > sort.txt

    Опция //Nologo здесь нужна для того, чтобы в файл sort.txt не попадали строки с информацией о разработчике и номере версии WSH.

    Кроме этого, с помощью методов, работающих с входным потоком StdIn, можно организовывать диалог с пользователем, то есть создавать интерактивные сценарии. Соответствующий пример приведен в листинге 5.2.

    '*******************************************************************
    '* Имя: Interact.vbs                                               
    '* Язык: VBScript                                                  
    '* Описание: Ввод/вывод строк в консольном режиме                  
    '*******************************************************************
    Dim  s
    ' Выводим строку на экран
    WScript.StdOut.Write "Введите число: "
    ' Считываем строку
    s = WScript.StdIn.ReadLine
    ' Выводим строку на экран
    WScript.StdOut.WriteLine "Вы ввели число "  s
    '*************  Конец *********************************************

    Методы объекта WScript

    Объект WScript имеет несколько методов, которые описаны в табл. 5.3.

    Методы объекта WScript
    МетодОписание
    CreateObject(strProgID [, strPrefix]) Создает объект, заданный параметром strProgID
    ConnectObject(strObject, strPrefix) Устанавливает соединение с объектом strObject, позволяющее писать функции-обработчики его событий (имена этих функций должны начинаться с префикса strPrefix )
    DisconnectObject(obj) Отсоединяет объект obj, связь с которым была предварительно установлена в сценарии
    Echo([Arg1] [, Arg2] [,…]) Выводит текстовую информацию на консоль или в диалоговое окно
    GetObject(strPathname [, strProgID], [strPrefix]) Активизирует объект автоматизации, определяемый заданным файлом (параметр strPathName ) или объект, заданный параметром strProgID
    Quit([intErrorCode]) Прерывает выполнение сценария с заданным параметром intErrorCode кодом выхода. Если параметр intErrorCode не задан, то объект WScript установит код выхода равным нулю
    Sleep(intTime) Приостанавливает выполнения сценария (переводит его в неактивное состояние) на заданное параметром intTime число миллисекунд

    Приведем дополнительные пояснения и примеры использования для методов, приведенных в табл. 5.3.

    Метод CreateObject

    Строковый параметр strProgID, указываемый в методе CreateObject, называется программным идентификатором объекта (Programmic Identifier, ProgID).

    Если указан необязательный параметр strPrefix, то после создания объекта в сценарии можно обрабатывать события, возникающие в этом объекте (естественно, если объект предоставляет интерфейсы для связи с этими событиями). Когда объект сообщает о возникновении определенного события, сервер сценариев вызывает функцию, имя которой состоит из префикса strPrefix и имени этого события. Например, если в качестве strPrefix указано "MYOBJ_", а объект сообщает о возникновении события "OnBegin," то будет запущена функция "MYOBJ_OnBegin", которая должна быть описана в сценарии.

    В следующем примере метод CreateObject используется для создания объекта WshNetwork:

    var WshNetwork = WScript.CreateObject("WScript.Network");

    Отметим, что объекты автоматизации из сценариев можно создавать и без помощи WSH. В JScript для этого используется объект ActiveXObject, например:

    var WshNetwork = new ActiveXObject("WScript.Network");

    В VBScript для создания объектов может использоваться специальная функция CreateObject, например:

    Set WshNetwork = CreateObject("WScript.Network")

    Однако организовать в сценарии обработку событий создаваемого объекта можно только при использовании метода WScript.CreateObject.

    Метод ConnectObject

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

    В следующем примере в переменной MyObject создается абстрактный объект "SomeObject", затем из сценария вызывается метод SomeMetod этого объекта. После этого устанавливается связь с переменной MyObject и задается префикс "MyEvent" для процедур обработки события этого объекта. Если в объекте возникнет событие с именем "Event", то будет вызвана функция MyEvent_Event. Метод DisconnectObject объекта WScript производит отсоединение объекта MyObject.

    var MyObject = WScript.CreateObject("SomeObject");
    MyObject.SomeMethod();
    WScript.ConnectObject(MyObject,"MyEvent");
    
    function MyEvent_Event(strName){
      WScript.Echo(strName);
      }
    WScript.DisconnectObject(MyObject);

    Метод Echo

    Параметры Arg1, Arg2, … метода Echo задают аргументы для вывода. Если сценарий был запущен с помощью wscript.exe, то метод Echo направляет вывод в диалоговое окно, если же для выполнения сценария применяется cscript.exe, то вывод будет направлен на экран (консоль). Каждый из аргументов при выводе будет разделен пробелом. В случае использования cscript.exe вывод всех аргументов будет завершен символом новой строки. Если в методе Echo не задан ни один аргумент, то будет напечатана пустая строка.

    Например, после выполнения сценария EchoExample.vbs (листинг 5.3) с помощью cscript.exe на экран будут выведены пустая строка, три числа и строка текста.

    '*******************************************************************
    '* Имя: EchoExample.vbs                                            
    '* Язык: VBScript                                                   
    '* Описание: Использование метода WScript.Echo                     
    '*******************************************************************
    WScript.Echo            'Выводим пустую строку
    WScript.Echo 1,2,3      'Выводим числа
    WScript.Echo "Привет!"  'Выводим строку
    '*************  Конец *********************************************

    Метод Sleep

    В следующем примере сценарий переводится в неактивное состояние на 5 секунд:

    '*******************************************************************
    '* Имя: SleepExample.vbs                                            
    '* Язык: VBScript                                                   
    '* Описание: Использование метода WScript.Sleep                     
    '*******************************************************************
    WScript.Echo "Сценарий запущен, отдыхаем…"
    WScript.Sleep 5000
    WScript.Echo "Выполнение сценария завершено"
    '*************  Конец *********************************************

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

    Объект WshShell

    С помощью объекта WshShell можно запускать новый процесс, создавать ярлыки, работать с системным реестром, получать доступ к переменным среды и специальным папкам Windows. Создается этот объект следующим образом:

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

    Объект WshShell имеет три свойства, которые приведены в табл. 5.4.

    Свойства объекта WshShell
    СвойствоОписание
    CurrentDirectory Здесь хранится полный путь к текущему каталогу (к каталогу, из которого был запущен сценарий)
    Environment Содержит объект WshEnvironment, который обеспечивает доступ к переменным среды операционной системы для Windows NT/2000/XP или к переменным среды текущего командного окна для Windows 9x
    SpecialFolders Содержит объект WshSpecialFolders для доступа к специальным папкам Windows (рабочий стол, меню Пуск (Start) и т. д.)

    Опишем теперь методы, имеющиеся у объекта WshShell (табл. 5.5).

    Методы объекта WshShell
    МетодОписание
    AppActivate(title) Активизирует заданное параметром title окно приложения. Строка title задает название окна (например, "calc" или "notepad" ) или идентификатор процесса ( Process ID, PID )
    CreateShortcut(strPathname) Создает объект WshShortcut для связи с ярлыком Windows (расширение lnk) или объект WshUrlShortcut для связи с сетевым ярлыком (расширение url). Параметр strPathname задает полный путь к создаваемому или изменяемому ярлыку
    Environment(strType) Возвращает объект WshEnvironment, содержащий переменные среды заданного вида
    Exec(strCommand) Создает новый дочерний процесс, который запускает консольное приложение, заданное параметром strCommand. В результате возвращается объект WshScriptExec, позволяющий контролировать ход выполнения запущенного приложения и обеспечивающий доступ к потокам StdIn, StdOut и StdErr этого приложения
    ExpandEnvironmentStrings(strString) Возвращает значение переменной среды текущего командного окна, заданной строкой strString (имя переменной должно быть окружено знаками "%" )
    LogEvent(intType, strMessage [,strTarget]) Протоколирует события в журнале Windows NT/2000/XP или в файле WSH.log. Целочисленный параметр intType определяет тип сообщения, строка strMessage — текст сообщения. Параметр strTarget может задаваться только в Windows NT/2000/XP, он определяет название системы, в которой протоколируются события (по умолчанию это локальная система). Метод LogEvent возвращает true, если событие записано успешно и false в противном случае
    Popup(strText,[nSecToWait], [strTitle], [nType]) Выводит на экран информационное окно с сообщением, заданным параметром strText. Параметр nSecToWait задает количество секунд, по истечении которых окно будет автоматически закрыто, параметр strTitle определяет заголовок окна, параметр nType указывает тип кнопок и значка для окна
    RegDelete(strName) Удаляет из системного реестра заданный параметр или раздел целиком
    RegRead(strName) Возвращает значение параметра реестра или значение по умолчанию для раздела реестра
    RegWrite(strName, anyValue [,strType]) Записывает в реестр значение заданного параметра или значение по умолчанию для раздела
    Run(strCommand, [intWindowStyle], [bWaitOnReturn]) Создает новый независимый процесс, который запускает приложение, заданное параметром strCommand
    SendKeys(string) Посылает одно или несколько нажатий клавиш в активное окно (эффект тот же, как если бы вы нажимали эти клавиши на клавиатуре)
    SpecialFolders(strSpecFolder) Возвращает строку, содержащую путь к специальной папке Windows, заданной параметром strSpecFolder

    Рассмотрим более подробно некоторые методы, приведенные в табл. 5.5.

    Метод CreateShortcut

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

    Приведем пример сценария, в котором создаются два ярлыка — на сам выполняемый сценарий (объект oShellLink ) и на сетевой ресурс ( oUrlLink ).

    '*****************************************************************
    '* Имя: MakeShortcuts.vbs                                        
    '* Язык: VBScript                                                 
    '* Описание: Создание ярлыков из сценария                        
    '*****************************************************************
    Dim WshShell,oShellLink,oUrlLink
    ' Создаем объект WshShell
    Set WshShell=WScript.CreateObject("WScript.Shell")
    ' Создаем ярлык на файл
    Set oShellLink=WshShell.CreateShortcut("Current Script.lnk")
    ' Устанавливаем путь к файлу
    oShellLink.TargetPath=WScript.ScriptFullName
    ' Сохраняем ярлык
    oShellLink.Save
    
    ' Создаем ярлык на сетевой ресурс
    Set oUrlLink = WshShell.CreateShortcut("Microsoft Web Site.URL")
    ' Устанавливаем URL
    oUrlLink.TargetPath = "http://www.microsoft.com"
    ' Сохраняем ярлык
    oUrlLink.Save
    '*************  Конец *********************************************

    Метод Environment

    Параметр strType задает вид переменных среды, которые будут записаны в коллекции WshEnvironment ; возможными значениями этого параметра являются "System" (переменные среды операционной системы), "User" (переменные среды пользователя), "Volatile" (временные переменные) или "Process" (переменные среды текущего командного окна).

    В следующем примере (листинг 5.6) мы распечатываем число процессоров, имеющихся в компьютере с операционной системой Windows XP (переменная NUMBER_OF_PROCESSORS ), и тип операционной системы.

    '*****************************************************************
    '* Имя: ShowEnvir.vbs                                             
    '* Язык: VBScript                                                 
    '* Описание: Получение значений некоторых переменных среды       
    '*****************************************************************
    Dim WshShell,WshSysEnv
    ' Создаем объект WshShell
    Set WshShell = WScript.CreateObject("WScript.Shell")
    ' Создание коллекции WshEnvironment
    Set WshSysEnv = WshShell.Environment("SYSTEM")
    WScript.Echo WshSysEnv("OS")
    WScript.Echo WshShell.Environment.Item("NUMBER_OF_PROCESSORS")
    '*************  Конец *********************************************

    Метод Run

    Параметр intWindowStyle устанавливает вид окна для запускаемого приложения (табл. 5.6).

    Типы окна (intWindowStyle)
    ПараметрКонстанта Visual BasicОписание
    0 vbHide Прячет текущее окно и активизирует другое окно (показывает его и передает ему фокус)
    1 vbNormalFocus Активизирует и отображает окно. Если окно было минимизировано или максимизировано, система восстановит его первоначальное положение и размер. Этот флаг должен указываться сценарием во время первого отображения окна
    2 vbMinimizedFocus Активизирует окно и отображает его в минимизированном (свернутом) виде
    3 vbMaximizedFocus Активизирует окно и отображает его в максимизированном (развернутом) виде
    4 vbNormalNoFocus Отображает окно в том виде, в котором оно находилось последний раз. Активное окно при этом остается активным
    5 Активизирует окно и отображает его в текущем состоянии
    6 vbMinimizedNoFocus Минимизирует заданное окно и активизирует следующее (в Z-порядке) окно
    7 Отображает окно в свернутом виде. Активное окно при этом остается активным
    8 Отображает окно в его текущем состоянии. Активное окно при этом остается активным
    9 Активизирует и отображает окно. Если окно было минимизировано или максимизировано, система восстановит его первоначальное положение и размер. Этот флаг должен указываться, если производится восстановление свернутого окна (его нельзя использовать в методе Run )
    10 Устанавливает режим отображения, опирающийся на режим программы, которая запускает приложение

    Необязательный параметр bWaitOnReturn является логической переменной, дающей указание ожидать завершения запущенного процесса. Если этот параметр не указан или установлен в false, то после запуска из сценария нового процесса управление сразу же возвращается обратно в сценарий (не дожидаясь завершения запущенного процесса). Если же bWaitOnReturn установлен в true, то сценарий возобновит работу только после завершения вызванного процесса.

    При этом если параметр bWaitOnReturn равен true, то метод Run возвращает код выхода вызванного приложения. Если же bWaitOnReturn равен false или не задан, то метод Run всегда возвращает ноль.

    Следующий сценарий (листинг 5.7) печатает код выхода вызванного приложения (Блокнот).

    '********************************************************************
    '* Имя: RetCode.vbs                                                  
    '* Язык: VBScript                                                    
    '* Описание: Вывод кода выхода запущенного приложения               
    '********************************************************************
    ' Создаем объект WshShell
    Set WshShell = WScript.CreateObject("WScript.Shell")
    ' Запускаем Блокнот и ожидаем завершения его работы
    Return = WshShell.Run("notepad " + WScript.ScriptFullName, 1, true)
    ' Печатаем код возврата
    WScript.Echo "Код возврата:", Return
    '*************  Конец ***********************************************

    Метод SendKeys

    Каждая клавиша задается одним или несколькими символами. Например, Для того чтобы задать нажатие друг за другом букв А, Б и В нужно указать в качестве параметра для SendKeys строку "АБВ": string="АБВ".

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

    Для задания неотображаемых символов, таких как <Enter> или <Tab>, и специальных клавиш в методе SendKeys используются коды, представленные в табл.5.7.

    Коды специальных клавишей для SendKeys
    Названия клавишиКодНазвания клавишиКод
    <Backspace> {BACKSPACE}, {BS} или {BKSP} < $$\to$$ > {RIGHT}
    <Break> {BREAK} <F1> {F1}
    <Caps Lock> {CAPSLOCK} <F2> {F2}
    <Del> или <Delete> {DELETE} или {DEL} <F3> {F3}
    <End> {END} <F4> {F4}
    <Enter> {ENTER} или ~ <F5> {F5}
    <Esc> {ESC} <F6> {F6}
    <Home> {HOME} <F7> {F7}
    <Ins> или <Insert> {INSERT} или {INS} <F8> {F8}
    <Num Lock> {NUMLOCK} <F9> {F9}
    <Page Down> {PGDN} <F10> {F10}
    <Page Up> {PGUP} <F11> {F11}
    <Print Screen> {PRTSC} <F12> {F12}
    <Scroll Lock> {SCROLLLOCK} <F13> {F13}
    <Tab> {TAB} <F14> {F14}
    < $$\uparrow$$ > {UP} <F15> {F15}
    < $$\gets$$ > {LEFT} <F16> {F16}
    < $$\downarrow$$ > {DOWN}

    Для задания комбинаций клавиш с <Shift>, <Ctrl> или <Alt>, перед соответствующей клавишей нужно поставить один или несколько кодов из табл. 5.8:

    Коды клавиш <Shift>, <Ctrl> и <Alt>
    КлавишаКод
    <Shift> +
    <Ctrl> ^
    <Alt> %

    Для того чтобы задать комбинацию клавиш, которую нужно набирать, удерживая нажатыми клавиши <Shift>, <Ctrl> или <Alt>, нужно заключить коды этих клавиш в скобки. Например, если требуется сымитировать нажатие клавиш G и S при нажатой клавише <Shift>, следует использовать последовательность "+(GS)". Для того же, чтобы задать одновременное нажатие клавиш <Shift>+<G>, а затем <S> (уже без <Shift>), используется "+GS".

    В методе SendKeys можно задать несколько нажатий подряд одной и той же клавиши. Для этого необходимо в фигурных скобках указать код нужной клавиши, а через пробел — число нажатий. Например, {LEFT 42} означает нажатие клавиши <?> 42 раза подряд; {h 10} означает нажатие клавиши h 10 раз подряд.

    В качестве примера использования методов SendKeys и AppActivate приведен сценарий RunCalc.vbs (листинг 5.8), который запускает стандартный калькулятор Windows и выполняет в нем несколько простых арифметических действий.

    '*****************************************************************
    '* Имя: RunCalc.vbs                                               
    '* Язык: VBScript                                                 
    '* Описание: Активизация приложения с помощью имени окна         
    '*****************************************************************
    Dim WshShell
    ' Создаем объект WshShell
    Set WshShell=WScript.CreateObject("WScript.Shell")
    ' Запускаем Калькулятор
    WshShell.Run "calc"
    ' Приостанавливаем сценарий на 1 секунду
    WScript.Sleep 1000
    ' Активизируем Калькулятор
    WshShell.AppActivate "Calculator"
    ' Приостановка сценария на 0,1 секунды
    WScript.Sleep(100)
    ' Посылаем нажатия клавиш в Калькулятор
    WshShell.SendKeys "1{+}"
    WScript.Sleep 500
    WshShell.SendKeys "2"
    WScript.Sleep 500
    WshShell.SendKeys "~"
    WScript.Sleep 2500
    '*************  Конец *********************************************

    Объекты-коллекции

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

  • параметры командной строки запущенного сценария или ярлыка Windows (объекты WshArguments, WshNamed и WshUnnamed );
  • значения переменных среды (объект WshEnvironment );
  • пути к специальным папкам Windows (объект WshSpecialFolders ).
  • Объект WshArguments

    Объект WshArguments содержит коллекцию всех параметров командной строки запущенного сценария или ярлыка Windows. Этот объект можно создать только с помощью свойства Arguments объектов WScript и WshShortcut.

    С помощью объекта WshArguments можно также выделять и отдельно обрабатывать аргументы сценария, у которых имеются имена (например, /Name:Andrey ) и безымянные аргументы. Ясно, что использование именных параметров более удобно, так как в этом случае нет необходимости запоминать, в каком порядке должны быть записаны параметры при запуске того или иного сценария.

    Для доступа к именным и безымянным аргументам используются соответственно два специальных свойства объекта WshArguments: Named и Unnamed. Свойство Named содержит ссылку на коллекцию WshNamed, свойство Unnamed — на коллекцию WshUnnamed.

    Таким образом, обрабатывать параметры командной строки запущенного сценария можно тремя способами:

  • просматривать полный набор всех параметров (как именных, так и безымянных) с помощью коллекции WshArguments ;
  • выделить только те параметры, у которых есть имена (именные параметры) с помощью коллекции WshNamed ;
  • выделить только те параметры, у которых нет имен (безымянные параметры) с помощью коллекции WshUnnamed.
  • В листинге 5.9 приведен пример сценария, в котором на экран выводятся общее количество параметров командной строки, количество именных и безымянных аргументов, а также значения каждой из этих групп параметров.

    '********************************************************************
    ' Имя: Args.vbs
    ' Язык: VBScript
    ' Описание: Работа с аргументами запущенного сценария
    '********************************************************************
    Option Explicit
    
    Dim i,Arg,objArgs,s,objNamedArgs,objUnnamedArgs  ' Объявляем переменные
    
    Set objArgs = WScript.Arguments  ' Создаем объект WshArguments
    ' Определяем общее количество аргументов
    s="Всего аргументов: "  objArgs.Count()  vbCrLf
    For Each Arg In objArgs
      s=s  Arg  vbCrLf  ' Формируем строки со значениями аргументов
    Next
    
    Set objUnnamedArgs=objArgs.Unnamed  ' Создаем объект WshUnnamed
    ' Определяем количество безымянных аргументов
    s=s  vbCrLf  "Безымянных аргументов: "  objUnnamedArgs.length  vbCrLf
    For Each Arg In objUnnamedArgs
      ' Формируем строки со значениями безымянных аргументов
      s=s  Arg  vbCrLf
    Next
    
    Set objNamedArgs=objArgs.Named  ' Создаем объект WshNamed
    ' Определяем количество именных аргументов
    s=s  vbCrLf  "Именных аргументов: "  objNamedArgs.Length  vbCrLf
    ' Проверяем, существует ли аргумент /Имя:
    If objNamedArgs.Exists("Имя") Then
      s=s  objNamedArgs("Имя")  vbCrLf
    End If
    ' Проверяем, существует ли аргумент /Comp:
    If objNamedArgs.Exists("Comp") Then
      s=s  objNamedArgs("Comp")  vbCrLf
    End If
    
    WScript.Echo s   ' Выводим сформированные строки
    '*************  Конец *********************************************

    Объект WshEnvironment

    Объект WshEnvironment позволяет получить доступ к коллекции, содержащей переменные среды заданного типа (переменные среды операционной системы, переменные среды пользователя или переменные среды текущего командного окна). Этот объект можно создать с помощью свойства Environment объекта WshShell или одноименного его метода:

    Set WshShell=WScript.CreateObject("WScript.Shell")
    Set WshSysEnv=WshShell.Environment
    Set WshUserEnv=WshShell.Environment("User")

    Объект WshEnvironment имеет свойство Length, в котором хранится число элементов в коллекции (количество переменных среды), и методы Count и Item. Для того чтобы получить значение определенной переменной среды, в качестве аргумента метода Item указывается имя этой переменной в двойных кавычках. В следующем примере мы выводим на экран значение переменной среды PATH (листинг 5.10):

    '********************************************************************
    ' Имя: Environment.vbs
    ' Язык: VBScript
    ' Описание: Работа с переменными среды
    '********************************************************************
    Dim WshShell, WshSysEnv
    Set WshShell=WScript.CreateObject("WScript.Shell")
    Set WshSysEnv=WshShell.Environment
    WScript.Echo "Системный путь:",WshSysEnv.Item("PATH")

    Можно также просто указать имя переменной в круглых скобках после имени объекта:

    WScript.Echo "Системный путь:",WshSysEnv("PATH")

    Кроме этого у объекта WshEnvironment имеется метод Remove(strName), который удаляет заданную переменную среды.

    Объект WshSpecialFolders

    При установке Windows всегда автоматически создаются несколько специальных папок (например, папка для рабочего стола (Desktop) или папка для меню Пуск (Start)), путь к которым впоследствии может быть тем или иным способом изменен. Объект WshSpecialFolders обеспечивает доступ к коллекции, содержащей пути к специальным папкам Windows; задание путей к таким папкам может понадобиться, например, для создания непосредственно из сценария ярлыков на рабочем столе.

    В Windows XP поддерживаются следующие имена специальных папок:

  • Desktop;
  • Favorites;
  • Fonts;
  • MyDocuments;
  • NetHood;
  • PrintHood;
  • Programs;
  • Recent;
  • SendTo;
  • StartMenu;
  • Startup;
  • Templates;
  • AllUsersDesktop;
  • AllUsersStartMenu;
  • AllUsersPrograms;
  • AllUsersStartup.
  • Объект WshSpecialFolders создается с помощью свойства SpecialFolders объекта WshShell:

    var WshShell=WScript.CreateObject("WScript.Shell"),
        WshSpecFold=WshShell.SpecialFolders;

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

    '*****************************************************************
    ' Имя: SpecFold1.vbs
    ' Язык: VBScript
    ' Описание: Вывод названий всех специальных папок Windows
    '*****************************************************************
    Option Explicit
    
    Dim WshShell, WshFldrs, SpecFldr, s  ' Объявляем переменные
    ' Создаем объект WshShell
    Set WshShell = WScript.CreateObject("Wscript.Shell")
    ' Создаем объект WshSpecialFolders
    Set WshFldrs = WshShell.SpecialFolders
    s="Список всех специальных папок:"  vbCrLf  vbCrLf
    ' Перебираем все элементы коллекции WshFldrs
    For Each SpecFldr In WshFldrs
      ' Формируем строки с путями к специальным папкам
      s=s  SpecFldr  vbCrLf
    Next
    WScript.Echo s
    '*************  Конец *********************************************/

    Объект WshSpecialFolders также позволяет получить путь к конкретно заданной специальной папке. Например, в сценарии SpecFold2.vbs (листинг 5.12) на экран выводятся пути к папкам рабочего стола (Desktop), избранных ссылок (Favorites) и раздела Программы (Programs) меню Пуск (Run).

    '******************************************************************
    ' Имя: SpecFold2.vbs
    ' Язык: VBScript
    ' Описание: Вывод названий заданных специальных папок Windows
    '******************************************************************
    Option Explicit
    
    Dim WshShell, WshFldrs, s   ' Объявляем переменные
    ' Создаем объект WshShell
    Set WshShell = WScript.CreateObject("Wscript.Shell")
    ' Создаем объект WshSpecialFolders
    Set WshFldrs = WshShell.SpecialFolders
    ' Формируем строки с путями к конкретным специальным папкам
    s="Некоторые специальные папки:"  vbCrLf  vbCrLf
    s=s+"Desktop:"+WshFldrs("Desktop")  vbCrLf
    s=s+"Favorites:"+WshFldrs("Favorites")  vbCrLf
    s=s+"Programs:"+WshFldrs("Programs")
    WScript.Echo s   ' Выводим сформированные строки на экран
    '*************  Конец *********************************************/
    Вернуться к учебному плану