Сценарии в windows 7. Запуск сценария из командной строки в консольном режиме. По возможности используйте переменные среды

Создание сценариев включения/выключения и входа/выхода

Напомним, что в Windows XP/2000/NT для настройки среды пользователя используются профили (локальные и серверные), в состав которых входят все настраиваемые пользователем параметры: язык и региональные настройки, настройка мыши и звуковых сигналов, подключаемые сетевые диски и принтеры и т.д. Профили, сохраняемые на сервере, обеспечивают пользователям одну и ту же рабочую среду вне зависимости от того, с какого компьютера (под управлением Windows) зарегистрировался пользователь. Создание и поддержание профилей пользователей описываются практически в любой книге по администрированию Windows и здесь рассматриваться не будут.

Начиная с Windows NT, для настройки среды пользователей, кроме профилей, применяются сценарии входа (сценарии регистрации) - сценарии WSH, командные или исполняемые файлы, которые запускаются на машине пользователя каждый раз при его регистрации в сети или на локальной рабочей станции. Это позволяет администратору задавать только некоторые параметры среды пользователя, не вмешиваясь в остальные настройки; кроме этого, сценарии входа легче создавать и поддерживать, чем профили.

В Windows ХР/2000 для объектов групповой политики можно дополнительно задавать сценарии следующих типов.

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

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

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

? Сценарии выключения , которые автоматически выполняются при завершении работы Windows.

Для простоты проверки примеров мы далее будем рассматривать сценарии включения/выключения и входа/выхода, которые хранятся на локальной рабочей станции, работающей под управлением Windows ХР. Ниже будет подробно описано, в каких специальных папках нужно сохранять сценарии того или иного вида и каким образом происходит подключение этих сценариев. Для использования сценариев включения/выключения и входа/выхода в сети со службой каталогов Active Directory нужно просто перенести сценарии в соответствующие папки на контроллере домена и воспользоваться оснасткой Active Directory - пользователи и компьютеры (Active Directory - users and computers) консоли управления MMC для назначения этих сценариев соответствующим объектам групповой политики.

Сценарии, выполняемые при загрузке операционной системы

Сценарии включения/выключения, как и сценарии входа/выхода групповой политики, подключаются с помощью оснастки Групповая политика (Group Policy) в MMC. Процесс добавления оснастки Групповая политика (Group Policy) для локальной рабочей станции был подробно описан в разд. "Блокировка локальных и удаленных сценариев WSH. Пример административного шаблона" главы 4 (рис. 11.8).

Рис. 11.8. Мастер групповой политики

Для того чтобы подключить определенный сценарий включения, нужно выделить раздел Конфигурация компьютера|Конфигурация Windows|Сценарии (запуск/завершение) (Computer Configuration | Windows Configuration|Scripts (Startup/Shutdown)) и выбрать свойство (Startup), после чего будет выведено диалоговое окно (Properties: Startup) (рис. 11.9).

Рис. 11.9. Список установленных сценариев включения

Добавить (Add) и в диалоговом окне Добавление сценария (Adding script) указать имя нужного файла (для этого можно воспользоваться кнопкой Обзор (Browse)) и, в случае необходимости, параметры сценария (рис. 11.10).

Отметим, что по умолчанию сценарии включения хранятся в каталоге %SystemRoot%\System32\GroupPolicy\Machine\Scripts\Startup.

Рис. 11.10. Имя и параметры сценария включения

Сценарии, выполняемые при завершении работы операционной системы

Для подключения сценариев выключения нужно выбрать свойство Завершение работы (Shutdown) в разделе Сценарии (запуск/завершение) (Scripts (Startup/Shutdown)), после чего будет выведено диалоговое окно Свойства: Завершение работы (Properties: Shutdown) (рис. 11.11).

Рис. 11.11. Список установленных сценариев выключения

Как и в предыдущем случае, для добавления нового сценария нужно нажать кнопку Добавить (Add) и в диалоговом окне Добавление сценария (Adding script) указать имя нужного файла (по умолчанию сценарии выключения хранятся в каталоге %SystemRoot%\System32\GroupPolicy\Machine\Scripts\Shutdown) и параметры сценария.

Сценарии входа для всех локальных пользователей

Сценарии входа групповой политики подключаются в разделе Конфигурация пользователя|Конфигурация Windows|Сценарии (вход/выход из системы) (User Configuration|Windows Configuration|Scripts (Logon/Logoff)). В этом разделе нужно выбрать свойство Вход в систему (Logon), после чего будет выведено диалоговое окно Свойства: Вход в систему (Properties: Logon) (рис. 11.12).

Для добавления нового сценария входа нужно нажать кнопку Добавить (Add) и в диалоговом окне Добавление сценария (Adding script) указать имя нужного файла (по умолчанию сценарии выключения хранятся в каталоге %SystemRoot%\System32\GroupPolicy\User\Scripts\Logon) и параметры сценария.

Рис. 11.12. Список установленных сценариев входа

Сценарий выхода для всех локальных пользователей

Для подключения сценариев выхода нужно выбрать свойство Выход из системы (Logoff) в разделе Сценарии (вход/выход из системы) (Scripts (Logon/Logoff)), после чего будет выведено диалоговое окно Свойства: Выход из системы (Properties: Logoff) (рис. 11.13).

Для добавления нового сценария нужно нажать кнопку Добавить (Add) и в диалоговом окне Добавление сценария (Adding script) указать имя нужного файла (по умолчанию сценарии выхода хранятся в каталоге %SystemRoot%\System32\GroupPolicy\User\Scripts\Logoff) и параметры сценария.

Рис. 11.13. Список установленных сценариев выхода

Сценарий входа для одного пользователя

Сценарии входа для отдельных пользователей назначаются с помощью оснастки (Local users and groups).

Замечание

В Windows NT для этого использовался Диспетчер пользователей (User Manager for Domain).

Для добавления этой оснастки в консоли ММС выберем пункт Добавить или удалить оснастку (Add/Remove Snap-in) в меню Консоль (Console) и нажмем кнопку Добавить (Add). В появившемся списке всех имеющихся оснасток нужно выбрать пункт Локальные пользователи и группы (Local users and groups) и нажать кнопку Добавить (Add). После этого появится диалоговое окно, в котором нужно указать, что выбранная оснастка будет управлять локальным компьютером, и нажать кнопку Готово (Finish) (рис. 11.14).

Рис. 11.14. Выбор компьютера, которым будет управлять оснастка Локальные пользователи и группы

Никаких других оснасток в окно консоли мы добавлять не будем, поэтому нажимаем кнопку Закрыть (Close) в списке оснасток и кнопку OK в окне добавления/удаления оснасток. После этого мы можем в окне консоли просматривать список локальных пользователей компьютера и изменять их свойства (рис. 11.15).

Рис. 11.15. Список пользователей локального компьютера

Для назначения пользователю сценария входа нужно выбрать этого пользователя (например, Popov) в списке и перейти на вкладку Профиль (Profile) в диалоговом окне со свойствами пользователя. Имя сценария входа вводится в поле Сценарий входа (Logon Script) этого окна (рис. 11.16).

Рис. 11.16. Настройки профиля пользователя

Путь к сценарию входа нужно указывать относительно каталога %SystemRoot%\System32\Repl\Import\Scripts. Если, скажем, сценарий scr99.bat для пользователя Popov находится в каталоге с полным именем F:\Windows\System32\Repl\Import\Scripts\Script99, то в качестве пути к сценарию входа нужно указать \Script99\scr99.bat.

Примеры сценариев входа/выхода

Ниже рассмотрены несколько сценариев (два из которых являются обычными командными файлами), которые можно использовать в качестве сценариев входа или выхода.

Подключение сетевых дисков и синхронизация времени при регистрации пользователей

Часто сценарии входа используются для подключения дисков и портов принтера к сетевым ресурсам, а также для синхронизации системного времени пользовательских компьютеров с системным временем определенного сервера (это необходимо, например, для файл-серверных банковских систем, работающих в реальном времени). Конечно, для этих целей можно написать сценарий WSH, однако в подобных случаях проще ограничиться обычным командным (пакетным) файлом. Отметим, что в пакетных файлах можно использовать различные утилиты командной строки из пакетов Windows NT/2000/XP Resource Kit, с помощью которых многие задачи можно решить наиболее быстрым и простым способом. В качестве примера упомянем лишь одну полезную команду IFMEMBER , которая позволяет, не прибегая к помощи ADSI, проверить принадлежность пользователя, выполняющего регистрацию, к определенной группе.

Замечание

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

Предположим, что при регистрации определенного пользователя нам нужно произвести следующие действия:

1. Синхронизировать системное время клиентской рабочей станции с системным временем на сервере Server1.

2. Подключить диск М: к сетевому ресурсу \\Server1\Letters.

3. Предоставить каталог C:\TEXT на клиентском компьютере в общее пользование с именем BOOKS.

Для этого пользователю в качестве сценария регистрации можно назначить командный файл Logon.bat, который состоит (вместе с комментариями) всего из шести строк (листинг 11.9).

Листинг 11.9. Пример командного файла-сценария входа

REM Имя: Logon.bat

REM Описание: Использование командного файла в качестве сценария входа

NET TIME \\Server1 /SET

NET SHARE MyTxt=C:\TEXT

В первой строке файла Logon.bat мы отключаем режим дублирования команд на экране:

Синхронизация времени с сервером \\Server1 производится с помощью ключа /SET в команде NET TIME:

NET TIME \\Server1 /SET

Сетевой диск подключается командой NET USE:

NET USE M: \\Server1\Letters /PERSISTENT:NO

Ключ /PERSISTENT: NO в команде NET USE нужен для создания временных подключений (не сохраняющихся после завершения сеанса пользователя). Если бы подключения были постоянными (/PERSISTENT:YES), то при следующем входе пользователя в систему возникла бы ошибка (повторное использование уже имеющегося подключения).

Наконец, папка C:\TEXT предоставляется в общее пользование командой NET SHARE:

NET SHARE MyTxt=C:\TEXT

Интерактивный выбор программ автозагрузки

Как известно, в подменю Программы (Programs) стартового меню Windows имеется пункт (Startup), в который можно поместить ярлыки тех программ, которые должны быть автоматически запущены при регистрации пользователя в системе. Однако в процессе загрузки своего профиля пользователь не имеет возможности запустить только какие-либо определенные программы из папки автозагрузки - можно либо запустить все программы, либо не запускать ни одной (для этого необходимо в процессе регистрации в системе удерживать нажатой клавишу ).

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

Начнем мы с того, что создадим в каталоге %SystemDrive%\Documents and Settings\All Users\ Главное меню, в котором хранятся ярлыки программ из стартового меню для всех пользователей, папку и поместим туда ярлыки для нужных приложений (рис. 11.17).

После этого ярлыки из обычной папки нужно убрать. Рассмотрим теперь алгоритм работы сценария входа Logon.js.

Вначале нужно определить путь к папке выборочной автозагрузки (переменная PathStartup). Для этого мы воспользуемся объектом WshSpecialFolders:

//Создаем объект WshShell

Рис. 11.17. Новая папка

Зная путь к нужной папке, мы формируем коллекцию всех файлов, которые находятся в ней (переменная Files):

После этого мы выводим на экран диалоговое окно с вопросом, нужно ли запустить программы из папки автозагрузки в пакетном режиме, т.е. все сразу (рис. 11.18).

Рис. 11.18. Выбор режима автозагрузки программ (пакетный или интерактивный)

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

Res=WshShell.Popup("Запустить сразу все программы?", 0,

//Определяем, нажата ли кнопка "Да"

while (!Files.atEnd()) {

File=Files.item();

Files.moveNext();

Если ранее был выбран интерактивный режим запуска программ (переменная IsRunAll равна false), то мы выводим запрос на запуск текущего файла (рис. 11.19):

//Обнуляем переменную Res Res=0;

Res=WshShell.Popup("Запустить "+File.Name+"?", 0, "Выборочная автозагрузка", vbQuestion+vbYesNo);

Рис. 11.19. Запрос на запуск одной программы из папки автозагрузки

Если пользователь решил запустить программу (переменная Res равна vbYes) или программы запускаются в пакетном режиме, то мы запускаем текущую программу в минимизированном окне с помощью метода Run объекта WshShell:

if ((IsRunAll) || (Res=vbYes))

WshShell.Run("\""+File.Path+" \"", vbMinimizedFocus);

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

Замечание

Другим вариантом запуска с помощью метода Run программ, имена которых содержат пробелы, можно использовать короткие имена папок и файлов посредством свойства ShortPath объекта File: WshShell.Run(File.ShortPath, vbMinimizedFocus);

Полностью текст сценария Logon.js приведен в листинге 11.10.

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

//*******************************************************************/

/* Имя: Logon.js */

/* Язык: JScript */

/* Описание: Сценарий входа, позволяющий выбирать программы для */

/* автозагрузки */

/*******************************************************************/

//Объявляем переменные

PathStartup, //Путь к папке выборочной автозагрузки

Folder, //Экземпляр объекта Folder для папки

//выборочной автозагрузки

Files, //Коллекция файлов в папке выборочной автозагрузки

File, //Экземпляр объекта File для ярлыка в папке

//выборочной автозагрузки

Res, //Результат нажатия кнопок в диалоговых окнах

IsRunAll; //Логический флаг, указывающий, надо ли запустить

//сразу все программы из автозагрузки

var vbYesNo=4,vbQuestion=32,vbYes=6,vbOkOnly=0,vbMinimizedFocus=2;

//Создаем объект WshShell

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

//Создаем объект WshSpecialFolders

WshFldrs=WshShell.SpecialFolders;

//Определяем путь к папке выборочной автозагрузки

PathStartup=WshFldrs.item("AllUsersStartMenu")+"\\Выборочная автозагрузка\\";

//Создаем объект FileSystemObject

FSO=WScript.CreateObject("Scripting.FileSystemObject");

//Создаем объект Folder для папки выборочной автозагрузки

Folder=FSO.GetFolder(PathStartup);

//Создаем коллекцию файлов каталога выборочной автозагрузки

Files=new Enumerator(Folder.Files);

//Выводим запрос на запуск сразу всех программ

Res=WshShell.Popup("Запустить сразу все программы?",0,

//Определяем, нажата ли кнопка Да

IsRunAll=(Res==vbYes);

//Цикл по всем файлам каталога выборочной автозагрузки

while (!Files.atEnd()) {

//Создаем объект File для текущего элемента коллекции

File=Files.item();

//Обнуляем переменную Res

if (!IsRunAll) //Программы нужно запускать по одной

//Выводим запрос на запуск одной программы

Res=WshShell.Popup("Запустить "+File.Name+"?",0,

if ((IsRunAll) || (Res==vbYes))

//Запускаем текущую программу в минимизированном окне

WshShell.Run("\""+File.Path+"\"",vbMinimizedFocus);

//Переходим к следующему файлу в коллекции

Files.moveNext();

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

Для каждого пользователя Windows ХР в каталоге Documents and Settings автоматически создается личная папка, имя которой совпадает с именем этого пользователя. В подкаталоге "Мои документы" (My Documents) этой папки по умолчанию сохраняются все созданные пользователем документы. Для того чтобы всегда иметь резервную копию документов пользователей, можно написать универсальный сценарий выхода, в котором будет происходить копирование всех файлов и подкаталогов из пользовательского каталога "Мои документы" в другой каталог с именем пользователя. В нашем примере резервные копии документов будут сохраняться в каталоге D:\Backup, т.е. при выходе пользователя Popov все его документы скопируются в каталог D:\Backup\Popov, а при выходе пользователя Kazakov - в каталог D:\Backup\Kazakov.

Командный файл

Самым быстрым решением поставленной задачи является создание командного файла Logoff.bat (листинг 11.11) и назначение его в качестве сценария выхода для всех пользователей. Результат работы этого пакетного файла будет виден в командном окне (рис. 11.20).

Листинг 11.11. Командный файл-сценарий выхода, позволяющий производить: резервное копирование документов пользователя

REM Имя: Logoff.bat

REM Описание: BAT-файл, выполняющий резервное копирование

REM документов пользователя

ECHO Окончание сеанса пользователя %UserName%.

ECHO Начинаем копирование документов в каталог D:\Backup\%UserName%...

XCOPY /C /D /E /I /Y "%HomeDrive%%HomePath%\Мои документы" D:\Backup\%UserName%

ECHO Копирование документов завершено.

Как мы видим, вся работа файла Logoff.bat заключается в вызове команды XCOPY для нужных каталогов:

XCOPY /С /D /Е /I /Y "%HomeDrive%%HomePath%\Мои документы" "D:\Backup\%UserName%"

Рис. 11.20. Результат работы сценария выхода Logoff.bat для пользователя Popov

Здесь для XCOPY указаны несколько ключей, которые позволяют:

Не прерывать копирование при возникновении ошибки (ключ /С);

Копировать только те файлы, которые были изменены (ключ /D);

Копировать все подкаталоги, включая пустые (ключ /Е);

Создавать, при необходимости, каталог, в который производится копирование (ключ /I);

Перезаписывать файлы без подтверждения пользователя (ключ /Y).

Замечание

Подробнее о ключах команды XCOPY можно узнать из встроенной справки для этой команды. Для вывода этой справки на экран необходимо в командном окне запустить XCOPY с ключом /? ; для вывода справки в текстовый файл нужно воспользоваться символом перенаправления вывода " > ", например: XCOPY /? > spr.txt .

Пути к каталогу, где хранятся документы пользователя, и к каталогу, в который будет производиться копирование, формируются с помощью переменных среды %HomeDir% , %HomePath% и %UserName% . Описание этих и некоторых других переменных среды, которые определены в Windows, приведено в табл. 11.2.

Таблица 11.2. Переменные среды, полезные для использования в сценариях входа/выхода

Переменная Описание
%COMSPEC% Путь к командному интерпретатору
%HOMEDIR% Буква переопределенного диска на компьютере пользователя, которая ссылается на сетевой ресурс, содержащий личный каталог пользователя
%HOMEDRIVE% Локальный, либо перенаправленный диск, на котором расположен личный каталог
%HOMEPATH% Путь к личному каталогу
%HOMESHARE% Имя каталога общего доступа, включающее личный каталог и локальный, либо переопределенный диск
%OS% Операционная система, управляющая рабочей станцией
%PROCESSOR_ARCHITECTURE% Архитектура процессора (например, х86) рабочей станции пользователя
%SYSTEMDRIVE% Диск, на котором находится системный каталог Windows
%SYSTEMROOT% Путь к системному каталогу Windows
%PROCESSOR_LEVEL% Тип процессора рабочей станции пользователя
%TEMP% Путь к каталогу для хранения временных файлов
%USERDOMAIN% Домен, в котором зарегистрирован пользователь
%USERNAME% Имя, под которым регистрировался при входе в сеть пользователь

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

Сценарий WSH

Для создания нужных нам резервных копий можно также написать сценарий WSH (назовем этот сценарий Logoff.js), который, конечно, будет намного больше по объему, чем командный файл, но будет выводить сообщения в красивые графические диалоговые окна (рис. 11.21–11.23).

Сначала в сценарии Logoff.js создаются экземпляры объектов WshShell , FileSystemObject и WshSpecialFolders , после чего в переменную SHomePath заносится путь к каталогу с документами текущего пользователя (специальная папка с именем My Documents):

//Создаем объект WshShell

//Создаем объект FileSystemObject

//Создаем объект WshSpecialFolders

WshFldrs=WshShell.SpecialFolders;

//Определяем путь к папке выборочной автозагрузки

Путь к каталогу, в который будет производиться копирование документов, формируется с помощью переменной среды %UserName% ; значение такой переменной извлекается c помощью метода ExpandEnvironmentStrings() объекта WshShell:

//Определяем имя пользователя

//пользователя

SBackupPath+=SUserName;

Копирование документов мы будем производить только после утвердительного ответа пользователя на соответствующий вопрос (см. рис. 11.21):

Res=WshShell.Popup("Выполнить резервное копирование документов в\n" + SBackupPath + " ?", 0, "Выход пользователя " + SUserName, vbQuestion+vbYesNo);

Рис. 11.21. Диалоговое окно с запросом о необходимости копирования

Если пользователь согласен, мы копируем нужный каталог с помощью метода CopyFolder() , причем делаем это внутри блока try конструкции try…catch .

В случае возникновения ошибки переменной IsError в блоке catch присваивается значение true, а на экран выводится диалоговое окно с соответствующим сообщением (см. рис. 11.22):

catch (е) { //Обрабатываем возможные ошибки

//Выводим сообщение об ошибке

Mess="Ошибка при копировании каталога "+SHomePath+"\nКод ошибки: " + е.number + "\nОписание: " + е.description;

WshShell.Popup(Mess, 0, "Выход пользователя " + SUserName, vbCritical);

Рис. 11.22.

Если же в процессе копирования ошибок не возникло (переменная IsError равна false), то пользователю также выдается сообщение об этом (см. рис. 11.23):

//Производим копирование каталога

FSO.CopyFolder(SHomePath, SBackupPath);

//Все в порядке

Mess = "Копирование документов произведено";

WshShell.Popup(Mess, 0, "Выход пользователя " + SUserName, vbInformation);

Рис. 11.23. Диалоговое окно с сообщением о возникшей ошибке

Полностью текст сценария Logoff.js приведен в листинге 11.12.

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

/* Имя: Logoff.js */

/* Язык: JScript */

/* Описание: Сценарий выхода, позволяющий производить резервное */

/* копирование документов пользователя */

/********************************************************************/

//Объявляем переменные

WshShell, //Экземпляр объекта WshShell

WshFldrs, //Экземпляр объекта WshSpecialFolders

FSO, //Экземпляр объекта FileSystemObject

SUserDocPath, //Путь к папке с документами пользователя

SUserName, //Имя пользователя

SBackupPath="D:\\Backup\\", //Каталог для резервных копий документов

//Инициализируем константы для диалоговых окон

var vbYesNo=4,vbQuestion=32,vbInformation=64,vbYes=6,vbOkOnly=0,

//Создаем объект WshShell

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

//Создаем объект FileSystemObject

FSO = WScript.CreateObject("Scripting.FileSystemObject");

//Создаем объект WshSpecialFolders

WshFldrs=WshShell.SpecialFolders;

//Определяем путь к папке выборочной автозагрузки

SHomePath=WshFldrs.item("MyDocuments");

//Определяем имя пользователя

SUserName=WshShell.ExpandEnvironmentStrings("%UserName%");

//Формируем полный путь к каталогу с резервными копиями документов

//пользователя

SBackupPath+=SUserName;

//Запрос на создание резервной копии

Res=WshShell.Popup("Выполнить резервное копирование документов в\n"+

SBackupPath+" ?", 0, "Выход пользователя "+SUserName, vbQuestion+vbYesNo);

if (Res==vbYes) { //Нажата кнопка Да

//Производим копирование каталога

FSO.CopyFolder(SHomePath,SBackupPath);

} catch (e) { //Обрабатываем возможные ошибки

//Выводим сообщение об ошибке

Mess="Ошибка при копировании каталога "+SHomePath+"\nКод ошибки: "+

e.number+"\nОписание: "+e.description;

WshShell.Popup(Mess,0,"Выход пользователя "+SUserName,vbCritical);

//Все в порядке

Mess="Копирование документов произведено";

WshShell.Popup(Mess,0,"Выход пользователя "+SUserName,vbInformation);

/************* Конец *********************************************/

Составление сценариев и их использование в процессе управления Windows - очень удобный метод, о котором не следует забывать. Возможно, не всегда ясно, как применять сценарии при наличии графического интерфейса. Может быть, непонятно, во что обойдется обучение написанию сценариев с точки зрения временных затрат и, как говорится, стоит ли овчинка выделки. Или, быть может, трудно разобраться в этих названиях - WSH, WMI, ADSI, в бесконечных объектах, методах, процедурах и функциях. При этом у многих администраторов возникает ощущение, что использованием сценариев можно без ущерба для себя пренебречь. Однако игнорировать возможности сценариев не следует. Быстро подготовленный сценарий значительно сэкономит и время, и силы. И чем больше подобных сценариев, тем, естественно, лучше.

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

Почему именно сценарии?

Программирование сценария занимает больше времени, чем однократное выполнение задачи вручную, - даже если за дело берется опытный специалист по программированию на VBScript, который знает проблему досконально. Если же вы не профессионал, то написание и отладка сценария займет куда больше времени, чем использование графического интерфейса. Так зачем же тогда привлекать сценарий?

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

Если с помощью GUI решить задачу непросто, то, может быть, стоит обратиться к утилитам командной строки, которые поставляются вместе с операционной системой или в составе Resource Kit? Желательно использовать данные утилиты всегда, когда в этом есть смысл. Но в Windows 2000 набор программ с графическим интерфейсом не соответствует в точности набору утилит командной строки, и некоторые утилиты могут не удовлетворять в полном объеме решаемой задаче. Пакетные файлы не всегда хорошо справляются с ситуацией, когда входной поток данных должен быть изменен. Кроме того, утилиты командной строки и сценарии не являются взаимоисключающими методами. Можно написать сценарии, основанные на применении утилит командной строки и при этом свободные от недостатков последних.

Scripting Host

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

Scripting host (машина сценариев) - это операционная среда сценария. Windows не имеет понятия о VBScript: если в командной строке ввести строчку кода на VBScript, система выдаст сообщение об ошибке. Когда Windows сталкивается с файлом, расширение которого указывает на файл-сценарий, операционная система передает файл машине сценариев для интерпретации. Машина интерпретирует предложенный сценарий, а затем передает сообщения сценария (по сути - запрос на регистрацию данных) в операционную систему Windows для исполнения.

Windows поддерживает две машины сценариев: Microsoft Internet Explorer (IE) и Windows Script Host (WSH). Выбор той или иной машины влияет на используемые в сценарии возможности. Если применяется WSH, как чаще всего и бывает, то в сценарии могут использоваться объекты WSH, но не IE, и наоборот. Машина сценария не обязана понимать содержание всех мыслимых сценариев; воспринимается только сценарий, написанный на языке машины, и тот, который ею поддерживается. Для WSH и IE «понятными» являются языки VBScript и JScript.

Элементы сценария

Каждая строка сценария - это оператор, который сообщает компьютеру, что следует сделать. Исполняемые операторы обычно имеют форму типа «действие-объект»: описываются само действие и тот объект, над которым действие совершается. Сценарий может содержать условия, при наличии которых указанные операторы должны быть выполнены. Хост сценария интерпретирует строки кода слева направо и сверху вниз, так что можно, например, получив некоторые данные в строке 10, использовать их в 30-й строке. Исключение составляют процедуры. Процедуры (функции и подпрограммы) - это набор операторов, которые выполняются только при явном обращении к ним. В данном случае процедура сразу же начинает выполняться независимо от того, из какого места кода было обращение.

Исполняемые части сценария называются операторами. Неисполняемая часть сценария называется комментарием и должна предваряться апострофом (") или ключевым словом Rem. Например:

Rem Это комментарий

" Это комментарий

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

VBScript «понимает» четыре типа данных: числа (number); строки (string); дата и время (date and time); булевы данные (boolean). Примеры чисел - скажем 2 или 9458. Строки - это любая комбинация символов, заключенная в двойные кавычки, например «рыба» и «Это строка %@#^>». Дата и время должны находиться внутри символов решетки (#) и выглядеть соответственно. Так, например, #16 January 1968# и #1/01/02 11:45 PM# - нормальные с точки зрения VBScript данные. Булевы данные - TRUE или FALSE, например x

VBScript рассматривает перечисленные четыре типа данных как подмножество другого типа данных - variant, который может содержать данные любого вида. Таким образом, VBScript можно не сообщать, с данными какого типа вы работаете, но нужно иметь в виду, что некоторые задачи выполняются в Visual Basic (VB) и VBScript с описанными типами данных по-разному (правда, подобная ситуация может никогда и не встретиться). Группы однотипных данных называются массивами (array).

Для простоты работы с данными VBScript поддерживает еще два типа данных, не имеющих никакого начального значения (null-данные), которые можно присваивать переменным (variable) и константам (constant) сценария. Значения переменных в ходе выполнения программы могут меняться, но их имена при этом остаются прежними. Константы при выполнении сценария имеют только одно значение и изменяться не могут.

Передать данные в сценарий можно двумя способами. Во-первых, их в явном виде прописывают в теле программы. Например, «»igserversharedfolder»» - обычное использование в сценарии строковых данных для обозначения пути. Другой способ - передать нужные данные во входном потоке в сценарий. Кроме того, по ходу обработки сценарий может самостоятельно генерировать данные (например, вычислить дату двумя неделями позднее текущей), а затем использовать их.

Манипулировать данными можно с помощью операторов (operator) - символов, которые обычно применяются для обозначения математических функций. Какие-то операторы имеют более высокий приоритет, какие-то - более низкий, и это влияет на порядок вычисления выражений (expression). Выражение есть некоторое вычисление, в которое могут быть включены числа, переменные, строки, константы. В выражениях могут использоваться операторы. Например, выражение dInputDate + 2 = dNewDate означает, что к значению переменной dInputDate добавляется 2, и результат вычисления вновь присваивается переменной dNewDate.

Функции и подпрограммы

VBScript имеет набор встроенных функций, которые позволяют выполнять некоторые операции без подробного описания решаемой задачи. С помощью встроенных функций можно манипулировать числами, строками, значениями даты и времени, массивами. В состав VBScript также входят функции преобразования данных одного типа в другой. Например, VBScript обычно исходит из того, что число, допустим, 45, имеет тип «число», но при необходимости его можно рассматривать как данные строкового типа.

VBScript предусматривает создание собственных функций пользователя (user-defined function, UDF) для выполнения каких-то специфических задач. Например:

Function TestFunct TestFunct = Sqr(9) + 2 End Function

Пользовательская функция TestFunct работает со встроенной функцией Sqr для извлечения квадратного корня из 9 и добавления к полученному результату 2. UDF, как и встроенная функция, может использовать аргументы.

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

Sub AskUserName WScript.Echo _ ""Please type a username."" WScript.Quit End Sub

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

Объекты в сценарии

Объект (Object) представляет собой физическую или логическую часть вычислительной среды, например дисковод или имя учетной записи. Конечно, можно программировать, не прибегая к объектам, но большинство сценариев управления работает с объектами. Если используется WSH, VBScript может обращаться к объектам, изначально присущим WSH, например, представляющим файлы, каталоги, части реестра; VBScript также поддерживает объекты Windows Management Instrumentation (WMI) и Active Directory Service Interfaces (ADSI). Объекты WMI связаны с физическими и логическими частями вычислительной системы: например, адресами IP, файловыми системами, сетевыми адаптерами. ADSI-объекты представляют ресурсы службы каталогов: в частности, Active Directory (AD) или иные поддерживаемые каталоги, скажем Windows NT 4.0 SAM. Статические группы объектов одинаковой природы называются классами, а группы, описываемые пользователем, - библиотеками.

Объекты имеют свойства и методы. Объект определяется его свойствами (т. е. IP Address - это свойство объекта Network Card, а 12.4.21.197 - значение данного свойства). Методы - это действия, которые могут выполняться над объектом (Copy - один из методов объекта File). Не все объекты имеют методы. Свойства и методы используются при написании кода одинаково: сначала следует объект, затем ставится точка, далее название метода или свойства (например, ObjectName.PropertyName). Объекты могут содержать другие объекты. В частности, объект WSH WScript включает подчиненный объект WshArguments, который является набором аргументов, передаваемых при вызове файлу-сценарию. Для выделения первого элемента строки аргументов используется WScript.Arguments(0). Как было видно при обсуждении объектов WSH, формальное имя подчиненных объектов не совпадает с именем, используемым при обращении к ним в сценарии.

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

Криста Андерсон - независимый автор и консультант журнала Windows NT Magazine. Ее последняя книга - «Mastering Local Area Networks». С ней можно связаться по адресу: [email protected] .

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

  • строки сценария должны быть короткими: они легче читаются. VBScript допускает использование знака подчеркивания для разрыва строки, а конструкция If ...Then ... Else поможет избавиться от нагромождения логики в одной строке;
  • не скупитесь на комментарии. Сейчас вы еще помните, зачем нужна данная строка кода. Но вспомните ли вы об этом через полгода? А другой человек - разберется ли он без посторонней помощи в чужом коде? Убедитесь, что логика кода исчерпывающе объясняется в комментариях;
  • смешивайте регистр написания кода. Переменная oDiskSpace читается легче, чем odiskspace или ODISKSPACE. VBScript в большинстве случаев не зависит от регистра (единственное исключение - вычисление значения ASCII-символа);
  • при работе с Windows Script Host (WSH) следует использовать среду командной строки (command-line environment). WSH может исполняться в двух средах - в среде командной строки и в графической среде (по умолчанию). В первом случае вывод направляется в командное окно, если только программист не перенаправит поток данных в другое место. В графической среде вывод поступает в окна сообщений. Чаще всего используется командная среда. Некоторые операции в графической среде не работают, и если несколько строк кода генерирует вывод, то для каждой из них понадобится свое окошко сообщений. В результате работа сценария будет приостанавливаться до тех пор, пока оператор не нажмет кнопку ОК. Для исполнения сценария в командной среде следует воспользоваться одним из двух способов: предварять каждую команду сценария вызовом cscript, например: cscript getfree.vbs

    либо установить среду командной строки в виде среды по умолчанию:

    Wscript //h:cscript //s

  • присваивайте имена переменным в соответствии с типом представляемых данных (т. е. имена строковых переменных должны начинаться с s, объектных - с o). Подобная практика поможет при отладке кода. В ряде случаев при несоответствии типов данных объявленным переменным работа сценария будет протекать не так, как ожидается. А если тип данных ассоциируется с названием переменной, ошибки из-за несоответствия типов переменных и данных будут выявляться быстрее;
  • заранее и в явном виде описывайте переменные. Хотя переменные разрешено описывать неявно (просто присваивая им значения), их применение можно запретить. Для этого используйте утверждение Option Explicit в самом начале файла-сценария. С этого момента любая применяемая в коде программы переменная должна явно описываться оператором Dim, что позволит ограничить число ошибок из-за случайно или неверно набранных переменных;
  • пишите сценарии в текстовом редакторе. Не применяйте для этих целей текстовый процессор с последующим сохранением данных в редакторе.

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

07.12.2006 Билл Стюарт

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

Совершенствуйте свои сценарии

Сценарии для командной строки - это файлы с простым текстом, которые интерпретируются командным процессором как наборы команд, подлежащие последовательному исполнению. История сценариев для командной строки началась на заре 80-х - именно с этого времени и по сей день оболочка Command.com в MSDOS поддерживает исполнение сценариев посредством простых пакетных файлов. Выпущенный в 1993 году вместе с Windows NT другой командный процессор, Cmd.exe, также поддерживает язык макропрограммирования, подобный языку пакетных файлов Command.com. Несмотря на солидный возраст технологии, макропрограммирование в оболочке Cmd.exe все еще широко используется специалистами по ИT. Например, простой сценарий с командой For может превратить команду, которая сама по себе работает одновременно только с одним компьютером или пользователем в командной строке, в команду, которая пошагово проходит другой текстовый файл и исполняется для каждой строки в этом файле. Благодаря тому что сценарии для командной строки являются файлами с простым текстом, который представляет собой набор команд, их легко создавать и менять и они удобны для восприятия. Но простота макропрограммирования обманчива. Небрежно написанный сценарий для командного процессора может вызывать проблемы. Мне приходилось наблюдать, как сценарии для командного процессора при неправильных допущениях относительно вычислительной среды и операционной системы в лучшем случае работали некорректно, а в худшем - внезапно выполняли разрушительные действия на системах. Чтобы читатели могли избежать подобных проблем, я подготовил 10 советов для создания более надежных сценариев, которые могут работать во многих вычислительных средах.

По возможности используйте переменные среды

Используя переменную в сценарии, мы заключаем имя переменной между знаками процента (%), а когда сценарий исполняется, знаки процента и текст между ними заменяется значением этой переменной. Применение переменных делает код сценария более универсальным, поэтому у него больше шансов успешно работать на разных компьютерах. Например, в сценарии для командного процессора не стоит жестко прописывать установочный каталог Windows. Вместо этого следует использовать переменную SystemRoot, которая всегда будет указывать на конкретный установочный каталог Windows. Так, команда

Echo %SystemRoot%

будет отображать содержимое SystemRoot (т. е. установочного каталога Windows). Я неоднократно видел сценарии, в которых для того, чтобы указать на установочный каталог Windows, использовали запись C:WINDOWS. Если Windows установлена не в C:WINDOWS (например, Windows 2000 и более ранние версии устанавливаются в WINNT), сценарий не будет работать корректно. Чтобы увидеть список переменных среды, следует ввести в командной строке команду Set. Некоторые переменные не появляются в списке, генерируемом командой Set, потому что они динамически генерируются Cmd.exe. В табл. 1 показан список этих переменных. Как и в случае с другими переменными среды, эти переменные заключаются в знаки процента. Например, следующая строка сценария будет отображать текущие время и дату:

Echo %DATE% %TIME%

Не следует ожидать, что обычные пакетные файлы для Command.com будут так же хорошо работать в Cmd.exe

Те, кто привык писать пакетные файлы для платформ MS-DOS или Windows 9x/Me, должны иметь в виду, что в новейших версиях Windows некоторых команд не существует. Два самых распространенных примера - команды Choice и Deltree. Просмотрите свои старые пакетные файлы, чтобы убедиться, что они корректно работают в оболочке Cmd.exe. В табл. 2 приведено несколько возможных замен для Choice и Deltree. Большинство замен имеют синтаксис, отличный от синтаксиса команд, на место которых они предлагаются, поэтому придется соответствующим образом изменить сценарии.

В оболочке Cmd.exe используйте расширение.cmd

Пакетным файлам Command.com необходимо расширение.bat. Оболочка Cmd.exe тоже может использовать расширение.bat, но в более мощном языке макропрограммирования Cmd.exe многие команды несовместимы с Command.com. Таким образом, .bat файл, написанный для Cmd.exe, может сбоить, если пользователь попытается исполнить его в Command.com (например, в Windows 98). Один из способов избежать этой проблемы состоит в использовании расширения.cmd для сценариев. Поскольку Command.com не распознает расширение.cmd, он просто не будет исполнять пакетный файл, если его имя оканчивается на.cmd.

Убедитесь в том, что нужные исполняемые файлы доступны

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

«% ~dp0exename» ...

где exename - это имя исполняемого модуля, который требуется запустить. Синтаксис %~dp0 возвращает диск, путь и имя файла текущего сценария без кавычек. Заключение всей строки в кавычки гарантирует работоспособность сценария, даже если имя файла или каталога, в котором находится сценарий, содержат кавычки.

Правильно используйте двойные кавычки

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

dir C:Program Files

на самом деле дает команде Dir два аргумента: C:Program и Files. Чтобы воплотить свое намерение передать команде один аргумент C:Program Files (включая пробел), мы должны заключить его в двойные кавычки:

dir «C:Program Files»

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

Сценарии для командного процессора также поддерживают параметры командной строки. Чтобы воспользоваться параметрами командной строки сценария, нужно задействовать запись %n (где n - число от 0 до 9). Эта запись называется заменяющим параметром (или просто параметром). Например, сценарий будет заменять параметр %1 первым аргументом командной строки, %2 - вторым аргументом и т. д. Помимо параметров от %1 до %9, %0 заменяется именем сценария, %* заменяется целой командной строкой сценария (исключая имя сценария). Я упоминаю здесь параметры командной строки потому, что, когда Cmd.exe заменяет параметры от %1 до %9 соответствующими аргументами командной строки, он оставляет двойные кавычки, если они есть в аргументе. Напрашивается очевидный вывод: параметр сценария всегда будет заключен в кавычки, если он содержит пробелы. На этом наблюдении основано несколько простых правил, аккуратно следуя которым можно практически полностью устранить проблемы кавычек.

  • Не используйте кавычки внутри параметров сценария (от %1 до %9), поскольку они уже могут содержать кавычки. Если необходимо задействовать параметр с командой If, используйте символы, отличные от кавычек (например, фигурные скобки), чтобы избежать синтаксической ошибки. Следующая строка будет работать правильно, даже если первый параметр (%1) содержит кавычки:

If {%1}=={} Goto:HELP

Исключение из этого правила составляет случай, когда мы используем синтаксис %~n, чтобы удалить кавычки параметра (см. следующее правило).

  • Не помещайте кавычки внутрь переменной среды. Наличие пробелов в переменных среды допускается, и кавычки при этом не нужны. Если нужно скопировать параметр в переменную, используйте синтаксис %~n (где n - число от 1 до 9), который возвращает параметр без кавычек. Например, строка

    Set DATAFILE=% ~1
    будет копировать первый параметр сценария (без кавычек) в переменную DATAFILE. Исключение составляет случай, когда вы создаете текст в кавычках, который будет передан в другую команду.

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

    Set TARGET=% ~2
    Copy %1 «%TARGET%»

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

Применяйте команды Setlocal и Endlocal

Команда Setlocal копирует все переменные среды, а команда Endlocal восстанавливает все переменные со значениями, которые они имели перед запуском сценария. Endlocal также удаляет любые переменные, созданные сценарием. Использование обеих команд делает сценарий более самостоятельным и гарантирует, что сценарий «убирает за собой мусор» путем восстановления переменных среды в их оригинальные значения и удаления переменных, созданных сценарием.

Также можно использовать команду Setlocal Enableextensions, чтобы точно знать, что расширения команд включены. Расширения команд - это усовершенствования для группы внутренних команд Cmd.exe (например, If, For, Call), которые предоставляют дополнительные возможности по сравнению с командами Command.com, имеющими такие же имена. Расширения команд включены по умолчанию, но в тех редких случаях, когда они отключены, команда Setlocal Enableextensions гарантирует включение расширений команд. Чтобы получить более подробную информацию о расширениях команд, следует ввести в командной строке Cmd /?.

Используйте при необходимости символ Escape

Cmd.exe использует символ каретки (^) как признак отмены специального значения зарезервированных символов командной оболочки. Например, амперсанд (&) является разделителем команд - он позволяет поместить несколько команд в одной строке. Если вы намерены использовать амперсанд в обычном, литературном смысле, то должны «аннулировать» его специальное значение, поместив перед ним символ каретки ^. Так, в строке

Echo The ^& character is
the command separator

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

Не используйте команду Exit без ключа /b

Без ключа /b команда Exit закрывает текущую командную оболочку. Если кто-то запускает Cmd.exe и исполняет сценарий, который содержит команду Exit, текущая сессия командного процессора резко закроется. Команда Exit /b закрывает текущий сценарий, не закрывая текущую сессию командного процессора. Чтобы больше узнать о команде Exit, наберите в командной строке Exit /?.

Используйте команду If Errorlevel с осторожностью

Команда If Errorlevel проверяет код завершения последней команды, исполнение которой окончено. Поведение сценария зависит от результата проверки кода завершения программы. Рассмотрите, например, следующий сценарий:

Myprogram
If Errorlevel 1 Goto:ERROR

Команда Goto в этих строках будет выполнена, только если Myprogram.exe возвращает код завершения больше или равный 1. Другими словами, «If Errorlevel n» не означает «если последний код завершения программы в точности равен n»; на самом деле это условие означает «если последний код завершения программы не меньше n». Учитывая такое поведение, следует проверять код завершения программы в порядке убывания (от самого большого к самому маленькому). Чтобы проверить конкретное значение кода завершения программы, используйте динамическую переменную ERRORLEVEL вместо команды If Errorlevel. Нужно иметь в виду, что команда If Errorlevel отличается от переменной ERRORLEVEL, стоящей в списке в табл. 1. Команда If Errorlevel обратно совместима с командой If Errorlevel из Command.com; переменная ERRORLEVEL доступна только в Cmd.exe.

Учитывайте особенности команды Start

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

Start «C:Program FilesMicrosoft
OfficeOffice11Winword.exe»

не запускает Microsoft Word вопреки ожиданию. Вместо этого команда Start откроет новую сессию Cmd.exe, заголовком окна консоли которой будет заключенная в кавычки строка. Такое поведение объясняется тем, что команда Start использует первую строку в кавычках в ее командной строке как заголовок окна консоли.

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

Start «» «C:Program FilesMicrosoft
OfficeOffice11Winword.exe»

Всего не предусмотришь

Сценарии командного процессора Cmd.exe применяются весьма широко. Освоив приведенные в этой статье рекомендации, вы сможете создавать более надежные сценарии и избегать распространенных проблем.

Можно выполнить сценарий из командной строки с помощью консольной версии WSH cscript.exe. Например, чтобы запустить сценарий, записанный в файле C:\Script\First.js, нужно загрузить командное окно и выполнить в нем команду

cscript C:\Script\First.js

В результате выполнения этого сценария в командное окно выведется строка "Привет!"(рис. 4.1 )

увеличить изображение Рис. 4.1. Результат выполнения First.js в консольном режиме (cscript.exe)

Запуск сценария из командной строки в графическом режиме

Сценарий можно выполнить из командной строки с помощью (оконной) графической версии WSH wscript.exe. Для нашего примера в этом случае нужно выполнить команду

wscript C:\Script\First.js

Тогда в результате выполнения сценария на экране появится нужное нам диалоговое окно (рис. 4.2 ).

увеличить изображение Рис. 4.2. Результат выполнения First.js в графическом режиме (wscript.exe)

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

Запуск сценария с помощью меню Пуск

Для запуска сценария с помощью пункта Выполнить (Run) меню Пуск (Start), достаточно написать полное имя этого сценария в поле Открыть (Open) и нажать кнопку Ok. В этом случае по умолчанию сценарий будет выполнен с помощью wscript.exe, т. е. вывод информации будет вестись в графическое диалоговое окно.

Запуск сценария с помощью Проводника Windows (Windows Explorer)

Самым простым является запуск сценария в окнах Проводника Windows или на рабочем столе - достаточно просто выполнить двойной щелчок мышью на имени файла со сценарием или на его значке (аналогично любому другому исполняемому файлу). При этом, как и в случае запуска с помощью меню Пуск (Start), сценарий по умолчанию выполняется с помощью wscript.exe.

Установка и изменение свойств сценариев

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

Если сценарий запускается в консольном режиме, то его исполнение контролируется с помощью параметров командной строки для cscript.exe (см. табл. 4.1 ), которые включают или отключают различные опции WSH (все эти параметры начинаются с символов "//").

Таблица 4.1. Параметры командной строки для cscript.exe

Параметр Описание

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

Включает пакетный режим. При этом на экран не будут выводиться никакие сообщения

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

Выводит (по умолчанию) перед выполнением сценария информацию о версии и разработчике WSH

Подавляет вывод информации о версии и разработчике WSH

//H:CScipt или //H:Wscript

Делает cscript.exe или wscript.exe приложением для запуска сценариев по умолчанию. Если эти параметры не указаны, то по умолчанию подразумевается wscript.exe

Сохраняет установки командной строки для текущего пользователя

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

Выполняет сценарий с помощью модуля, заданного параметром engine

Включает отладчик

Выполняет программу в отладчике

//Job:

Запускает задание с индексом JobID из многозадачного WS-файла (структура WS-файлов будет описана ниже)

Позволяет использовать при перенаправлении ввода-вывода с консоли кодировку Unicode

Например, команда

cscript //Nologo C:\Script\First.js

запустит сценарий First.js без информации о версии WSH.

Сценарий можно запускать с параметрами командной строки, которые указываются после имени этого сценария (процедура обработки таких параметров будет описана ниже, при рассмотрении объектов WshArguments,WshNamedиWshUnnamed). Например, команда

cscript //B C:\Script\First.js /a /b

запустит сценарий First.js в пакетном режиме, при этом /aи/bбудут являться параметрами этого сценария, а//B- параметром приложения cscript.exe.

Если сценарий запускается в графическом режиме (с помощью wscript.exe), то свойства сценария можно устанавливать с помощью вкладки Сценарий (Script) диалогового окна, задающего свойства файла в Windows (рис. 4.3 ).

Рис. 4.3. Установка свойств сценария First.js

После задания свойств сценария автоматически создается файл с именем этого сценария и расширением wsh, который имеет структуру наподобие ini-файла, например:

Path=C:\Script\First.js

Если дважды щелкнуть в Проводнике Windows по wsh-файлу или запустить такой файл из командной строки, то соответствующий сервер сценариев (wscript.exe или cscript.exe) запустит сценарий, которому соответствует wsh-файл, с заданными в секции Options параметрами.

При запуске сценариев с помощью wscript.exe для задания параметров командной строки сценария можно использовать технологию drag-and-drop - если выделить в Проводнике Windows несколько файлов и перетащить их на ярлык сценария, то этот сценарий запустится, а имена выделенных файлов передадутся ему в качестве параметров.

Категория ~ Технические советы – Игорь (Администратор)

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

Редактор локальной групповой политики Windows

Хитрость заключается в том, чтобы использовать системный инструмент Windows под названием "Редактор локальной групповой политики" (GPE). К сожалению, Microsoft исключила GPE из всех Home версий, так что этот метод применим только к таким версиям, как Professional и Enterprise. Метод подходит для Windows XP и выше. Возможно вы уже знакомы с GPE, так как данный инструмент представляет множество удобных функций. Тем не менее, даже в таком случае, о возможности запуска сценариев и программ знают немногие.

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

GPE является одним из системных модулей Windows, известных под названием консоль управления Microsoft или оснастка. Хоть, некоторые из них можно запустить из панели управления Windows, найти их в списках программ нельзя. Учтите, что для запуска оснасток потребуются права администратора.

Запуск сценария или программы при завершении работы Windows


Запуск сценария или программы при выходе пользователя из системы Windows

Если вам необходимо запускать программу или сценарий только при выходе пользователя из системы, то в оснастке GPE необходимо использовать другой пункт. Сама инструкция остается точно такой же. Единственно, вам необходимо на шаге 3 раскрыть вместо вкладки "Конфигурация компьютера" вкладку "Конфигурация пользователя". И на шаге 4 дважды щелкнуть на пункте "Выход из системы" вместо "Завершение работы"

Примечание : Данная статья в большей степени предназначена для опытных пользователей. Дополнительные сведения об использовании и планировании через GPE можно найти на сайте Microsoft по этой ссылке .

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