Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

ОС лабораторная раб 2013

.pdf
Скачиваний:
18
Добавлен:
22.05.2015
Размер:
549.47 Кб
Скачать

'* Имя: SleepExample.vbs '* Язык: VBScript

'* Описание: Использование метода WScript.Sleep '*************************************************** WScript.Echo "Сценарий запущен, отдыхаем:"

WScript.Sleep 5000

WScript.Echo "Выполнение сценария завершено" '************* Конец Листинг 5.4. Использование метода

WScript.Sleep (html, txt)

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

WshShell.SendKeys.

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

WScript.

Свойство Arguments

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

'***************************************************

'Имя: Args.vbs

'Язык: VBScript

'Описание: Работа с аргументами запущенного сценария

'*************************************************** Option Explicit

Dim s,objArgs,Arg

Set objArgs = WScript.Arguments ' Создаем объект

WshArguments

For Each Arg In objArgs

s=s & Arg ' Формируем строки со значениями аргументов

Next

WScript.Echo s ' Выводим сформированные строки '************* Конец Листинг 5.1. Вывод всех параметров

командной строки сценария (VBScript) (html, txt)

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

дующая команда будет сортировать строки вывода сценария example.js и выводить их в файл sort.txt:

cscript //Nologo example.js | sort > sort.txtОпция //Nologo

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

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

'***************************************************

'* Имя: Interact.vbs '* Язык: VBScript

'* Описание: Ввод/вывод строк в консольном режиме

'*************************************************** Dim s

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

WScript.StdOut.Write "Введите число: "

'Считываем строку

s = WScript.StdIn.ReadLine

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

WScript.StdOut.WriteLine "Вы ввели число " & s

'************* Конец Листинг 5.2. Вывод/вывод строк в символьном режиме

(html, txt)

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

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

Получение сведений о диске Доступ к свойствам заданного локального или сетевого дис-

ка можно получить с помощью объекта Drive, который возвращается методом GetDrive объекта FileSystemObject, а также может быть получен как элемент коллекции Drives.

В листинге 6.1 приведен сценарий DriveInfo.vbs, который выводит на экран некоторые свойства диска С.

'***************************************************

'Имя: DriveInfo.vbs

'Язык: VBScript

21

22

' Описание: Вывод на экран свойств диска C

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

Dim FSO,D,TotalSize,FreeSpace,s 'Создаем объект FileSystemObject

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

'Создаем объект Drive для диска C

Set D = FSO.GetDrive("C:")

s = "Информация о диске C:" & VbCrLf 'Получаем серийный номер диска

s = s &"Серийный номер: " & D.SerialNumber & VbCrLf 'Получаем метку тома диска

s = s & "Метка тома: " & D.VolumeName & VbCrLf 'Вычисляем общий объем диска в килобайтах

TotalSize = D.TotalSize/1024

s = s & "Объем: " & TotalSize & " Kb" & VbCrLf

'Вычисляем объем свободного пространства диска в килобайтах

FreeSpace = D.FreeSpace/1024

s = s & "Свободно: " & FreeSpace & " Kb" & VbCrLf

'Выводим свойства диска на экран

WScript.Echo s

'************* Конец Листинг 6.1. Вывод информации о диске (VBScript) (html, txt)

Создание каталога Создать новый каталог на диске можно либо с помощью ме-

тода CreateFolder объекта FileSystemObject, либо с помощью ме-

тода Add коллекции Folders. Оба эти метода используются в сценарии MakeFolder.vbs для создания в каталоге C:\Program Files подкаталогов Новая папка и Еще одна новая папка (листинг

6.8).

'Имя: MakeFolder.vbs

'Язык: VBScript

'Описание: Создание нового каталога 'Объявляем переменные

Dim FSO, F, SubFolders

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

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

'Создаем каталог C:\Program Files\Новая папка

FSO.CreateFolder("C:\Program Files\Новая папка") 'Создаем объект Folder для каталога C:\Program Files Set F = FSO.GetFolder("C:\Program Files")

'Создаем коллекцию подкаталогов каталога C:\Program Files Set SubFolders = F.SubFolders

'Создаем каталог C:\Program Files\Еще одна новая папка SubFolders.Add "Еще одна новая папка"

'************* Конец Листинг 6.8. Создание нового ката-

лога (VBScript) (html, txt)

Удаление файлов и каталогов Для удаления файлов/каталогов можно применять метод

DeleteFile/DeleteFolder объекта FileSystemObject или метод

Delete соответствующего этому файлу/каталогу объекта File/Folder. Отметим, что при удалении каталога неважно, является ли он пустым или нет - удаление будет произведено в любом случае. Если же заданный для удаления файл/каталог не будет найден, то возникнет ошибка.

В листинге 6.12 приведен сценарий DeleteFile.vbs, в котором производится удаление предварительно созданного файла

C:\TestFile.txt.

'Имя: DeleteFile.vbs

'Язык: VBScript

'Описание: Создание и удаление файла 'Объявляем переменные

Dim FSO,F,FileName

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

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

'Задаем имя файла

FileName="C:\TestFile.txt" 'Создаем файл

Set F = FSO.CreateTextFile(FileName, true)

'Записываем в файл строку

F.WriteLine "Тестовый файл" 'Закрываем файл

F.Close

WScript.Echo "Файл создан"

FSO.DeleteFile FileName

23

24

WScript.Echo "Файл удален"

'************* Конец Листинг 6.12. Создание и удаление файла (VBScript) (html, txt)

Лабораторная работа № 8 Исследование системы обработки прерываний ОС MS-DOS

Цель работы. Изучение системы обработки прерываний ОС MSDOS Общие положения Для обработки событий, происходящих асинхронно по отношению к выполнению программы, лучше всего подходит механизм прерываний. Прерывание можно рассматривать как некоторое событие в системе, требующее моментальной реакции. С прерыванием связывают число - номер прерывания. Этот номер однозначно соответствует тому или иному событию. Система умеет распознавать прерывания и при их возникновении запускает процедуру, соответствующую номеру прерывания. Прерывания могут быть синхронными или асинхронными. Синхронные прерывания (программные) вызываются самой программой с использованием команды INT. Программные прерывания удобно использовать для организации доступа к функциям операционной системы и другим разделяемым программам и данным. Аппаратные прерывания вызываются физическими устройствами. Эти прерывания информируют систему о событиях, связанных сработой устройств, например, завершение ввода, нажатие клавиши наклавиатуре или мыши и т.д.

Для того, чтобы связать адрес обработчика прерываний с номером прерывания, используется таблица векторов прерываний, занимающая первый килобайт оперативной памяти. Эта таблица находится в диапазоне адресов от 0000: 0000 до 0000: 03FFh и состоит из 256 элементов -дальних адресов обработчиков прерываний.

Элементы таблицы векторов прерываний называются векторами прерываний. В первом слове вектора прерываний записывается компонента смещения обработчика прерывания, а во втором - сегментная компонента.

Для программиста, использующего язык СИ, таблицу векторов прерываний можно описать следующим образом: void (far* inter-

rupt_table[256]) () ; Для изменения обработки некоторых прерываний программа должна установить векторы нужных прерываний на свой обработчик. Это можно сделать, изменив содержимое соответствующего элемента таблицы векторов прерываний. Перед завершением работы необходимо восстановить содержимое измененных векторов.

Если нужно добавить какие-либо действия к тем, что выполняет стандартный обработчик прерываний, то можно организовать цепочку обработчиков прерываний. В библиотеке СИ имеется функция для организации цепочки прерывания с именем _chain_intr. Для описания функции, выполняющей обработку прерывания, следует использовать ключевое слово interrupt. Такая функция завершается командой возврата из прерывания IRET. Для нее автоматически генерируются команды сохранения регистров на входе и их восстановления при выходе из обработчика прерывания. void interrupt far int_funct(...) { //

Тело обработчика прерывания } Ключевое слово interruptиспользуется также для описания переменных, предназначенных для хранения векторов прерываний: void interrupt (far *oldvect) (...) ; Для установки своего обработчика прерываний используется функция _dos_setvect. Эта функция имеет два параметра - номер прерывания и указатель на новую функцию обработки прерывания: _dos_setvect(0x16, my_key_intr) ; В этом примере для прерывания номер 16h устанавливается новый обработчик прерыванияmy_key_intr.

Для того чтобы узнать адрес старого обработчика прерывания по его номеру используется функция _dos_getvect, которая принимает в качестве параметра номер прерывания и возвращает указатель на соответствующий номеру обработчик: old_vector = _dos_getvector(0x16) ; Следующая программа иллюстрирует применение перечисленных выше функций для создания цепочки обработчиков прерываний. Эта программа встраивает собственный обработчик прерываний от таймера, который будет вызываться 18,2 раза в секунду. Встраиваемый обработчик прерываний подсчитывает прерывания от таймера, и, если значение соответствующего счетчика кратно 20, громкоговоритель компьютера издает звуковой сигнал.

25

26

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

#include <stdio. h> #include <dos. h> #include <conio.h> void main(void) ; void interrupt far timer(...) ; void interrupt (far*oldvect)

(...) ; // Переменная для подсчета прерываний таймера volatilelong ticks; void main(void) ; { // Сбрасываем счетчик ticks

=0; //Запоминаем адрес старого обработчика прерываний oldvect

=dos_getvect(0x1c) : // Устанавливаем новый обработчик прерываний dos_setvect (0x1c,timer) ; printf ("\nТаймер установлен. Нажмите любую клавишу... \n") ;getch() ; // Восстанавливаем старый обработчик прерываний dos_setvect(0x1c, oldvect) ; } void interrapt far timer (...) { // Увеличиваем счетчик прерываний таймера ticks++; // Если значение счетчика кратно 20, выдаем сигнал на громкоговоритель // компьютера if (ticks % 20) == 0) { asm mov bx, 0 asm mov ax, 0E07h asm int 10h } // Вызываем старый обработчик прерываний _chain_intr (oldvect) ; }

Порядок выполнения работы 1. Отладить программу, приведенную выше в описании лабораторной работы. 2. Составить и отладить программу, подсчитывающую число обращений к услугам операционной системы через прерывание INT 21h. Число обращений подсчитать для программы, составленной на лабораторной работе №5.

Содержание отчета Цель работы. Список наиболее часто используемых векторов

прерываний. Результаты работы программы. Контрольные вопросы

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

Лабораторная работа 9

Управление задачами и процессами. Процессы и их приоритеты

Написать две программы (одну, а вторую скопировать), обе зацикливающиеся. Запустить и с помощью «Диспетчера задач» (нажимая клавиши Ctrl+Alt+Delete) установить для первой более высокий приоритет, чем для второй (нажимая правую кнопку мыши на названии). Определить, на сколько процентов они (каждая) загружают процессор. Снять обе задачи. Окна программ должны быть маленькими, чтобы облегчить переключение между ними и окном диспетчера задач.

Запустить Microsoft Word и Far Manager (или Total Commander).

Определить:

-Число дескрипторов и потоков, создаваемых Word и Far.

-Идентификаторы процессов Word и Far.

-Занимаемую память процессами Word и Far.

-Имя процесса для «Мой компьютер».

Лабораторная работа 10

Пример создания многопоточного приложения в Delphi

Этот раздел содержит описание шагов, необходимых для создания простого, но показательного примера многопоточного приложения. Мы будем пытаться вычислить число "пи" с максимальной точностью после запятой. Конечно, встроенная в Delphi константа Pi имеет достаточную точность, правильнее сказать — максимальную, допускаемую самым точным 10-байтным форматом для вещественных чисел Extended. Так что превзойти ее нам не удастся. Но этот пример использования потоков может послужить прологом для решения реальных задач.

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

1.В среде Delphi откройте меню File и выберите пункт New

Application.

2.Расположите на форме пять меток и один переключатель, как показано на рис. 29.2.

Переименуйте главную форму в fmMain.

27

28

3. Откройте меню File и выберите пункт Save Project As. Сохраните модуль как uMain, а проект — как Threads 1.

Рис. 29.2. Внешний вид формы для приложения Threads'1 4. Откройте меню File и выберите пункт New. Затем дважды

щелкните на объекте типа поток (значок Thread Object). Откроется диалоговое окно New Items, показанное на рис. 29.3.

Рис. 29.3. Диалоговое окно New Items с выбранным объектом типа "поток"

Рис. 29.4. Диалоговое окно New Thread Object

5.Когда появится диалоговое окно для именования объекта поток, введите TPiThread и нажмите клавишу <Enter> (рис. 29.4). Помимо этого, при желании, вы можете присвоить создаваемому потоку имя, установив флажок Named Thread и задав имя в поле Thread Name. Так как имя потока используется только для удобства обозначения, эту возможность мы использовать не будем.

Delphi создаст новый модуль и поместит в него шаблон для нового потока.

6.Код, вносимый в метод Execute, вычисляет число я, используя сходимость бесконечного ряда Лейбница:

Pi = 4 - 4/3 + 4/5 - 4/7 + 4/9 -...

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

— это то же самое, что стрелять из пушки по воробьям. На отображение информации система потратит в десятки раз больше времени, чем на собственно вычисления. Поэтому мы ввели константу updatePeriod, которая регулирует периодичность отображения текущего значения.

Код метода Execute показан ниже: const

// Лучше использовать нечетное число для того, чтобы избежать эффекта // мерцания UpdatePeriod = 1000001;

procedure TPiThread.Execute; var sign : Integer; PiValue, PrevValue : Extended; i : Int64;

begin

29

30

{ Place thread code here } PiValue := 4; sign := -1; i := 0; repeat Inc(i);

PrevValue := PiValue;

PiValue := PiValue + sign * 4 / (2*i+l); sign := -sign; if i mod UpdatePeriod = 0 then

begin

GlobalPi := PiValue; GlobalCounter := i; Synchronize(fmMain.UpdatePi);

end;

until Terminated or (Abs(PiValue - PrevValue)<1E-19); end;

7.Откройте меню File и выберите пункт Save As. Сохраните модуль с потоком как uPiThread.pas.

8.Отредактируйте главный файл модуля uMain.pas и добавьте модуль uPiThread к списку используемых модулей в секции интерфейса. Он должен выглядеть так:

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, StdCtrls, uPiThread;

9.В секции public формы TfmMain добавьте ссылку на созда-

ваемую нить: PiThread : TPiThread;

10.Добавьте в модуль uMain две глобальные переменные

GlobalPi : Extended; GlobalCounter : Int64; и метод UpdatePi:

procedure TfmMain.UpdatePi; begin

if Islconic(Application.Handle) then Exit;

LaValue.Caption := FloatToStrF(GlobalPi, ffFixed, 18, 18); lalterNum.Caption := IntToStr(GlobalCounter) + ' iterations';

end;

Этот метод, если вы обратили внимание, вызывается из потока посредством процедуры Synchronize. Он отображает текущее значение приближения к числу "пи" и количество итераций.

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

11.Выполните двойной щелчок на свободном месте рабочей области формы, при этом создастся шаблон метода FormCreate. Здесь мы отобразим значение системной константы р±: procedure TfmMain.FormCreate(Sender: TObject);

begin

laBuiltln.Caption := FloatToStrF(Pi, ffFixed, 18, 18); end;

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

procedure TfmMain.cbCalculateClick(Sender: TObject); begin if cbCalculate.Checked then

begin

PiThread := TPiThread.Create(True); PiThread.FreeOnTerminate := True; PiThread.Priority := tpLower; PiThread.Resume; end else begin

if Assigned(PiThread) then PiThread.Terminate; end; end;

Таким образом, многопоточное приложение готово к запуску. Если все пройдет нормально, вы увидите картинку, подобную той, которая приведена на рис. 29.5.

Рис. 29.5. Выполняющееся приложение Threads1

Пока один из авторов писал текст этого раздела, запущенное одновременно приложение Threadsl выполнило пять миллиардов итераций и приблизилось к встроенному значению Pi в десятом разряде. Интересно, насколько хватит терпения у вас?

Этот простой пример — первый шаг в усвоении того, как от базового класса rrhread можно порождать собственные классы. Изза своей простоты он не лишен недостатков; более того — если

31

32

бы вычислительных нитей было не одна, а более, кое-какие приемы были бы даже ошибочными.

Текст программы см. в приложении.

Задание. Вместо вычисления вычислить (по варианту):

1.

2.

3.

4.

5.

6.

Лабораторная работа 11

Сценарии WSH для выполнения основных операций с файловой системой

Рассматриваются свойства и методы стандартного объекта

FileSystemObject.

Сценарии WSH для доступа к файловой системе. Объектная модель

FileSystemObject

Сценарии WSH позволяют получить полный доступ к файловой системе компьютера, в отличие от JScriptили VBScript-сценариев, внедренных в HTML-страницы, где в зависимости от уровня безопасности, который устанавливается в настройках браузера, те или иные операции могут быть запрещены.

Объекты для основных операций с файловой системой

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

33

помощью методов объекта FileSystemObject можно выполнять следующие основные действия:

копировать или перемещать файлы и каталоги; удалять файлы и каталоги; создавать каталоги;

создавать или открывать текстовые файлы;

создавать объекты Drive, Folder и File для доступа к конкретному диску, каталогу или файлу соответственно.

С помощью свойств объектов Drive, Folder и File можно получить детальную информацию о тех элементах файловой системы, с которыми они ассоциированы. Объекты Folder и File также предоставляют методы для манипулирования файлами и каталогами (создание, удаление, копирование, перемещение); эти методы в основном копируют соответствующие методы объекта FileSystemObject.

Кроме этого имеются три объекта-коллекции: Drives, Folders и Files. Коллекция Drives содержит объекты Drive для всех имеющихся в системе дисков, Folders - объекты Folder для всех подкаталогов заданного каталога, Files - объекты File для всех файлов, находящихся внутри определенного каталога.

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

TextStream.

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

Таблица 6.1. Выполнение основных файловых операций Операция Используемые объекты, свойства и методы Получение сведений об определенном диске (тип файловой системы,

метка тома, общий объем и количество свободного места и т.д.) Свойства объекта Drive. Сам объект Drive создается с помощью метода

GetDrive объекта FileSystemObject

Получение сведений о заданном каталоге или файле (дата создания или последнего доступа, размер, атрибуты и т.д.) Свойства объектов Folder и File. Сами эти объекты создаются с помощью методов GetFolder и GetFile объекта FileSystemObject

34

Проверка существования определенного диска, каталога или файла Методы DriveExists, FolderExists и FileExists объекта FileSystemObject

Копирование файлов и каталогов Методы CopyFile и CopyFolder объ-

екта FileSystemObject, а также методы File.Copy и Folder.Copy

Перемещение файлов и каталогов Методы MoveFile и MoveFolder объ-

екта FileSystemObject, или методы File.Move и Folder.Move

Удаление файлов и каталогов Методы DeleteFile и DeleteFolder объекта

FileSystemObject, или методы File.Delete и Folder.Delete Создание каталога Методы FileSystemObject.CreateFolder или

Folders.Add

Создание текстового файла Методы FileSystemObject.CreateTextFile или Folder.CreateTextFile

Получение списка всех доступных дисков Коллекция Drives, содержа-

щаяся в свойстве FileSystemObject.Drives

Получение списка всех подкаталогов заданного каталога Коллекция

Folders, содержащаяся в свойстве Folder.SubFolders

Получение списка всех файлов заданного каталога Коллекция Files, содержащаяся в свойстве Folder.Files

Открытие текстового файла для чтения, записи или добавления Мето-

ды FileSystemObject.CreateTextFile или File.OpenAsTextStream

Чтение информации из заданного текстового файла или запись ее в него Методы объекта TextStream

Примеры сценариев Далее приведены простые примеры сценариев, работающих с файло-

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

Получение сведений о каталоге

Доступ к свойствам каталога обеспечивает объект Folder. Создать этот объект можно с помощью свойства RootFolder объекта Drive или мето-

дов GetFolder, GetParentFolder и GetSpecialFolder объекта

FileSystemObject. Также объекты Folder могут быть получены как элементы коллекции Folders.

В сценарии FolderInfo.vbs на экран выводятся свойства каталога, из которого был запущен сценарий (листинги 6.2).

'Имя: FolderInfo.vbs

'Язык: VBScript

'Описание: Вывод на экран даты создания текущего каталога

35

Dim FSO,WshShell,FoldSize,s 'Объявляем переменные

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

Set FSO = WScript.CreateObject("Scripting.FileSystemObject") 'Создаем объект WshShell

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

'Определяем каталог, из которого был запущен сценарий '(текущий каталог)

Set Folder = FSO.GetFolder(WshShell.CurrentDirectory)

'Получаем имя текущего каталога

s = "Текущий каталог: " & Folder.Name & VbCrLf 'Получаем дату создания текущего каталога

s = s & "Дата создания: " & Folder.DateCreated & VbCrLf 'Вычисляем размер текущего каталога в килобайтах

FoldSize=Folder.Size/1024

s = s & "Объем: " & FoldSize & " Kb" & VbCrLf

'Выводим информацию на экран

WScript.Echo s

'************* Конец *Листинг 6.2. Вывод информации о каталоге

(VBScript) (html, txt)

Получение сведений о файле

Доступ ко всем свойствам файла обеспечивает объект File, создать который можно с помощью коллекции Files или метода GetFile объекта

FileSystemObject.

В листинге 6.3 приведен сценарий FileInfo.vbs, в котором на экран выводятся некоторые свойства файла C:\boot.ini.

'Имя: FileInfo.vbs

'Язык: VBScript

'Описание: Вывод на экран некоторых свойств файла Dim FSO,F,s 'Объявляем переменные

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

Set FSO = WScript.CreateObject("Scripting.FileSystemObject") 'Создаем объект File

Set F = FSO.GetFile("C:\boot.ini") 'Получаем имя файла

s = "Файл: " & F.Name & VbCrLf

'Получаем дату создания файла

s = s & "Дата создания: " & F.DateCreated & VbCrLf 'Получаем тип файла

s = s & "Тип: " & F.Type & VbCrLf 'Выводим информацию на экран

36

WScript.Echo s

'************* Конец *Листинг 6.3. Вывод информации о файле

(VBScript) (html, txt)

Проверка существования диска, каталога или файла Для проверки существования диска, каталога и файла используются

соответственно методы DriveExists, FolderExists и FileExists. В листин-

ге 6.4 приведен сценарий IsExistsFile.vbs, в котором проверяется наличие на диске C файла boot.ini.

'Имя: IsExistsFile.vbs

'Язык: VBScript

'Описание: Проверка существования файла Dim FSO,FileName 'Объявляем переменные 'Создаем объект FileSystemObject

Set FSO = WScript.CreateObject("Scripting.FileSystemObject") FileName = "C:\boot.ini"

if FSO.FileExists(FileName) Then

'Выводим информацию на экран

WScript.Echo "Файл " & FileName & " существует" else

'Выводим информацию на экран

WScript.Echo "Файл " & FileName & " не существует" end if

'************* Конец *Листинг 6.4. Проверка существования файла

(VBScript) (html, txt)

Получение списка всех имеющихся дисков Каждому из дисков компьютера (включая подключенные сетевые дис-

ки и дисководы со сменными носителями) соответствует элемент коллекции Drives (объект Drive). Таким образом, для построения списка дисков компьютера нужно в цикле перебрать все элементы коллекции

Drives.

Получение списка всех подкаталогов заданного каталога Для построения списка всех подкаталогов определенного каталога

можно воспользоваться коллекцией Folders, которая хранится в свойстве SubFolders соответствующего объекта Folder и содержит объекты Folder для всех подкаталогов.

Получение списка всех файлов заданного каталога

В свойстве Files объекта Folder, соответствующего определенному каталогу, хранится коллекция находящихся в этом каталоге файлов (объ-

ектов File).

37

Создать новый каталог на диске можно либо с помощью метода

CreateFolder объекта FileSystemObject, либо с помощью метода Add

коллекции Folders.

Создание текстового файла

Для создания текстового файла используется метод CreateTextFile объекта FileSystemObject, который имеет один обязательный текстовый параметр (путь к создаваемому файлу) и два необязательных логи-

ческих параметра (Overwrite и Unicode).

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

Параметр Unicode указывает, в каком формате (ASCII или Unicode) следует создавать файл. Если Unicode равно True, то файл создается в формате Unicode, если же Unicode равно False или этот параметр вообще не указан, то файл создается в режиме ASCII.

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

'Имя: CreateTempFile.vbs

'Язык: VBScript

'Описание: Создание временного файла со случайным именем Dim FSO,FileName,F,s 'Объявляем переменные

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

Set FSO = WScript.CreateObject("Scripting.FileSystemObject") 'Генерируем случайное имя файла

FileName = FSO.GetTempName 'Создаем файл с именем FileName

Set F = FSO.CreateTextFile(FileName, true)

'Закрываем файл

F.Close

'Сообщаем о создании файла

WScript.Echo "Был создан файл " & FileName

'************* Конец *Листинг 6.9. Создание временного файла со случайным именем (VBScript) (html, txt)

Операции чтения и записи строк для текстового файла Последовательный (строка за строкой) доступ к текстовому файлу обеспечивает объект TextStream. Методы этого объекта позволяют читать информацию из файла и записывать ее в него. Создается объект

38

TextStream при открытии или создании текстового файла с помощью следующих методов:

CreateTextFile объектов FileSystemObject и Folder; OpenTextFile объекта FileSystemObject; OpenAsTextStream объекта File.

Перечисленные ранее методы позволяют открывать файл в разных режимах ввода/вывода (за это отвечает параметр Iomode) с использованием разных форматов (в соответствии со значением параметра

Format) (см. табл. 6.2, 6.3)

Таблица 6.2. Параметр Iomode Константа Значение Описание

ForReading 1 Файл открывается только для чтения, записывать информацию в него нельзя

ForWriting 2 Файл открывается для записи. Если файл с таким именем уже существовал, то при новой записи его содержимое теряется ForAppending 8 Файл открывается для добавления. Если файл уже существовал, то информация будет дописываться в конец этого файла

Таблица 6.3. Параметр Format Константа Значение Описание

TristateUseDefault -2 Файл открывается в формате, используемом системой по умолчанию

TristateTrue -1 Файл открывается в формате Unicode TristateFalse 0 Файл открывается в формате ASCII

Копирование и перемещение файлов и каталогов Для копирования файлов/каталогов можно применять метод

CopyFile/CopyFolder объекта FileSystemObject или метод Copy соответ-

ствующего этому файлу/каталогу объекта File/Folder. Перемещаются файлы/каталоги с помощью методов MoveFile/MoveFolder объекта FileSystemObject или метода Move соответствующего этому файлу/каталогу объекта File/Folder.

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

В листинге 6.11 приведен сценарий CopyFile.vbs, иллюстрирующий использование метода Copy. В этом сценариях на диске C создается файл TestFile.txt, который затем копируется на рабочий стол.

'Имя: CopyFile.vbs

'Язык: VBScript

39

' Описание: Создание и копирование файла 'Объявляем переменные

Dim FSO,F,WshShell,WshFldrs,PathCopy 'Создаем объект FileSystemObject

Set FSO = WScript.CreateObject("Scripting.FileSystemObject") 'Создаем файл

Set F = FSO.CreateTextFile("C:\TestFile.txt", true)

'Записываем в файл строку

F.WriteLine "Тестовый файл" 'Закрываем файл

F.Close

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

Set WshShell = WScript.CreateObject("Wscript.Shell") 'Создаем объект WshSpecialFolders

Set WshFldrs = WshShell.SpecialFolders

'Определяем путь к рабочему столу

PathCopy = WshFldrs.item("Desktop")+"\"

'Создаем объект File для файла C:\TestFile.txt Set F = FSO.GetFile("C:\TestFile.txt")

'Копируем файл на рабочий стол

F.Copy PathCopy

'************* Конец *Листинг 6.11. Создание текстового файла и копирование его в другой каталог (VBScript) (html, txt)

Лабораторная работа 12

Запуск из сценариев WSH внешних процессов и подключение к

внешним COM-объектам

Рассматриваются примеры работы с объектными моделями программ

Microsoft Word и Microsoft Excel

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

Запуск приложений Windows

Из сценария WSH запустить другое приложение можно с помощью методов Run или Exec объекта WshShell.

При использовании метода Run для запускаемого приложения можно задать тип окна (при условии, что приложение поддерживает

40