Главная страницаОбратная связьКарта сайта

Автоматизация действий с помощью Windows Script Host

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

WSH или Windows Script Host — это сценарии команд, написанные на JScript, VBScript или других скриптовых языках (Active Perl, Python), позволяющие автоматизировать какие-то действия на компьютере. Что касается возможностей новой технологии, то они примерно также превосходят bat-файлы, как Windows превосходит MS-DOS.

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

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

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

Параметры запуска сценариевФайлы скриптов WSH могут обрабатываться двумя утилитами серверов сценариев: cscript.exe (консольный вариант) и wscript.exe (GUI-вариант). Чтобы запустить написанный скрипт, можно просто дважды щелкнуть левой кнопкой мыши по нему в окне Проводника. При этом сценарий запустится с настройками по умолчанию. Чтобы сценарий работал с другими параметрами, нужно в командной строке указать имя сервера сценариев, имя самого сценария и параметры запуска. Синтаксис команды выглядит следующим образом:

CScript имя_сценария. расширение   [параметры. . . ]   [аргументы... ] Полный список параметров для сервера сценариев следующий:

□  //в — пакетный режим, подавляется отображение ошибок и запросов
сценария;

П //d — включение режима Active Debugging;

□   //к-.ядро — использование указанного ядра для выполнения сценария;
П //H:Cscript — стандартный сервер сценариев заменяется на cscript.exe;

□     //H:Wscript— стандартный сервер сценариев заменяется на wscript.exe (используется по умолчанию);

□     //I — диалоговый режим (по умолчанию, в противоположность //в);

□     //job:xxxx— выполнение указанного задания WSF;

□     //Logo — отображение сведений о программе (по умолчанию);

□     //Noiogo— запрет отображения сведений о программе во время выполнения;

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

О //т = лл — интервал ожидания (в секундах):   максимальное время выполнения сценария;

О //х — выполнение сценария в отладчике;

□  //и —   использование   кодировки   Unicode   при   перенаправлении   вво­
да/вывода с консоли.

Аргументы передаются непосредственно в сценарий (аналогично bat-файлам).
Рис. 6.1. Вкладка Сценарий свойств vbs-файла



Однако такой вариант запуска изменит параметры по умолчанию для всех запускаемых впоследствии сценариев. Если в этом нет необходимости, существует возможность задать свои параметры для каждого отдельного файла сценария, более того, можно задать несколько вариантоа запуска одного и того же сценария. Для этих целей служит файл с расширением wsh. Он представляет собой обычный текстовый файл и по своей структуре очень похож на inf- или ini-файл. Чтобы создать простейший wsh-файл, откройте свойства любого скрипта и на вкладке Сценарий измените любой параметр (рис. 6.1). После нажатия кнопки ОК в том же каталоге появится файл с аналогичным именем и расширением wsh. Вот пример одного из таких файлов: [ScriptFile] Path=G:\files\file.js [Options] TimeoutsО D i sp1ayLogo=1
В секции [ScriptPile] есть только один параметр — Path, который указывает на запускаемый скрипт, а в секции [Options] перечисляются параметры для запуска этого скрипта.

Если теперь запустить созданный нами файл, он будет выполняться с настроенными параметрами.

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

На этом небольшую теоретическую часть хотелось бы закончить и перейти непосредственно к практике.

Работа с реестром

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

Создайте файл с произвольным названием и расширением js (на диске это файл wsh_sample_reg.js) — листинг 6.1.

// Пример работы с реестром на JScript

// Чеботарев И.

// http://www.whatis.ru

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

var WSHShell = WScript.createObject(WScript.Shell);

// Выводим информационное сообщение WSHShell.Popup(Создаем раздел);

// Создаем раздел в реестре

WSHShel1.RegWri te(■HKCU\\MyRegKey\\,   Primer);

// Создаем строковый параметр

WSHShell.Popup(Создаем строковый параметр);

WSHShell.RegWrite(HKCU\NMyRegKey\\String,   1);

// Создаем DWORD-параметр

WSHShell.Popup(Создаем параметр DWORD);

WSHShell,RegWrite(HKCU\\MyRegKey\\mORD,   2,   REG_DWORD)j
// Создаем двоичный параметр WSHShell.Popup(Co3flaeM двоичный параметр) ,-WSHShell.RegWrite(HKCU\\MyRegKey\\Binary,   3,   REG_BINARY) ;

if Удаляем параметры

ЮЗНБпеИ.РорирГУдаляем асе параметры); WSHShell.RegDeleterHKCU\\MyRegKey\\String ),-WSHShell.RegDeleteГ™cu\\MyRegKey\\DWOKD,,) ,-WSHShell.RegDelete(HKCU\\MyRegKey\\Binary) ,-

// Удаляем раздел

WSHShell.Popup{Удаляем раздел);

WSHShell.RegDelete(HKCU\\MyRegKey\\) ;

Пример достаточно подробно прокомментирован, поэтому дальнейшие пояснения излишни. В девятой строке выводится сообщение о создании нового раздела (рис. 6.2). После нажатия кнопки ОК в появившемся окне в реестре будет создан новый раздел. Перед каждым действием будет появляться сообщение о том, что сейчас будет сделано. В нормальном рабочем скрипте такие сообщения, конечно, не нужны. Здесь они добавлены просто для того, чтобы вы могли отследить изменения в реестре (для обновления информации в редакторе реестра нажимайте клавишу <F5> после каждого изменения). Последние строчки удаляют наши параметры и раздел, чтобы не забивать реестр разным мусором.

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




Рис. 6.2. Пример информационного сообщения

Если вы обратили внимание, то корневой раздел hkey_current_user в скрипте обозначается как нкси. Здесь возможны сокращенные названия корневых разделов. hkey_localjiachike можно писать как нкш, hkey_ciasses_root — hkcr. Остальные разделы не имеют короткого имени.
Теперь создадим аналогичный сценарий на VBScript (wsh_sample_reg.vbs) — листинг 6,2.

I Листинг 6.2, Пример работы с реестром (VBScript)

Пример работы с реестром на VBScript

Чеботарев И.

1 http://www.whatia.ru

set WSHShell = WScript.CreateObject(WScript.Shell)

WSHShell.Popup Создаем раздел

WSHShell.RegWrite NHKCU\MyRegKey\, Primer

WSHShell.Popup Создаем строковый параметр

WSHShell.RegWrite HKCU\MyRegKey\string, 1

WSHShell.Popup Создаем параметр DWORD

WSHShell.RegWrite HKCU\MyRegKey\DWORD, 2, REGLDWORD

WSHShell.Popup Создаем двоичный параметр

WSHShell.RegWrite HKCU\MyRegKeyNBinary, 3, REG.BINARY

WSHShell.Popup Удаляем все параметры WSHShell.RegDelete HKCU\MyRegKey\String WSHShell.RegDelete HKCU\MyRegKey\DWORD WSHShell.RegDelete HKCU\MyRegKey\Binary

WSHShell.Popup Удаляем раздел WSHShell.RegDelete HKCUYMyRegKeyX

Как видите, отличия весьма незначительные (по другому задается комментарий, отсутствует ; в конце строки, нет круглых скобок при задании параметров, ключевое слово var заменено на set). Подробно его разбирать, думаем, смысла нет — все, что справедливо для первого примера, справедливо и для второго.

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

Казалось бы, что в таком простом деле, как запуск программ, не может быть никаких особенностей. Тем не менее и в этом вопросе Windows Script Host оставляет bat-файлы далеко позади. Но давайте рассмотрим все на одном очень простом примере (на диске файл wsh_run_prg.js) — листинг 6.3.

| Листинг 6.3. Запуск программ (JScript)

var WSHShell = WScript.CreateObject(WScript.Shell); WSHShell.Run(notepad,5);

Основной интерес представляет последняя строка, где с помощью метода Run объекта WSHShell происходит запуск Блокнота. Метод Run имеет два параметра: первый — запускаемое приложение, второй — состояние окна запускаемой программы. Так как файл Блокнота находится в каталоге Windows, приводить полный путь и расширение не обязательно. В противном случае необходимо указывать полное имя запускаемого файла.

Остановимся подробнее на втором параметре. Он может принимать числовые значения от 0 до 9, задавая различные состояния окна запускаемого приложения. Перечислим здесь наиболее интересные и часто используемые (остальные являются их вариантами):

По — запускать программу в скрытом окне. То есть если вы попытаетесь запустить Блокнот с таким значением второй переменной, то окно программы будет невидимым и кнопка на панели задач не будет создана. Чтобы убедиться, что Блокнот все-таки запустился, вызовите Диспетчер задач и найдите его в списке процессов;

П 2 — запустить программу с минимизированным окном;

□  з — запустить программу с окном, развернутым во весь экран;

П 5 — запустить программу с текущим размером и позицией окна (стандартный режим, соответствующий тому, как если бы вы просто запустили программу из Проводника);

□  б — запустить программу с минимизированным окном. При этом актив­
ным будет следующее окно в Z-последовательности.

Довольно любопытен первый параметр со значением о. Если вам надо запустить какую-то программу в невидимом режиме, воспользуйтесь этим параметром. Создадим сценарий для невидимого запуска Блокнота на VBScript (листинг 6.4) и посмотрим на поведение программы в Windows (на диске вы найдете файл wsh_invisible_prg.vbs).

Листинг 6.4. Запуск программы в невидимом режиме (VBScript)

Запуск программы в невидимом режиме на VBScript


set WSHShell = WScript.CreateObject!WScript.Shell) WSHShell.Run notepad,   0

На рис. 6.3 вы можете видеть, что процесс notepad.exe запущен в системе, однако кнопки приложения на панели задач нет.
Рис. 6.3. Работа Блокнота в невидимом режиме

Создание ярлыков

Одной из возможностей Windows Script Host является создание ярлыков. Причем не только ярлыков на программы, но и на страницы в Интернете. Давайте попробуем создать ярлык для программы и на примере разберем возможности WHS в этой области (листинг 6.5). На диске вы найдете файл wsh_create_shortcut.js с данным примером.

р.....,,....,........,,» „.,„„„. ,^,.- ,...... ...,.,......,..„,„™,„,„..... c.«.,,-rw......... ,....... .■.... v............... м...... ~~;

| Листинг 6.5. Создание ярлыка на программу (JScrlpt)

var WSHShell = WScript.GreateObjееt(WScript.Shell);

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

var vbOKCancel = 1;

var vblnformation = 64;

var vbCancel = 2;

var Message = Вы действительно хотите создать ярлык на рабочем столе?;

var Title  = Подтвердите действие;

// Вызов функции запроса

Welcome О;

// Узнаем путь к рабочему столу

var DesktopPath = WSHShell.SpecialFolders(Desktop);

// Создаем ярлык

var MyShortcut = WSHShell.CreateShortcut(DesktopPath + \\Блокнот.1пк);

// Задаем свойства для ярлыка:

// Запускаемый файл

MyShortcut.TargetPath =

WSHShell.ExpandEnviranmentStrings(%windir%\\notepad.exe);

// Каталог запускаемого файла

MyShortcut.WorkingDirectory =

WSHShell,ExpandEnvironmentStrings(%windir%)г

// Клавиши для быстрого вызова программы

MyShortcut.HotKey в (CTRL+ALT+N);

// Тип окна запускаемого файла

MyShortcut.WindowStyle = 4,-

//  Значок, используемый для ярлыка

MyShortcut,IconLocation =

WSHShell.ExpandEnvironmentStringst%windir%\\notepad.exe, 0);

// Сохраняем изменения свойств ярлыка

MyShortcut.Save();

// Докладываем, что все готово

WScript.Echo(Ярлык для Блокнота создан на Вашем рабочем столе!;

function Welcome() [ var intDoIt;

intDoIt = WSHShell.Popup(Message,

0,

Title, vbOKCancel + vblnformation );

if (intDoIt мв vbCancel) {

// Если нажали кнопку Отмена, прерываем выполнение программы

WScript.Quit(); )


Код довольно подробно прокомментирован, но на некоторых моментах стоит заострить внимание. В начале сценария описываются переменные для диалогового окна (рис. 6,4), которое вызывается в функции welcome о сразу после этих переменных. Сама функция находится в конце сценария. Комбинация кнопок в окне диалога и значок сообщения задаются с помощью суммы двух чисел: первое число — комбинация кнопок, второе — значок сообщения.



Рис. 6.5. Значок,                            Рис. в.б. Значок,                            Рис. 6,7. Значок,

соответствующий числу 16      соответствующий числу 32      соответствующий числу 48

Соответствие комбинаций кнопок диалогового окна числовому значению:

□     0 - ОК;

□     1 — ОК и Отмена;

П 2 — Прервать, Повтор, Пропустить;

□     3 — Да, Нет, Отмена;

□     4 — Да, Нет;

□     5 — Повтор, Отмена;

□     6 — Отмена, Повторить, Продолжить.

При нажатии одной из кнопок диалоговое окно закрывается, а в сценарий возвращается числовое значение выбранной кнопки:
a 1 - OK;

□     2 — Отмена;

□     3 — Прервать; П 4 — Повтор;

□     5 — Пропустить;

□     6-Да;

□     7 - Нет;

П  10 — Повторить; П11— Продолжить. В строке

var DesktopPath ■ WSHShell.SpeciaiFoiders(Desktop);

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

□I Favorites — Избранное;

□   Fonts — Шрифты;

П MyDocuments — Мои документы;

П NetHood — Сетевое окружение;

О PrintHood — Принтеры;

П programs — подменю Программы из меню Пуск;

О Recent — подменю Документы из меню Пуск;

□     sendTo — подменю Отправить из контекстного меню файлов;

□     startMenu — главное меню;

П startup — группа Автозагрузка из подменю Программы; П Templates — Шаблоны.

ЕСТЬ еще НесКОЛЬКО папок: AllUsersDesktop, AllUsersStartMenu, AllUsers-Programs, AllUsersStartup, НО ОНИ присутствуют только в Windows NT/2000/XP.

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

Средствами WSH можно не только создавать новые ярлыки, но и редактировать параметры существующих. Для этого в параметре TargetPath просто
укажите его полное имя и задайте свойства, какие вы хотите изменить. В этом случае перечислять их все, как в примере создания нового ярлыка, не обязательно.

Теперь от ярлыков на файлы перейдем к ярлыкам на адреса в Интернете (листинг 6.6). Ярлыки для адресов в Интернете создаются практически так же. Только надо учесть, что у них поменьше свойств, а точнее — только одно (wsh_create_url_sh.ortcut.js).

I Листинг 6.6. Создание файла ярлыка на интернет-адрес (JScript)

;........................................................................................................................................................................................................ ■■■........................................................................................................................................ ................................... .-............................................. ■■■.................................. ~J.......... Л

I/  Создание файла ярлыка на адрес в Интернете. JScript

// Чеботарев И.

(I  http://www.whatis.ru

var WSHShell = WScript.CreateObject(WScript.Shell);

// Узнаем путь к Избранному

var PavoritesPath = WSHShell.SpecialFolders(Favorites);

// Создаем ярлык

var MyShortcut = WSHShell.CreateShortcut(FavoritesPath + \\Ежедневные

компьютерные новости.URL)г

// Задаем свойства для ярлыка

MyShortcut.TargetPath =

WSHShell.ExpandEnviroranentStrings(http://news.whatis.ru);

MyShortcut.Save();

Указав в скрипте расширение url для ярлыка, мы даем понять, что нас интересует некий адрес в Интернете, а не файл. Ну и конечно, ярлык создаем в папке Избранное — наиболее логичном месте для него.

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

К объектам файловой системы относятся как файлы и каталоги, так и все логические диски, приводы CD-ROM, дисководы.

Как обычно, приведем небольшой пример (листинг 6.7) и на его основе разберем принципы работы с дисками (файл wsh_drives.vbs на компакт-диске).
  Получаем объект файловой системы

Set fso - WScript.CreateObject(Scripting.FileSystemObject)

Set WSHShell в WScript.CreateObjectCWScript.Shell)

str = 

Перебираем все диски (логические, CD-ROM, дисководы) For each i In fao.Drives

Отбираем только логические диски If i.DriveType=2 Then

1 Получаем букву диска

<±rive=i.DriveLetter

Узнаем свободное место и переводим его в мегабайты

1 с точностью до 1 знака после запятой

free = FormatNumber(i.FreeSpace/l048576, 1)

1 Получаем полный объем диска

total = FormatNumber(i.TotalSize/1048576, l)

Узнаем файловую систему

fs = i.FileSystem
JScript)

+ total + Мб , свободно

- + fs + СНЯ(Ю)


Формируем строку для вывода на экран 1 CHR(IO) — переход на новую строку (\п в str = str + Диск + drive + , размер str ■ str + free + Мб , файловая система End If

Next

Выводим на экран сформированную строку

WSHShell.Popup(str)

Пример результата работы скрипта можно увидеть на рис. 6.8.




Рис. 6.8. Результат работы скрипта

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

If  i.DriveType=2 Then

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

Другие значения, которые может принимать это свойство:

□   о — тип не может быть определен;

О 1 — сменный носитель или дисковод для гибких дисков;

□     2 — обычный HDD;

□     з — сетевой диск;

□     4 - CD-ROM;

□     5 — виртуальный RAM-диск.

Можно явно указать диск, с которым вы хотите работать. Для этого используется метод GetDrive:

Set fso = WScript.CreateObject(Scripting.FileSystemObject) Set Drive = fso.GetDrive(c)

Приведем другие свойства и методы, которые можно использовать при работе с дисками в WSH:

□   isReady — если диск готов к использованию, возвращает true, в против­
ном случае — false;

П RootFoider — возвращает путь к корневому каталогу;

□     seriaiNumber — возвращает серийный номер диска;

□     shareName — возвращает сетевое имя диска;

□     volumeName — возвращает либо устанавливает метку диска;

П DriveExists —   проверяет   на   наличие   заданного   диска:   fso.Drive-Exists! с).

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

Для примера давайте создадим на диске С: папку TEST, а в ней файл test.txt (листинг 6.8). Тот, кто не хочет вручную набирать текст примера, найдет на диске файл wsh_create_folder_and_fi]e.js.
 Листинг 6.8. Создание папки и файла на JScript

// Создание папки и файла.   JScript

// ЧеБотарев И.

// http://www.whatis.ra

// Создаем объект файловой системы   (обратите внимание

// на отличие от VBScript)

var fso = new ActiveXObject(Scripting.FileSystemObject);

//Проверяем,  есть ли такая папка if   [fso.FolderExi5t5(C:\\TEST))

WScript.Echo(Такая папка уже существует}; else //Если кет - создаем

var Folder = fso.CreateFolder(С:WTEST); //Проверяем,  есть ли уже такой файл if   (fso.FileExists (С: \\TESTUtest.txt))

WScript.Echo(Такой файл уже существует); else //Если нет,   то создаем его

var File = fso.CreateTextFile(C:\\TEST\\test.txt,   true);

Комментарии наглядно демонстрируют работу скрипта. Давайте только подробнее остановимся на создании файла (последняя строка). Вторым параметром передается значение true. Этот параметр является необязательным и указывает, перезаписывать ли файл с таким именем. Здесь же может передаваться и третий параметр. Если он отсутствует или равен false, то файл будет создан в кодировке ASCII. Если параметр равен true — в Unicode.

В примере мы не просто сформировали папку и файл, но и создали объекты этой папки и файла (Folder и File соответственно). Если надо создать, а затем работать с объектом для уже существующей папки/файла, используйте

метод GetFolder/GetFile:

var File  =  fso.GetFilef С: UTESTWtest. txt) ;

К этим объектам применимы различные методы, позволяющие копировать, переименовывать, удалять файлы, получать о них различные сведения, устанавливать атрибуты. Для копирования, перемещения и удаления файлов и Папок Применяются методы Copy, Move И Delete. При ЭТОМ В Сору И Move В качестве параметра передается имя файла, в который надо скопировать/перенести исходный. Метод Delete не имеет параметров. Так, чтобы скопировать созданный нами файл в test.tmp, надо добавить в конце сценария строку

File.Copy(C:\\TEST\\test.tmp);
Свойства объектов Folder и File позволяют получить различные сведения об объектах файловой системы:

П size — возвращает размер файла/каталога;

П DateCreated — время создания;

□  DateLastAccessed — время последнего обращения к объекту;
О DateLastModified — время последнего изменения;

О Name — имя файла/каталога, на который ссылается объект.

□     shortName — короткое имя (в формате MS-DOS). Длинные имена будут урезаны до формата 8.3;

□     path — возвращает обычный путь к файлу (папке);

□     shortpath — короткий путь (с тильдой -);

D parentFoider — возвращает имя родительского каталога;

D туре — возвращается тип файла.

Например:

WScript.Echo[File.Path);

Еще одно полезное свойство объектов — Attributes — позволяет получать и устанавливать атрибуты файлам и каталогам (например Скрытый, Системный и т. п.). Значением атрибута является число.
Если вам надо установить несколько свойств файлу, значения следует складывать. Например, чтобы установить для файла атрибуты Только для чтения, Скрытый и Системный, необходимо передать значение 1+2 + 4 = 7: Filel.Attributes = 7;

Все прекрасно, пока вам надо работать с одним файлом или папкой. Если стоит задача обработать все файлы в одном из каталогов или несколько каталогов, то стоит воспользоваться коллекцией файлов/каталогов.

Список каталогов хранится в коллекции Folders, получить которую можно с помощью свойства SubFoldera объекта Folder. Folders имеет свойство count и методы item и Add. Рассмотрим на простом примере работу с коллекцией каталогов (листинг 6.9).

! Листинг 6.9. Работе с коллекцией каталогов. JScript

// Работа с коллекцией каталогов.  JScript

// Чеботарев И.

// http://www.whatis.ru

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

var  fso,   f,   f с,   fcl,   s;

// Получаем объект файловой системы

fso = new ActiveXDbjectCScripting.FileSystemObject);

// Получаем корневой каталог диска С Е = fso.GetFolderCC:);

// Создаем коллекцию каталогов, находящихся в корневом каталоге fc = new Enumerator(f.SubFolders);

fcl = f.SubFolders; s = в Л i

// Перебираем в цикле асе элементы коллекщи  до тех пор,

// пока не дойдем до конца

£or   (;   Jfc.atEndO;   fc.moveNext[))

(

// Формируем строку из имен каталогов для вывода на экран s += Ec.itemt); s += \n;

}

// Вычисляем количество каталогов s = s + Всего папок: + fcl.Count; WScript.Echo(s);

Аналогичный пример на VBScript (листинг 6.10).
\ Листинг 6.10. Работа с коллекцией каталогов, VBScript

1  Перечисление всех дисков в системе.  VBScript

1  Чеботарев И.

http://www.whatis.ru

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

Dim fso, f, fl, fc, s

Получаем объект файловой системы

Set fso = CreateObjectCScripting.FileSystenObject)

Получаем корневой каталог диска С Set £ = fso.GetFolderCC:)

1 Создаем коллекцию каталогов, находящихся в корневом каталоге Set fc = f.SubFolders

1 Перебираем в цикле все элементы коллекции For Each fl in fc

Формируем строку из имен каталогов для вывода на экран

s = s & fl.name

s = s & CHR(IO) Next

Вычисляем количество каталогов s = s & Всего папок: &  fc.Count WScript.Echo s

Как видите, работа в VBScript и JScript несколько различается. Для операций с коллекциями в последнем присутствует объект Enumerator, Остальные изменения незначительны и легко видны из листингов сценариев. Эти файлы с именами wsh_folders.js и wsli_folders,vbs соответственно вы также сможете найти на компакт-диске.

Для создания нового каталога можно использовать метод Add, передав ему в качестве параметра имя каталога, который вы хотите создать:

fcl.Add(NewFolder);   // для JScript
fcAdd   NewFolder                    для VBScript

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

j Листинг 6.11. Работа с коллекцией файлов. JScript

// Работа с коллекцией файлов.   JScript

If Чеботарев И.

// http://www.whatia.ru
var  fso,   f,   fl,   fc,   s;

fso = new ActiveXObjectCScripting.FileSystemObject) ,-

f =  fso.GetFolder(Cr};

fc = new Enumerator(f.files);

s =  ;

for   (;   !fс.atEnd[);   fc.nraveNext ( M

<        |

s  +=  fc.item();

s += \n; } WScript.Echo(s);

He станем его комментировать из-за практически полной его идентичности. Думаем, на VBScript вы сможете написать аналогичный сценарий без проблем.
Чтение и редактирование файлов

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

Так как файлы у нас относятся к объектам файловой системы, то нам надо в первую очередь инициализировать этот самый объект, а затем воспользоваться одним из его методов для открытия файла:

//JScript

var fso ■ new ActiveXObject (Scripting.FileSystemObject);

var file = fso.QpenTextFilelC:\Stest.txt, 2, true);

//VBScript

Set fso ■ CreateObject(Scripting.FileSystemObject)

Set file = fso.OpenTextFile(C:\test.txt, 2, true)

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

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

□     2 — файл открывается для записи. Причем, все содержимое файла, которое было до этого, уничтожится;

□     8 — файл открывается для добавления данных. Все, что вы запишите, будет добавлено в конец файла. Довольно удобно для ведения различных логов.
Третья переменная может принимать значение true или false. Она указывает, создавать ли новый файл, если его до этого не существовало. Если значение равно true, то новый файл будет создан.

Есть еще и четвертый параметр, который задает кодировку для открытия файла. Его возможные значения:

□     -2 — открывается, используя системную кодировку;

□     -1 — открывается в кодировке Unicode;

□     о — открывается в кодировке ASCII.

Для записи в файл текста служат следующие методы:

□  Write — записывает данные в файл в одну строку без перевода курсора;
П WriteLine — записывает в файл отдельную строку;

□   writeBlankLines —  записывает  пустую  строку  (в  качестве  параметра
принимает количество пустых строк, которые надо записать).

В листинге 6.12 приведен небольшой пример их использования.

[Листинг 6.12. Пример записи данных в файл. JScrlpt

// Пример записи данных а файл.  JSccipt

// Чеботарев И.

// http://www.whatis.ru

Eso = new ActiveXObject(Scripting.FileSystemObject);

file =   fso.OpenTextFile(c:\\test,tXt1,   2,   true) ;

11  Запись текста без перевода строки

file.WriteCHello, ) ;

file.Write(World!);

// Вставка двух пустых строк

file.WriteBlankLines{2);

// Запись текста построчно

file.WriteLinefHello,   >;

file.WriteLine(World!n);

Для чтения из файла используются методы:

□   Read — читает из файла указанное в качестве параметра количество сим­
волов;

П ReadLine — читает строку из файла;

П ReadAii — считывает весь файл;

П skip — пропускает указанное количество символов;

□   sxipLine — пропускает строку.
Давайте попробуем написать один сценарий для иллюстрации работы методов (листинг 6.13), В линейке операционных систем Windows 9x есть файл win.ini, в параметре run которого можно запускать файлы при загрузке операционной системы. Этим нередко пользуются различные вредоносные программы, прописывая туда старт своего файла. Попробуем проверить, использугтся ли этот параметр для запуска какого-нибудь приложения или нет (на компакт-диске вы найдете файл этого сценария под именем wsh_check_run.vbs).

| Листинг 6.13. Проверка параметра run в win.ini. VBScript

1  Проверка параметра run в win.ini.  VBScript

1  Чеботарев И.

1 http://www.whatis.ru

Set fso = CreateObjectCScripting.FileSystercObject)

1 Откроем файл на чтение

При необходимости поменяйте путь расположения файла

Set file ■ fso.OpenTextFiletс:\windows\win.ini, 1, false)

Предполагаем, что параметр run находится во 2-й строке,

■ поэтому устанавливаем туда курсор, пропустив 1-ю строку

fils.SkipLine

Считываем строку и сравниваем с пустой записью

Если они не совпадают, то бьем тревогу

if (not file.ReadLine = run=) then

WScript.Echo Параметр run не пустой!!! Это просто для контроля. Б реальной работе можно отключить else

WScript.Echo OK! end if

Конечно, это самый примитивный вариант. Можно сделать, чтобы существовала проверка, действительно ли это параметр run, выводить его содержимое, если он не пустой, но в учебных целях такого вполне достаточно.

И в заключение: при работе с файлами учтите такой момент — если вы открываете файл для записи, то читать из него данные вам не позволят, аналогично и наоборот.



Обсудить статью на форуме


Если прочитаная статья из нашей обширной энциклопедия компьютера - "Автоматизация действий с помощью Windows Script Host", оказалась полезной или интересной, Вы можете поставить закладку в социальной сети или в своём блоге на данную страницу:

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


Copyright © 2008 - 2024 Дискета.info