Сценарии WSH способны запускать другие графические или консольные приложения, причем в последнем случае запущенный процесс может функционировать как дочерний, что позволяет в сценарии-родителе работать с информацией из его входного или выходного потока.
Из сценария WSH запустить другое приложение можно с помощью методов Run или Exec объекта WshShell.
При использовании метода Run для запускаемого приложения можно задать тип окна (при условии, что приложение поддерживает этот тип). Например, в результате выполнения следующих двух строк VBScript-кода:
Set WshShell = WScript.CreateObject("WScript.Shell")
WshShell.Run "notepad",3
программа Блокнот (notepad.exe) будет запущена в максимизированном (развернутом на весь экран) окне.
Замечание
Метод Run всегда создает новый экземпляр запускаемого процесса, с его помощью нельзя ни повторно активизировать окно запущенного приложения (для этого используется метод AppActivate ), ни свернуть или развернуть его.
Другим вариантом запуска из сценария приложения Windows, является применение метода Exec. Этот метод запускает приложение, путь к которому указан как параметр метода, и возвращает объект WshScriptExec. Например:
Set WshShell = WScript.CreateObject("WScript.Shell")
Set theNotepad = WshShell.Exec("notepad")
Замечание
При подобном запуске приложения, в отличие от метода Run, нельзя задать тип окна.
Объект WshScriptExec позволяет контролировать ход выполнения запущенного приложения с помощью свойства Status — если Status равен 0, то приложение выполняется, если Status равен 1, то приложение завершено. Кроме этого, используя метод Terminate, можно принудительно завершить работу того приложения, которому соответствует объект WshScriptExec.
В листинге 7.1 приведен сценарий на языке VBScipt, в котором с помощью метода Exec запускается Блокнот (notepad.exe); ссылка на соответствующий объект WshScriptExec сохраняется в переменной theNotepad:
Set theNotepad = WshShell.Exec("notepad")
После этого выполнение сценария приостанавливается на полсекунды (пауза необходима, для того чтобы окно Блокнота успело появиться на экране), после чего выводится диалоговое окно с информацией о статусе запущенного приложения и вопросом о необходимости закрытия Блокнота. В случае утвердительного ответа происходит закрытие Блокнота с помощью метода Terminate.
'*******************************************************************
' Имя: ExecWinApp.vbs
' Язык: VBScript
' Описание: Запуск и закрытие приложение (объект WshScriptExec)
'*******************************************************************
Option Explicit
Dim WshShell,theNotepad,Res,Text,Title ' Объявляем переменные
' Создаем объект WshShell
Set WshShell = WScript.CreateObject("WScript.Shell")
WScript.Echo "Запускаем Блокнот"
' Запускаем приложение (создаем объект WshScriptExec)
Set theNotepad = WshShell.Exec("notepad")
WScript.Sleep 500 ' Приостанавливаем выполнение сценария
Text="Блокнот запущен (Status=" theNotepad.Status ")" vbCrLf _
"Закрыть Блокнот?"
Title=""
' Выводим диалоговое окно на экран
Res=WshShell.Popup(Text,0,Title,vbQuestion+vbYesNo)
' Определяем, какая кнопка нажата в диалоговом окне
If Res=vbYes Then
theNotepad.Terminate ' Прерываем работу Блокнота
' Приостанавливаем выполнение сценария, для того чтобы Блокнот
' успел закрыться
WScript.Sleep 100
WScript.Echo "Блокнот закрыт (Status=" theNotepad.Status ")"
End If
'************* Конец *********************************************/
Производить переключение между окнами нескольких запущенных приложений позволяет метод AppActivate объекта WshShell. В качестве аргумента этого метода нужно указывать либо заголовок активизируемого окна, либо идентификатор процесса (Process ID, PID), который запущен в данном окне. Предпочтительным является использование PID, получаемого с помощью свойства ProcessID объекта WshScriptExec, соответствующего активизируемому приложению. Недостатки применения заголовка окна в методе AppActivate:
AppActivate всегда будет активизировать один и тот же экземпляр, доступ к другим окнам получить не удастся.Активизировав то или иное окно, в котором выполняется приложение Windows, можно из сценария сымитировать нажатия клавиш в этом окне. Для этого используется метод SendKeys объекта WshShell.
Рассмотрим пример сценария RunExecWinApp.vbs (листинг 7.2), в котором запускается Калькулятор (calc.exe) и в его окно с помощью SendKeys последовательно посылаются нажатия клавиш <1>, <+>, <2> и <Enter>:
Set theCalculator = WshShell.Exec("calc")
WScript.Sleep 500
WshShell.AppActivate theCalculator.ProcessID
WshShell.SendKeys "1{+}"
WshShell.SendKeys "2"
WshShell.SendKeys "~" ' Клавиша <Enter>
Затем выполнение сценария приостанавливается на 1 секунду, чтобы результат вычислений был виден на экране и результат вычислений (символ "3") копируется в буфер Windows с помощью "нажатия" клавиш <Ctrl>+<C>:
WshShell.SendKeys "^c"
После этого на экран выводится сообщение о том, что Калькулятор будет закрыт, в результате чего окно Калькулятора теряет фокус. Для того чтобы вновь активизировать это окно, используется метод AppActivate, параметром которого служит PID Калькулятора:
WshShell.AppActivate theCalculator.ProcessID
Для того чтобы закрыть окно Калькулятора, в него посылаются нажатия клавиш <Alt>+<F4>:
WshShell.SendKeys "%{F4}"
После закрытия Калькулятора запускается Блокнот (notepad.exe) и в него записываются результаты работы Калькулятора (вставка из буфера вычисленной суммы производится с помощью "нажатий" <Ctrl>+<V>):
WshShell.Run "notepad"
WScript.Sleep 1000
WshShell.AppActivate "notepad"
WshShell.SendKeys "1{+}2="
WshShell.SendKeys "^v"
WshShell.SendKeys " {(}c{)} Calculator"
'*******************************************************************
' Имя: RunExecWinApp.vbs
' Язык: VBScript
' Описание: Запуск двух приложений и обмен данными между ними
'*******************************************************************
Option Explicit
Dim WshShell, theCalculator ' Объявляем переменные
' Создаем объект WshShell
Set WshShell = WScript.CreateObject("WScript.Shell")
WScript.Echo("Запускаем калькулятор и" vbCrLf "считаем 1+2")
' Создаем объект WshScript (запускаем Калькулятор)
Set theCalculator = WshShell.Exec("calc")
' Приостанавливаем выполнение сценария, для того чтобы
' окно Калькулятора успело появиться на экране
WScript.Sleep 500
' Активизируем окно Калькулятора
WshShell.AppActivate theCalculator.ProcessID
' Посылаем нажатия клавиш в окно Калькулятора
WshShell.SendKeys "1{+}"
WshShell.SendKeys "2"
WshShell.SendKeys "~" ' Клавиша <Enter>
WScript.Sleep 500
' Копируем результат вычисления в буфер Windows (<Ctrl>+C)
WshShell.SendKeys "^c"
' Выводим сообщение (активное окно меняется)
WScript.Echo "Закрываем калькулятор"
' Активизируем окно Калькулятора
WshShell.AppActivate theCalculator.ProcessID
' Закрываем окно Калькулятора (<Alt>+<F4>)
WshShell.SendKeys "%{F4}"
WScript.Echo "Запускаем Блокнот и копируем туда результат"
WshShell.Run "notepad" ' Запускаем Блокнот
' Приостанавливаем выполнение сценария, для того чтобы
' окно Блокнота успело появиться на экране
WScript.Sleep 1000
WshShell.AppActivate "notepad" ' Активизируем окно Блокнота
' Посылаем нажатия клавиш в окно Блокнота
WshShell.SendKeys "1{+}2="
' Вставляем содержимое буфера Windows (<Ctrl>+V)
WshShell.SendKeys "^v"
' Выводим в окно Блокнота оставшуюся информацию
WshShell.SendKeys " {(}c{)} Calculator"
'************* Конец *********************************************
Для запуска независимых, т. е. работающих в отдельном адресном пространстве и использующих свою копию переменных среды, консольных приложений или внешних (представленных исполняемыми файлами на жестком диске) команд Windows используется метод Run объекта WshShell. При этом выполнение сценария можно приостановить до окончания работы запущенного приложения, а затем проанализировать код выхода этого приложения (для этого третий параметр метода Run должен равняться True ). Соответствующий пример сценария приведен в листинге 7.3.
'*******************************************************************
' Имя: RunConApp.vbs
' Язык: VBScript
' Описание: Запуск независимого консольного приложения и
' определение его кода выхода
'*******************************************************************
Option Explicit
Dim WshShell, Code ' Объявляем переменные
' Создаем объект WshShell
Set WshShell = WScript.CreateObject("WScript.Shell")
' Запускаем утилиту xcopy с ключом "/?" и ожидаем окончания ее работы
Code=WshShell.Run("xcopy /?",1,true)
' Печатаем полученный код возврата
WScript.Echo "Код возврата: ", Code
'************* Конец *********************************************/
Для выполнения внутренней команды Windows нужно запустить командный интерпретатор cmd.exe и передать ему в качестве параметра нужную команду. Для того чтобы при вызове командного интерпретатора не заботиться о полном пути к cmd.exe, нужно использовать переменную среды COMSPEC.
Замечание
Для получения значения переменной среды ее имя нужно окружить знаками % (например, %COMSPEC% ).
В листингах 7.4 приведен сценарий, в котором запускаются внутренние команды COPY /? (вызов встроенной справки для COPY ) и DIR %WINDIR% (вывод содержимого системного каталога Windows).
При этом окно, в котором выполняется команда COPY /?, не закрывается после завершения этой команды, т. к. при запуске командного интерпретатора был указан ключ /k, а информация, выводимая командой DIR %WINDIR%, перенаправляется в файл windir.txt, после чего командное окно закрывается, т. к. для командного интерпретатора в этом случае был указан ключ /c.
'*******************************************************************
' Имя: RunDOSCom.vbs
' Язык: VBScript
' Описание: Выполнение внутренних команд Windows
'*******************************************************************
Option Explicit
Dim WshShell, Code ' Объявляем переменные
' Создаем объект WshShell
Set WshShell = WScript.CreateObject("WScript.Shell")
' Запускаем внутреннюю команду COPY
WshShell.Run "%COMSPEC% /k copy /?",1
' Запускаем внутреннюю команду DIR
WshShell.Run "%COMSPEC% /c dir %WINDIR% > windir.txt",1
'************* Конец *********************************************/
Консольное приложение или команду DOS можно запустить из сценария как дочернюю задачу, т. е. с теми же переменными среды, что у процесса-родителя. При этом информация, выводимая дочерним процессом, на экран дублироваться не будет, однако из родительского сценария можно считывать информацию из выходного потока и посылать данные во входной поток дочерней задачи (это напоминает конвейеризацию команд Windows, при которой данные выходного потока одной команды поступают во входной поток другой команды, например DIR | MORE ). Таким образом, из сценария можно запускать ту или иную утилиту командной строки и обрабатывать выводимые ей данные; иногда таким образом получить нужную информацию бывает проще и быстрее, чем при использовании объектной модели WSH или другого сервера автоматизации.
В качестве примера рассмотрим сценарий ExecConApp.vbs (листинг 7.5), который выводит на экран общее количество файлов в текущем каталоге и их имена. Данную информацию можно получить в сеансе командной строки с помощью команды DIR /B. Поэтому в сценарии мы запустим в качестве дочернего процесса DIR с ключом /B:
Set ObjExec=WshShell.Exec("%COMSPEC% /c dir /b")
и полностью считаем данные, появляющиеся в выходном потоке этого процесса. Для этого в цикле вызывается метод ReadAll, считывающий всю информацию, имеющуюся к тому времени в потоке StdOut объекта ObjExec, в переменную s:
IsBreak=False
Do While True ' Бесконечный цикл
' Проверяем, достигнут ли конец выходного потока команды DIR
If (Not ObjExec.StdOut.AtEndOfStream) Then
' Считываем полностью выходной поток команды DIR
s=s+ObjExec.StdOut.ReadAll
End If
If IsBreak Then
Exit Do ' Выходим из цикла
End If
' Проверяем, не завершилось ли выполнение DIR
If ObjExec.Status=1 Then
IsBreak=True
Else
WScript.Sleep 100 ' Приостанавливаем сценарий на 0,1 сек
End If
Loop
Родительский и дочерний процессы работают асинхронно, поэтому пока команда DIR не перестанет выдавать данные, т. е. пока свойство Status объекта ObjExec не станет равным 1, выполнение сценария с помощью метода WScript.Sleep периодически приостанавливается на 0,1 секунды.
После того как считаны все данные из выходного потока команды DIR (свойство ObjExec.StdOut.AtEndOfStream равно True ), происходит выход из цикла и формирование из переменной s массива выведенных строк:
ArrS=Split(s,vbCrLf) ' Формируем массив строк
Теперь остается подсчитать количество файлов в каталоге, которое на единицу меньше количества строк в массиве ArrS:
ColFiles=UBound(ArrS) ' Количество файлов в текущем каталоге и вывести нужные строки на экран: WScript.StdOut.WriteLine "Всего файлов в текущем каталоге: " ColFiles For i=0 To ColFiles-1 WScript.StdOut.WriteLine ArrS(i) ' Выводим строки на экран Next
'*******************************************************************
' Имя: ExecConApp.vbs
' Язык: VbScript
' Описание: Запуск дочернего консольного приложения
'*******************************************************************
Option Explicit
' Объявляем переменные
Dim ObjExec,WshShell,s,IsBreak,ArrS,ColFiles,i
' Создаем объект WshShell
Set WshShell = WScript.CreateObject("WScript.Shell")
' Запускаем команду DIR
Set ObjExec=WshShell.Exec("%COMSPEC% /c dir /b")
s=""
IsBreak=False
Do While True ' Бесконечный цикл
' Проверяем, достигнут ли конец выходного потока команды DIR
If (Not ObjExec.StdOut.AtEndOfStream) Then
' Считываем полностью выходной поток команды DIR
s=s+ObjExec.StdOut.ReadAll
End If
If IsBreak Then
Exit Do ' Выходим из цикла
End If
' Проверяем, не завершилось ли выполнение DIR
If ObjExec.Status=1 Then
IsBreak=True
Else
WScript.Sleep 100 ' Приостанавливаем сценарий на 0,1 сек
End If
Loop
ArrS=Split(s,vbCrLf) ' Формируем массив строк
ColFiles=UBound(ArrS) ' Количество файлов в текущем каталоге
WScript.StdOut.WriteLine "Всего файлов в текущем каталоге: " ColFiles
For i=0 To ColFiles-1
WScript.StdOut.WriteLine ArrS(i) ' Выводим строки на экран
Next
'************* Конец *********************************************
Одна из наиболее полезных возможностей сценариев WSH – управление работой внешних серверов автоматизации (программ, предоставляющих свои службы и интерфейсы для использования другими приложениями). Самые распространенные и часто используемые серверы автоматизации в Windows – это приложения пакета Microsoft Office. Мы рассмотрим на примерах, каким образом можно выводить из сценариев WSH информацию в две наиболее распространенные программы этого пакета: Microsoft Word и Microsoft Excel.
Для того, чтобы использовать из сценариев WSH те возможности, которые поддерживают программы Word и Excel, необходимо знать, какие именно объекты предоставляются для внешнего использования этими серверами автоматизации и как объекты соотносятся друг с другом. Хотя объектные модели различных приложений Microsoft Office довольно сложны, они похожи друг на друга, причем для практических целей достаточно понять принцип работы с несколькими ключевыми объектами. Здесь мы не будем останавливаться на подробном рассмотрении свойств и методов объектов Word и Excel, а лишь кратко упомянем, какие именно объекты будут использоваться в рассмотренных ниже примерах сценариев.
На самом верхнем уровне объектной модели Word находится объект Application, который представляет непосредственно само приложение Word и содержит (в качестве свойств) все остальные объекты. Таким образом, объект Application используется для получения доступа к любому другому объекту Word.
Семейство Documents является свойством объекта Application и содержит набор объектов Document, каждый из которых соответствует открытому в Word документу. Класс Documents понадобится нам в сценариях для создания новых документов. Объект Document содержит в качестве своих свойств семейства различных объектов документа: символов (Characters), слов (Words), предложений (Sentences), параграфов (Paragraphs), закладок (Bookmarks) и т.д.
Объект Selection позволяет работать с выделенным фрагментом текста (этот фрагмент может быть и пустым). Таким образом, можно сказать, что объект Selection открывает путь в документ, так как он предоставляет доступ к выделенному фрагменту документа. В частности, у объекта Selection имеется метод TypeText(Text), с помощью которого можно вставлять текст в документ. Используя свойства этого объекта (которые, в свою очередь, могут являться объектами со своими свойствами), можно управлять параметрами выделенного фрагмента, например, устанавливать нужный размер и гарнитуру шрифта, выравнивать параграфы по центру и т.п.
Объектная модель Excel построена по тому же принципу, что и объектная модель Word. Основным объектом, содержащим все остальные, является Application. Напомним, что отдельные файлы в Excel называются рабочими книгами. Семейство Workbooks в Excel является аналогом семейства Documents в Word и содержит набор объектов Workbook (аналог объекта Document в Word), каждый из которых соответствует открытой в Excel рабочей книге. Новая рабочая книга создается с помощью метода Add() объекта Workbooks.
Для доступа к ячейкам активного рабочего листа Excel используется свойство Cells объекта Application. Для получения или изменения значения отдельной ячейки применяется конструкция Cells(row,column).Value, где row и column являются соответственно номерами строки и столбца, на пересечении которых находится данная ячейка.
В Excel, как и в Word, имеется объект Selection, позволяющий работать с выделенным фрагментом электронной таблицы. Самым простым способом выделить диапазон ячеек активного рабочего листа является использование метода Select() объекта Range. Например, выражение Range("A1:C1").Select() позволяет выделить три смежные ячейки: "A1", "B1" и "C1".
Для того, чтобы понять, какой именно объект Word или Excel нужно использовать для решения той или иной задачи, часто проще всего бывает проделать в соответствующем приложении необходимые манипуляции вручную, включив предварительно режим записи макроса. В результате мы получим текст макроса на языке VBA (Visual Basic for Applications), из которого будет ясно, какие методы и с какими параметрами нужно вызывать и какие значения нужно присваивать свойствам объектов. В качестве простой иллюстрации проделаем следующие действия. Запустим Word, запустим
Sub Пример1()
'
' Пример1 Макрос
' Макрос записан 12.09.07 Андрей Владимирович Попов
'
Selection.TypeText Text:="Пример"
End Sub
Как мы видим, для печати слова в документе был использован метод TypeText объекта Selection.
Макросы в Excel записываются и редактируются аналогичным образом.
Для того чтобы из сценария получить доступ к свойствам или методам внешнего сервера автоматизации, вначале надо "создать" соответствующий объект, т. е. загрузить в память экземпляр нужного COM-объекта и сохранить в переменной ссылку на этот объект. Объект в сценарии может создаваться несколькими способами:
В любом случае в используемый метод или функцию в качестве параметра передается программный идентификатор объекта ( ProgID ), заключенный в скобки. Пример на языке VBScript:
Set WA=WScript.CreateObject("Word.Application")
Перед точкой в ProgID стоит имя библиотеки типов (ProgID указывается имя класса, содержащего свойства и методы, доступные для использования другими приложениями.
Выполняя метод CreateObject, интерпретатор сценария через ProgID получает из системного реестра путь к файлам нужной библиотеки типов. Затем с помощью этой библиотеки в память загружается экземпляр запрашиваемого объекта, и его интерфейсы становятся доступными для использования в сценарии. Ссылка на созданный объект сохраняется в переменной; в дальнейшем, используя эту переменную, мы получаем доступ к свойствам и методам объекта, а также к его вложенным объектам (если они имеются).
Примеры управления приложением Microsoft Word из сценариев приведен в листинге 7.6. Сначала создается главный объект Word.Application, который запускает приложение Microsoft Word:
Set WA=WScript.CreateObject("Word.Application")
Затем создается новый пустой документ, в результате в переменную WD заносится ссылка на объект Document:
Set WD=WA.Documents.Add()
Наконец, в переменную Sel заносится ссылка на объект Selection, с помощью которого можно задать тип и размер шрифта, тип выравнивания абзацев и напечатать в документе строки текста:
Set Sel=WA.Selection;
В результате выполнения сценария PrintInWord.vbs в новом документе Microsoft Word печатаются две строки текста, после чего с помощью метода объекта Document содержимое документа выводится на принтер:
WD.PrintOut();
'*******************************************************************
' Имя: PrintInWord.vbs
' Язык: VBScript
' Описание: Использование из сценария внешнего объекта
' автоматизации (Microsoft Word)
'*******************************************************************
Option Explicit
Dim WA,WD,Sel ' Объявляем переменные
'Создаем объект¬–приложение Microsoft Word
Set WA=WScript.CreateObject("Word.Application")
' Можно было использовать конструкцию
' Set WA=CreateObject("Word.Application")
Set WD=WA.Documents.Add 'Создаем новый документ (объект Document)
WA.Visible=true ' Делаем Word видимым
Set Sel=WA.Selection 'Создаем объект Selection
Sel.Font.Size=14 'Устанавливаем размер шрифта
Sel.ParagraphFormat.Alignment=1 'Выравнивание по центру
Sel.Font.Bold=true 'Устанавливаем полужирный шрифт
Sel.TypeText "Привет!" vbCrLf 'Печатаем строку текста
Sel.Font.Bold=false 'Отменяем полужирный шрифт
Sel.ParagraphFormat.Alignment=0 'Выравнивание по левому краю
'Печатаем строку текста
Sel.TypeText "Эти строки напечатаны с помощью WSH."
WD.PrintOut 'Выводим документ на принтер
'************* Конец *********************************************
В качестве примера управления сервером автоматизации Microsoft Excel рассмотрим сценарий PrintInExcel.vbs (листинг 7.7). Как и в случае с Microsoft Word, здесь сначала создается главный объект Excel.Application, который запускает приложение Microsoft Excel:
Set XL=WScript.CreateObject("Excel.Application")
Затем открывается новая рабочая книга:
XL.WorkBooks.Add
Ширина первого и второго столбца делается равной 40 пунктам, а третьей – 10 пунктам:
'Устанавливаем нужную ширину колонок XL.Columns(1).ColumnWidth = 40 XL.Columns(2).ColumnWidth = 40 XL.Columns(3).ColumnWidth = 10
В столбцы первой строки записываются обозначения столбцов ("Фамилия", "Имя", "Телефон"), причем данный текст выделяется полужирным шрифтом:
'Печатаем в ячейки текст
XL.Cells(1,1).Value="Фамилия"
XL.Cells(1,2).Value="Имя"
XL.Cells(1,3).Value="Телефон"
'Выделяем три ячейки
XL.Range("A1:C1").Select
'Устанавливаем полужирный текст для выделенного диапазона
XL.Selection.Font.Bold = true
Во вторую строку заносятся данные для каждого столбца:
'Печатаем в ячейки текст
XL.Cells(2,1).Value="Иванов"
XL.Cells(2,2).Value="Иван"
XL.Cells(2,3).Value="555555"
'*******************************************************************
' Имя: PrintInExcel.vbs
' Язык: VBScript
' Описание: Использование из сценария внешнего объекта
' автоматизации (Microsoft Excel)
'*******************************************************************
Option Explicit
Dim XL ' Объявляем переменные
'Создаем объект-приложение Microsoft Excel
Set XL=WScript.CreateObject("Excel.Application")
'Делаем окно Microsoft Excel видимым
XL.Visible=true
'Открываем новую рабочую книгу
XL.WorkBooks.Add
'Устанавливаем нужную ширину колонок
XL.Columns(1).ColumnWidth = 40
XL.Columns(2).ColumnWidth = 40
XL.Columns(3).ColumnWidth = 10
'Печатаем в ячейки текст
XL.Cells(1,1).Value="Фамилия"
XL.Cells(1,2).Value="Имя"
XL.Cells(1,3).Value="Телефон"
'Выделяем три ячейки
XL.Range("A1:C1").Select
'Устанавливаем полужирный текст для выделенного диапазона
XL.Selection.Font.Bold = true
'Печатаем в ячейки текст
XL.Cells(2,1).Value="Иванов"
XL.Cells(2,2).Value="Иван"
XL.Cells(2,3).Value="555555"
'************* Конец *********************************************
Сценарии WSH способны запускать другие графические или консольные приложения, причем в последнем случае запущенный процесс может функционировать как дочерний, что позволяет в сценарии-родителе работать с информацией из его входного или выходного потока.
Из сценария WSH запустить другое приложение можно с помощью методов Run или Exec объекта WshShell.
При использовании метода Run для запускаемого приложения можно задать тип окна (при условии, что приложение поддерживает этот тип). Например, в результате выполнения следующих двух строк VBScript-кода:
Set WshShell = WScript.CreateObject("WScript.Shell")
WshShell.Run "notepad",3
программа Блокнот (notepad.exe) будет запущена в максимизированном (развернутом на весь экран) окне.
Замечание
Метод Run всегда создает новый экземпляр запускаемого процесса, с его помощью нельзя ни повторно активизировать окно запущенного приложения (для этого используется метод AppActivate ), ни свернуть или развернуть его.
Другим вариантом запуска из сценария приложения Windows, является применение метода Exec. Этот метод запускает приложение, путь к которому указан как параметр метода, и возвращает объект WshScriptExec. Например:
Set WshShell = WScript.CreateObject("WScript.Shell")
Set theNotepad = WshShell.Exec("notepad")
Замечание
При подобном запуске приложения, в отличие от метода Run, нельзя задать тип окна.
Объект WshScriptExec позволяет контролировать ход выполнения запущенного приложения с помощью свойства Status — если Status равен 0, то приложение выполняется, если Status равен 1, то приложение завершено. Кроме этого, используя метод Terminate, можно принудительно завершить работу того приложения, которому соответствует объект WshScriptExec.
В листинге 7.1 приведен сценарий на языке VBScipt, в котором с помощью метода Exec запускается Блокнот (notepad.exe); ссылка на соответствующий объект WshScriptExec сохраняется в переменной theNotepad:
Set theNotepad = WshShell.Exec("notepad")
После этого выполнение сценария приостанавливается на полсекунды (пауза необходима, для того чтобы окно Блокнота успело появиться на экране), после чего выводится диалоговое окно с информацией о статусе запущенного приложения и вопросом о необходимости закрытия Блокнота. В случае утвердительного ответа происходит закрытие Блокнота с помощью метода Terminate.
'*******************************************************************
' Имя: ExecWinApp.vbs
' Язык: VBScript
' Описание: Запуск и закрытие приложение (объект WshScriptExec)
'*******************************************************************
Option Explicit
Dim WshShell,theNotepad,Res,Text,Title ' Объявляем переменные
' Создаем объект WshShell
Set WshShell = WScript.CreateObject("WScript.Shell")
WScript.Echo "Запускаем Блокнот"
' Запускаем приложение (создаем объект WshScriptExec)
Set theNotepad = WshShell.Exec("notepad")
WScript.Sleep 500 ' Приостанавливаем выполнение сценария
Text="Блокнот запущен (Status=" theNotepad.Status ")" vbCrLf _
"Закрыть Блокнот?"
Title=""
' Выводим диалоговое окно на экран
Res=WshShell.Popup(Text,0,Title,vbQuestion+vbYesNo)
' Определяем, какая кнопка нажата в диалоговом окне
If Res=vbYes Then
theNotepad.Terminate ' Прерываем работу Блокнота
' Приостанавливаем выполнение сценария, для того чтобы Блокнот
' успел закрыться
WScript.Sleep 100
WScript.Echo "Блокнот закрыт (Status=" theNotepad.Status ")"
End If
'************* Конец *********************************************/
Производить переключение между окнами нескольких запущенных приложений позволяет метод AppActivate объекта WshShell. В качестве аргумента этого метода нужно указывать либо заголовок активизируемого окна, либо идентификатор процесса (Process ID, PID), который запущен в данном окне. Предпочтительным является использование PID, получаемого с помощью свойства ProcessID объекта WshScriptExec, соответствующего активизируемому приложению. Недостатки применения заголовка окна в методе AppActivate:
AppActivate всегда будет активизировать один и тот же экземпляр, доступ к другим окнам получить не удастся.Активизировав то или иное окно, в котором выполняется приложение Windows, можно из сценария сымитировать нажатия клавиш в этом окне. Для этого используется метод SendKeys объекта WshShell.
Рассмотрим пример сценария RunExecWinApp.vbs (листинг 7.2), в котором запускается Калькулятор (calc.exe) и в его окно с помощью SendKeys последовательно посылаются нажатия клавиш <1>, <+>, <2> и <Enter>:
Set theCalculator = WshShell.Exec("calc")
WScript.Sleep 500
WshShell.AppActivate theCalculator.ProcessID
WshShell.SendKeys "1{+}"
WshShell.SendKeys "2"
WshShell.SendKeys "~" ' Клавиша <Enter>
Затем выполнение сценария приостанавливается на 1 секунду, чтобы результат вычислений был виден на экране и результат вычислений (символ "3") копируется в буфер Windows с помощью "нажатия" клавиш <Ctrl>+<C>:
WshShell.SendKeys "^c"
После этого на экран выводится сообщение о том, что Калькулятор будет закрыт, в результате чего окно Калькулятора теряет фокус. Для того чтобы вновь активизировать это окно, используется метод AppActivate, параметром которого служит PID Калькулятора:
WshShell.AppActivate theCalculator.ProcessID
Для того чтобы закрыть окно Калькулятора, в него посылаются нажатия клавиш <Alt>+<F4>:
WshShell.SendKeys "%{F4}"
После закрытия Калькулятора запускается Блокнот (notepad.exe) и в него записываются результаты работы Калькулятора (вставка из буфера вычисленной суммы производится с помощью "нажатий" <Ctrl>+<V>):
WshShell.Run "notepad"
WScript.Sleep 1000
WshShell.AppActivate "notepad"
WshShell.SendKeys "1{+}2="
WshShell.SendKeys "^v"
WshShell.SendKeys " {(}c{)} Calculator"
'*******************************************************************
' Имя: RunExecWinApp.vbs
' Язык: VBScript
' Описание: Запуск двух приложений и обмен данными между ними
'*******************************************************************
Option Explicit
Dim WshShell, theCalculator ' Объявляем переменные
' Создаем объект WshShell
Set WshShell = WScript.CreateObject("WScript.Shell")
WScript.Echo("Запускаем калькулятор и" vbCrLf "считаем 1+2")
' Создаем объект WshScript (запускаем Калькулятор)
Set theCalculator = WshShell.Exec("calc")
' Приостанавливаем выполнение сценария, для того чтобы
' окно Калькулятора успело появиться на экране
WScript.Sleep 500
' Активизируем окно Калькулятора
WshShell.AppActivate theCalculator.ProcessID
' Посылаем нажатия клавиш в окно Калькулятора
WshShell.SendKeys "1{+}"
WshShell.SendKeys "2"
WshShell.SendKeys "~" ' Клавиша <Enter>
WScript.Sleep 500
' Копируем результат вычисления в буфер Windows (<Ctrl>+C)
WshShell.SendKeys "^c"
' Выводим сообщение (активное окно меняется)
WScript.Echo "Закрываем калькулятор"
' Активизируем окно Калькулятора
WshShell.AppActivate theCalculator.ProcessID
' Закрываем окно Калькулятора (<Alt>+<F4>)
WshShell.SendKeys "%{F4}"
WScript.Echo "Запускаем Блокнот и копируем туда результат"
WshShell.Run "notepad" ' Запускаем Блокнот
' Приостанавливаем выполнение сценария, для того чтобы
' окно Блокнота успело появиться на экране
WScript.Sleep 1000
WshShell.AppActivate "notepad" ' Активизируем окно Блокнота
' Посылаем нажатия клавиш в окно Блокнота
WshShell.SendKeys "1{+}2="
' Вставляем содержимое буфера Windows (<Ctrl>+V)
WshShell.SendKeys "^v"
' Выводим в окно Блокнота оставшуюся информацию
WshShell.SendKeys " {(}c{)} Calculator"
'************* Конец *********************************************
Для запуска независимых, т. е. работающих в отдельном адресном пространстве и использующих свою копию переменных среды, консольных приложений или внешних (представленных исполняемыми файлами на жестком диске) команд Windows используется метод Run объекта WshShell. При этом выполнение сценария можно приостановить до окончания работы запущенного приложения, а затем проанализировать код выхода этого приложения (для этого третий параметр метода Run должен равняться True ). Соответствующий пример сценария приведен в листинге 7.3.
'*******************************************************************
' Имя: RunConApp.vbs
' Язык: VBScript
' Описание: Запуск независимого консольного приложения и
' определение его кода выхода
'*******************************************************************
Option Explicit
Dim WshShell, Code ' Объявляем переменные
' Создаем объект WshShell
Set WshShell = WScript.CreateObject("WScript.Shell")
' Запускаем утилиту xcopy с ключом "/?" и ожидаем окончания ее работы
Code=WshShell.Run("xcopy /?",1,true)
' Печатаем полученный код возврата
WScript.Echo "Код возврата: ", Code
'************* Конец *********************************************/
Для выполнения внутренней команды Windows нужно запустить командный интерпретатор cmd.exe и передать ему в качестве параметра нужную команду. Для того чтобы при вызове командного интерпретатора не заботиться о полном пути к cmd.exe, нужно использовать переменную среды COMSPEC.
Замечание
Для получения значения переменной среды ее имя нужно окружить знаками % (например, %COMSPEC% ).
В листингах 7.4 приведен сценарий, в котором запускаются внутренние команды COPY /? (вызов встроенной справки для COPY ) и DIR %WINDIR% (вывод содержимого системного каталога Windows).
При этом окно, в котором выполняется команда COPY /?, не закрывается после завершения этой команды, т. к. при запуске командного интерпретатора был указан ключ /k, а информация, выводимая командой DIR %WINDIR%, перенаправляется в файл windir.txt, после чего командное окно закрывается, т. к. для командного интерпретатора в этом случае был указан ключ /c.
'*******************************************************************
' Имя: RunDOSCom.vbs
' Язык: VBScript
' Описание: Выполнение внутренних команд Windows
'*******************************************************************
Option Explicit
Dim WshShell, Code ' Объявляем переменные
' Создаем объект WshShell
Set WshShell = WScript.CreateObject("WScript.Shell")
' Запускаем внутреннюю команду COPY
WshShell.Run "%COMSPEC% /k copy /?",1
' Запускаем внутреннюю команду DIR
WshShell.Run "%COMSPEC% /c dir %WINDIR% > windir.txt",1
'************* Конец *********************************************/
Консольное приложение или команду DOS можно запустить из сценария как дочернюю задачу, т. е. с теми же переменными среды, что у процесса-родителя. При этом информация, выводимая дочерним процессом, на экран дублироваться не будет, однако из родительского сценария можно считывать информацию из выходного потока и посылать данные во входной поток дочерней задачи (это напоминает конвейеризацию команд Windows, при которой данные выходного потока одной команды поступают во входной поток другой команды, например DIR | MORE ). Таким образом, из сценария можно запускать ту или иную утилиту командной строки и обрабатывать выводимые ей данные; иногда таким образом получить нужную информацию бывает проще и быстрее, чем при использовании объектной модели WSH или другого сервера автоматизации.
В качестве примера рассмотрим сценарий ExecConApp.vbs (листинг 7.5), который выводит на экран общее количество файлов в текущем каталоге и их имена. Данную информацию можно получить в сеансе командной строки с помощью команды DIR /B. Поэтому в сценарии мы запустим в качестве дочернего процесса DIR с ключом /B:
Set ObjExec=WshShell.Exec("%COMSPEC% /c dir /b")
и полностью считаем данные, появляющиеся в выходном потоке этого процесса. Для этого в цикле вызывается метод ReadAll, считывающий всю информацию, имеющуюся к тому времени в потоке StdOut объекта ObjExec, в переменную s:
IsBreak=False
Do While True ' Бесконечный цикл
' Проверяем, достигнут ли конец выходного потока команды DIR
If (Not ObjExec.StdOut.AtEndOfStream) Then
' Считываем полностью выходной поток команды DIR
s=s+ObjExec.StdOut.ReadAll
End If
If IsBreak Then
Exit Do ' Выходим из цикла
End If
' Проверяем, не завершилось ли выполнение DIR
If ObjExec.Status=1 Then
IsBreak=True
Else
WScript.Sleep 100 ' Приостанавливаем сценарий на 0,1 сек
End If
Loop
Родительский и дочерний процессы работают асинхронно, поэтому пока команда DIR не перестанет выдавать данные, т. е. пока свойство Status объекта ObjExec не станет равным 1, выполнение сценария с помощью метода WScript.Sleep периодически приостанавливается на 0,1 секунды.
После того как считаны все данные из выходного потока команды DIR (свойство ObjExec.StdOut.AtEndOfStream равно True ), происходит выход из цикла и формирование из переменной s массива выведенных строк:
ArrS=Split(s,vbCrLf) ' Формируем массив строк
Теперь остается подсчитать количество файлов в каталоге, которое на единицу меньше количества строк в массиве ArrS:
ColFiles=UBound(ArrS) ' Количество файлов в текущем каталоге и вывести нужные строки на экран: WScript.StdOut.WriteLine "Всего файлов в текущем каталоге: " ColFiles For i=0 To ColFiles-1 WScript.StdOut.WriteLine ArrS(i) ' Выводим строки на экран Next
'*******************************************************************
' Имя: ExecConApp.vbs
' Язык: VbScript
' Описание: Запуск дочернего консольного приложения
'*******************************************************************
Option Explicit
' Объявляем переменные
Dim ObjExec,WshShell,s,IsBreak,ArrS,ColFiles,i
' Создаем объект WshShell
Set WshShell = WScript.CreateObject("WScript.Shell")
' Запускаем команду DIR
Set ObjExec=WshShell.Exec("%COMSPEC% /c dir /b")
s=""
IsBreak=False
Do While True ' Бесконечный цикл
' Проверяем, достигнут ли конец выходного потока команды DIR
If (Not ObjExec.StdOut.AtEndOfStream) Then
' Считываем полностью выходной поток команды DIR
s=s+ObjExec.StdOut.ReadAll
End If
If IsBreak Then
Exit Do ' Выходим из цикла
End If
' Проверяем, не завершилось ли выполнение DIR
If ObjExec.Status=1 Then
IsBreak=True
Else
WScript.Sleep 100 ' Приостанавливаем сценарий на 0,1 сек
End If
Loop
ArrS=Split(s,vbCrLf) ' Формируем массив строк
ColFiles=UBound(ArrS) ' Количество файлов в текущем каталоге
WScript.StdOut.WriteLine "Всего файлов в текущем каталоге: " ColFiles
For i=0 To ColFiles-1
WScript.StdOut.WriteLine ArrS(i) ' Выводим строки на экран
Next
'************* Конец *********************************************
Одна из наиболее полезных возможностей сценариев WSH – управление работой внешних серверов автоматизации (программ, предоставляющих свои службы и интерфейсы для использования другими приложениями). Самые распространенные и часто используемые серверы автоматизации в Windows – это приложения пакета Microsoft Office. Мы рассмотрим на примерах, каким образом можно выводить из сценариев WSH информацию в две наиболее распространенные программы этого пакета: Microsoft Word и Microsoft Excel.
Для того, чтобы использовать из сценариев WSH те возможности, которые поддерживают программы Word и Excel, необходимо знать, какие именно объекты предоставляются для внешнего использования этими серверами автоматизации и как объекты соотносятся друг с другом. Хотя объектные модели различных приложений Microsoft Office довольно сложны, они похожи друг на друга, причем для практических целей достаточно понять принцип работы с несколькими ключевыми объектами. Здесь мы не будем останавливаться на подробном рассмотрении свойств и методов объектов Word и Excel, а лишь кратко упомянем, какие именно объекты будут использоваться в рассмотренных ниже примерах сценариев.
На самом верхнем уровне объектной модели Word находится объект Application, который представляет непосредственно само приложение Word и содержит (в качестве свойств) все остальные объекты. Таким образом, объект Application используется для получения доступа к любому другому объекту Word.
Семейство Documents является свойством объекта Application и содержит набор объектов Document, каждый из которых соответствует открытому в Word документу. Класс Documents понадобится нам в сценариях для создания новых документов. Объект Document содержит в качестве своих свойств семейства различных объектов документа: символов (Characters), слов (Words), предложений (Sentences), параграфов (Paragraphs), закладок (Bookmarks) и т.д.
Объект Selection позволяет работать с выделенным фрагментом текста (этот фрагмент может быть и пустым). Таким образом, можно сказать, что объект Selection открывает путь в документ, так как он предоставляет доступ к выделенному фрагменту документа. В частности, у объекта Selection имеется метод TypeText(Text), с помощью которого можно вставлять текст в документ. Используя свойства этого объекта (которые, в свою очередь, могут являться объектами со своими свойствами), можно управлять параметрами выделенного фрагмента, например, устанавливать нужный размер и гарнитуру шрифта, выравнивать параграфы по центру и т.п.
Объектная модель Excel построена по тому же принципу, что и объектная модель Word. Основным объектом, содержащим все остальные, является Application. Напомним, что отдельные файлы в Excel называются рабочими книгами. Семейство Workbooks в Excel является аналогом семейства Documents в Word и содержит набор объектов Workbook (аналог объекта Document в Word), каждый из которых соответствует открытой в Excel рабочей книге. Новая рабочая книга создается с помощью метода Add() объекта Workbooks.
Для доступа к ячейкам активного рабочего листа Excel используется свойство Cells объекта Application. Для получения или изменения значения отдельной ячейки применяется конструкция Cells(row,column).Value, где row и column являются соответственно номерами строки и столбца, на пересечении которых находится данная ячейка.
В Excel, как и в Word, имеется объект Selection, позволяющий работать с выделенным фрагментом электронной таблицы. Самым простым способом выделить диапазон ячеек активного рабочего листа является использование метода Select() объекта Range. Например, выражение Range("A1:C1").Select() позволяет выделить три смежные ячейки: "A1", "B1" и "C1".
Для того, чтобы понять, какой именно объект Word или Excel нужно использовать для решения той или иной задачи, часто проще всего бывает проделать в соответствующем приложении необходимые манипуляции вручную, включив предварительно режим записи макроса. В результате мы получим текст макроса на языке VBA (Visual Basic for Applications), из которого будет ясно, какие методы и с какими параметрами нужно вызывать и какие значения нужно присваивать свойствам объектов. В качестве простой иллюстрации проделаем следующие действия. Запустим Word, запустим
Sub Пример1()
'
' Пример1 Макрос
' Макрос записан 12.09.07 Андрей Владимирович Попов
'
Selection.TypeText Text:="Пример"
End Sub
Как мы видим, для печати слова в документе был использован метод TypeText объекта Selection.
Макросы в Excel записываются и редактируются аналогичным образом.
Для того чтобы из сценария получить доступ к свойствам или методам внешнего сервера автоматизации, вначале надо "создать" соответствующий объект, т. е. загрузить в память экземпляр нужного COM-объекта и сохранить в переменной ссылку на этот объект. Объект в сценарии может создаваться несколькими способами:
В любом случае в используемый метод или функцию в качестве параметра передается программный идентификатор объекта ( ProgID ), заключенный в скобки. Пример на языке VBScript:
Set WA=WScript.CreateObject("Word.Application")
Перед точкой в ProgID стоит имя библиотеки типов (ProgID указывается имя класса, содержащего свойства и методы, доступные для использования другими приложениями.
Выполняя метод CreateObject, интерпретатор сценария через ProgID получает из системного реестра путь к файлам нужной библиотеки типов. Затем с помощью этой библиотеки в память загружается экземпляр запрашиваемого объекта, и его интерфейсы становятся доступными для использования в сценарии. Ссылка на созданный объект сохраняется в переменной; в дальнейшем, используя эту переменную, мы получаем доступ к свойствам и методам объекта, а также к его вложенным объектам (если они имеются).
Примеры управления приложением Microsoft Word из сценариев приведен в листинге 7.6. Сначала создается главный объект Word.Application, который запускает приложение Microsoft Word:
Set WA=WScript.CreateObject("Word.Application")
Затем создается новый пустой документ, в результате в переменную WD заносится ссылка на объект Document:
Set WD=WA.Documents.Add()
Наконец, в переменную Sel заносится ссылка на объект Selection, с помощью которого можно задать тип и размер шрифта, тип выравнивания абзацев и напечатать в документе строки текста:
Set Sel=WA.Selection;
В результате выполнения сценария PrintInWord.vbs в новом документе Microsoft Word печатаются две строки текста, после чего с помощью метода объекта Document содержимое документа выводится на принтер:
WD.PrintOut();
'*******************************************************************
' Имя: PrintInWord.vbs
' Язык: VBScript
' Описание: Использование из сценария внешнего объекта
' автоматизации (Microsoft Word)
'*******************************************************************
Option Explicit
Dim WA,WD,Sel ' Объявляем переменные
'Создаем объект¬–приложение Microsoft Word
Set WA=WScript.CreateObject("Word.Application")
' Можно было использовать конструкцию
' Set WA=CreateObject("Word.Application")
Set WD=WA.Documents.Add 'Создаем новый документ (объект Document)
WA.Visible=true ' Делаем Word видимым
Set Sel=WA.Selection 'Создаем объект Selection
Sel.Font.Size=14 'Устанавливаем размер шрифта
Sel.ParagraphFormat.Alignment=1 'Выравнивание по центру
Sel.Font.Bold=true 'Устанавливаем полужирный шрифт
Sel.TypeText "Привет!" vbCrLf 'Печатаем строку текста
Sel.Font.Bold=false 'Отменяем полужирный шрифт
Sel.ParagraphFormat.Alignment=0 'Выравнивание по левому краю
'Печатаем строку текста
Sel.TypeText "Эти строки напечатаны с помощью WSH."
WD.PrintOut 'Выводим документ на принтер
'************* Конец *********************************************
В качестве примера управления сервером автоматизации Microsoft Excel рассмотрим сценарий PrintInExcel.vbs (листинг 7.7). Как и в случае с Microsoft Word, здесь сначала создается главный объект Excel.Application, который запускает приложение Microsoft Excel:
Set XL=WScript.CreateObject("Excel.Application")
Затем открывается новая рабочая книга:
XL.WorkBooks.Add
Ширина первого и второго столбца делается равной 40 пунктам, а третьей – 10 пунктам:
'Устанавливаем нужную ширину колонок XL.Columns(1).ColumnWidth = 40 XL.Columns(2).ColumnWidth = 40 XL.Columns(3).ColumnWidth = 10
В столбцы первой строки записываются обозначения столбцов ("Фамилия", "Имя", "Телефон"), причем данный текст выделяется полужирным шрифтом:
'Печатаем в ячейки текст
XL.Cells(1,1).Value="Фамилия"
XL.Cells(1,2).Value="Имя"
XL.Cells(1,3).Value="Телефон"
'Выделяем три ячейки
XL.Range("A1:C1").Select
'Устанавливаем полужирный текст для выделенного диапазона
XL.Selection.Font.Bold = true
Во вторую строку заносятся данные для каждого столбца:
'Печатаем в ячейки текст
XL.Cells(2,1).Value="Иванов"
XL.Cells(2,2).Value="Иван"
XL.Cells(2,3).Value="555555"
'*******************************************************************
' Имя: PrintInExcel.vbs
' Язык: VBScript
' Описание: Использование из сценария внешнего объекта
' автоматизации (Microsoft Excel)
'*******************************************************************
Option Explicit
Dim XL ' Объявляем переменные
'Создаем объект-приложение Microsoft Excel
Set XL=WScript.CreateObject("Excel.Application")
'Делаем окно Microsoft Excel видимым
XL.Visible=true
'Открываем новую рабочую книгу
XL.WorkBooks.Add
'Устанавливаем нужную ширину колонок
XL.Columns(1).ColumnWidth = 40
XL.Columns(2).ColumnWidth = 40
XL.Columns(3).ColumnWidth = 10
'Печатаем в ячейки текст
XL.Cells(1,1).Value="Фамилия"
XL.Cells(1,2).Value="Имя"
XL.Cells(1,3).Value="Телефон"
'Выделяем три ячейки
XL.Range("A1:C1").Select
'Устанавливаем полужирный текст для выделенного диапазона
XL.Selection.Font.Bold = true
'Печатаем в ячейки текст
XL.Cells(2,1).Value="Иванов"
XL.Cells(2,2).Value="Иван"
XL.Cells(2,3).Value="555555"
'************* Конец *********************************************
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.