Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Использование VbScript для администратора Windows


Выпуск #04

"Vbs, whs, js скрипты для администратора"

12 августа 2008

 

Приветствую уважаемый подписчик!

В этой рассылке продолжим разговор о методах и свойствах объекта WScript. Мы рассмотрим функции потокого ввода/вывода StdErr, StdIn, StdOut.

Немного о потоках в Windows

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

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

Оператор перенаправления
Описание
>
Записывает данные на выходе команды вместо командной строки в файл или на устройство, например, на принтер.
<
Читает поток входных данных команды из файла, а не с клавиатуры.
>>
Добавляет выходные данные команды в конец файла, не удаляя при этом существующей информации из файла.

>&

Считывает данные на выходе одного дескриптора как входные данные для другого дескриптора.
<&
Считывает входные данные одного дескриптора как выходные данные другого дескриптора.
|
Считывает выходные данные одной команды и записывает их на вход другой команды. Эта процедура известна под названием <канал>.

По умолчанию, входные данные команды (дескриптор STDIN) отсылаются с клавиатуры интерпретатору команд Cmd.exe, далее Cmd.exe отправляет выходные данные команды (дескриптор STDOUT) в окно командной строки.

В следующей таблице представлены доступные дескрипторы.

дескриптор
Номер дескриптора
Описание
STDIN
0
Ввод с клавиатуры
STDOUT
1
Вывод в окно командной строки
STDERR
2
Ошибка вывода в окно командной строки

Номера от 0 до 9 представляют первые 10 дескрипторов. Для запуска программы и перенаправления любого из 10 дескрипторов используется интерпретатор команд Cmd.exe. Для задания требуемого дескриптора перед оператором перенаправления введите его номер. Если дескриптор не определен, то по умолчанию оператором перенаправления ввода <<> будет ноль (0), а оператором перенаправления вывода <>> будет единица (1). После ввода оператора <<> или <>> необходимо указать, откуда читать и куда записывать данные. Можно задать имя файла или любой из существующих дескрипторов.

Для того, чтобы разобраться как работают потоки, давайте создадим небольшой файл bat. Создайте файл start.bat и скопируйте ниже строчки синего цвета в файл:

echo off
echo .
echo Проба пера
If then goto ff

 

Я намеренно последнюю строчку написал с ошибками. Запустим файл сначала start.bat, потом с выводом потоков в разные файлы start.bat > out.txt 2> error.txt. При чем в файл out.txt у нас будут выводится просто сообщения, а в файл error.txt ошибки (номер дескриптора 2).

При это в файлах будет содержаться следующая информация:

Файл
Содержащаяся информация
out.txt

echo off
Проба пера

error.txt
Непредвиденное появление: goto.

 

Запишем данные в конец файла:

start.bat >> out.txt

В результе в файле out.txt будет содержаться примерно следующая информация:

Файл
Содержащаяся информация
out.txt

echo off

Проба пера

echo off

Проба пера

 

Для того, чтобы вывести информацию и ошибки в один файл мы можем перенаправить поток ошибок (дескрипотор 2) в поток вывода (дескриптор 1). Выполним команду start.bat >out.txt 2>&1. В результате получим файл out.txt:

Файл
Содержащаяся информация
out.txt
echo off
Проба пера
Непредвиденное появление: goto.

На этом рассмотрим краткий обзор работы с потоками с помощью Windows, перейдем к рассмотрению свойств объекта WScript для работы с потоками.

 

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

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

Поток StdOut - поток вывода информации на экран, StdErr - поток ошибок , StdIn - поток ввода информации с экрана.

Многие программы, которые запускаются с командной строки используют поток StdErr для своих нужд, допустим в программе архивации winrar предусмотрена специальная опция : -ierr, чтобы отправлять все сообщения на StdErr.

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

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

Рассмотрим примеры сценариев по работе с потоками. Скопируйте содержимое листинга 1 в файл stdin_out.vbs:

'--------------------------------- Начало файла

' Имя: StdIn_Out.vbs

'Язык: VBScript

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

'Объявляем переменную в которой будет сохраняться значение входного потока

Dim strS

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

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

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

strS = WScript.StdIn.ReadLine

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

WScript.StdOut.WriteLine("Вы ввели число -" & strS)

'--------------------------------- Окончание файла

Напоминаю, что файл запускается с помощью команды cscript.

Еще одно из применений потоков вывода , при выполнении скриптов требующих длительного времени показать пользователю, что скрипт не "завис", а выполняется. Рассмотрим следующий пример. Для индикации выполнения программы мы будем использовать точку.

'--------------------------------- Начало файла

' Имя: stdout_ind.vbs

'Язык: VBScript

'Описание: Пример индикации выполнения программы

'Объявляем переменную для работы с циклом

Dim lngI

WScript.Echo "Индикация выполнения программы!!!"

'Выполняем цикл от 0 до 30

For lngI =0 To 30

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

WScript.StdOut.Write "."

'Пауза выполнения 1000 милисекунд или 1 секунда

WScript.Sleep (1000)

'Наращиваем переменную lngI на 1

Next

'-------------------------------- Окончание файла

В этой рассылке мы вкратце рассмотрели потоки применительно ко скриптам. До встречи в следующих рассылках.

Со мной можно связаться по e-mail - novopashinwm@mail.ru

Copyright 2008 Новопашин Владимир. Все права защищены.


В избранное