Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Информатика общий подход.doc
Скачиваний:
9
Добавлен:
08.07.2019
Размер:
172.54 Кб
Скачать

If "%1" neq "" goto parmok

ECHO Нужно задать командную строку для определения ERRORLEVEL

exit

:PARMOK

%1 %2 %3 %4 %5 %6 %7 %8

ECHO %1 %2 %3 %4 %5 %6 %7 %8 ERRORLEVEL=%ERRORLEVEL%

Примеры запуска:

echoEL.bat NET SHARE

- будет выполнена команда NET SHARE (выдать список разделяемых сетевых ресурсов) и выдан код ERRORLEVEL

echoEL.bat NET SHARE X"="C:\

- будет выполнена команда NET SHARE X:=C:\ (создать разделяемый сетевой ресурс с именем X, и путем в корневой каталог диска C:) Обратите внимание на то, что символ = заключен в двойные кавычки.

Перечисленные выше варианты задают корректную командную строку. Но попробуйте задать неверный параметр для NET.EXE или вообще несуществующую команду и вы увидите, какое значение примет ERRORLEVEL. И УЧТИТЕ, что командная строка реально ВЫПОЛНЯЕТСЯ и, например, вариант "echoEL.bat format A:" запустит форматирование дискеты в дисководе A:.

Диалог с пользователем

Для диалога с пользователем можно использовать команду:

SET /P < имя переменной >=< текст >

при выполнении которой, на экран выдается текстовое сообщение < текст > и ожидается ввод ответного текста. Пример - выполним запрос пароля и присвоим его значение переменной "pset":

set /p pset="Enter password - "

echo Password is - %pset%

Недостатком данного способа является невозможность продолжения выполнения командного файла при отсутствии ответа пользователя, поэтому очень часто вместо set используются сторонние программы. Одна из них - CHOICE.COM Скачать (1.7кб).

CHOICE выдает пользователю текстовое сообщение и ожидает выбора одного из заданных вариантов ответа (нажатия клавиш на клавиатуре). По результатам выбора формируется переменная ERRORLEVEL, значение которой равно порядковому номеру выбора. По умолчанию вариантов выбора два - Y или N. Если ответ равен Y - то ERRORLEVEL=1, если N - то ERRORLEVEL=2. Можно использовать более 2-х вариантов выбора и есть возможность задать выбор по умолчанию, когда пользователь за определенное время не нажал ни одной клавиши. Формат командной строки:

CHOICE [/C[:]choices] [/N] [/S] [/T[:]c,nn] [text]

/C[:]choices - определяет допустимые варианты выбора. Если не задано - YN

/N - не выдавать варианты выбора.

/S - строчные и заглавные буквы отличаются.

/T[:]c,nn - Выбор по умолчанию равен "c" через "nn" секунд

text - Строка текста выводимая в качестве запроса

Создадим командный файл, демонстрирующий использование CHOICE. Он будет реагировать на нажатие клавиш "1","2",3" и "0" . При нажатии "0" выполняется завершение, а при нажатии остальных - сообщение пользователю. Если в течении 10 секунд ничего не нажато - завершение.

@ECHO OFF

:CHOICE

CHOICE /C:1230 /T:0,10 Ваш вариант

If %errorlevel% equ 4 goto exit

echo Ваш выбор=%ERRORLEVEL%

GOTO CHOICE

:EXIT

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

Задержки в командных файлах

Когда-то, еще в DOS, для организации ожидания в командном файле использовалась удобная команда SLEEP, но затем она почему-то перекочевала из стандартного установочного набора Windows в дополнительный Resource Kit. Можно просто скопировать его оттуда в каталог \system32 и использовать в ваших командных файлах.

: SLEEP N - гден N - количество секунд для задержки.

Если же Resource Kit нет под рукой, можно воспользоваться ранее рассмотренной командой CHOISE без вывода текста и с автоматическим формированием ответа через nn секунд (1-99):

choice.com /T:y,10 /N - задержка на 10 секунд

Более универсальный способ основан на пинговании петлевого интерфейса нужным количеством пакетов. Пинг для петлевого интерфейса (имя хоста - localhost или IP- адрес 127.0.0.1) выполняется без реальной передачи данных, т.е. практически мгновенно, а интервал между пингами составляет 1 секунду. Указывая количество пингов с помощью ключа "-n" можно получить задержку на n секунд:

ping 127.0.0.1 -n 30 > nul - даст задержку на 30 секунд

Поиск компьютеров с запущенным приложением

Для реализации этого скрипта используются утилиты из пакета PSTools (краткое описание). Создадим командный файл, выполняющий поиск в локальной сети компьютеров с выполняющейся программой, имя которой (начальная часть имени) задается в качестве параметра при запуске, например, game . При обнаружении будет послано сообщение на компьютер ADMINCOMP и обнаруженое приложение будет принудительно завершено. Для поиска будем использовать утилиту Pslist.exe и анализировать ее код возврата. Значение переменной ERRORLEVEL равное нулю означает, что утилита обнаружила на удаленном компьютере процесс, удовлетворяющий условиям поиска. Имя процесса для поиска будем задавать в качестве параметра при запуске командного файла. Присвоим нашему командному файлу имя psl.bat. Запуск с параметром будет выглядеть следующим образом:

psl.bat game

Для начала, нужно проверить, задан ли параметр в командной строке при запуске, и, если не задан, выдадим сообщение пользователю и завершим выполнение. Если же параметр задан - перейдем на метку " PARMOK ":

@echo off

if "%1" NEQ "" GOTO PARMOK

ECHO Нужно задать имя процесса для поиска

exit

:PARMOK

Теперь нужно обеспечить последовательное формирование IP-адресов компьютеров для командной строки PSlist. Проще всего это сделать с помощью присвоения временной переменной окружения (действительной только на время выполнения командного файла) значения постоянной составляющей адреса (например - 192.168.0.) и вычисляемого значения младшей части (например, в диапазоне 1-254). Для примера будем считать, что нам необходимо просканировать компьютеры в диапазоне адресов:

192.168.0.1 - 192.168.0.30:

set IPTMP=192.168.0. - старшая часть адреса

set /A IPLAST=1 - младшая часть. Ключ /A означает вычисляемое числовое выражение

set IPFULL=%IPTMP%%IPLAST% - значение полного IP-адреса.

Командная строка для PSlist будет выглядеть cледующим образом:

pslist \\%IPFULL% %1

Теперь осталось только циклически запускать PSlist, прибавляя в каждом цикле единицу к младшей части адреса, пока ее значение не достигнет 30 и анализировать значение ERRORLEVEL после выполнения. Для анализа результата будем выполнять переход командой:

GOTO REZULT%ERRORLEVEL%

обеспечивающей переход на метку REZULT0 при обнаружении процесса и на REZULT1 - при его отсутствии.

Окончательное содержимое командного файла:

@echo off

if "%1" NEQ "" GOTO PARMOK

ECHO Нужно задать имя процесса для поиска

exit

:PARMOK

set IPTMP=192.168.0.

rem Зададим начальное значение " хвоста " IP- адреса

set /A IPLAST=1

rem M0 - метка для организации цикла

:M0

rem Переменная IPFULL - полное значение текущего IP-адреса

set IPFULL=%IPTMP%%IPLAST%

rem Если " хвост "больше 30 - на выход

IF %IPLAST% GTR 30 GOTO ENDJOB

pslist \\%IPFULL% %1

GOTO REZULT%ERRORLEVEL%

:REZULT0

rem Если найдено приложение- отправим сообщение на ADMINCOMP

net send ADMINCOMP Запущено %1 - %IPFULL%

rem И завершим приложение с помощью PSkill

pskill \\%IPFULL% %1

:REZULT1

rem Сформируем следующий IP-адрес

set /A IPLAST=%IPLAST% + 1

rem Перейдем на выполнение следующего шага

GOTO M0

rem Завершение работы

:endjob

exit

В заключение добавлю, что для того, чтобы этот скрипт работал, PSlist.exe и PSkill.exe должны быть доступны в путях поиска исполняемых файлов, например в каталоге WINDOWS. Пользователь, запускающий его, должен обладать правами администратора по отношению к сканируемым компьютерам. И, если текущий пользователь таковым не является, то в параметры запуска утилит PSlist.exe и PSkill.exe нужно добавить ключи, задающие имя пользователя и пароль.

Поиск компьютеров с запущенным приложением по списку

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

Список можно получить из сетевого окружения с использованием команды:

net.exe view > comps.txt

После выполнения такой команды файл comps.txt будет содержать список следующего вида:

Имя сервера Заметки

< 2 пустых строки >

-------------------------------------------------------------------------------

\\AB1

\\AB2

\\ALEX

\\BUHCOMP

\\PC2

\\SA

\\SERVER

Команда выполнена успешно.

Обрабатывать содержимое этого текстового файла будем с помощью команды FOR с ключом /F:

FOR /F ["ключи"] %переменная IN (имя файла) DO команда [параметры]

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

skip=n - пропустить n строк от начала файла (в нашем случае - 4 строки)

eol=< символ > - не использовать строки, начинающиеся с заданного символа. (в нашем случае - пропустить последнюю строку, начинающуюся с символа "К" - "Команда выполнена успешно"

tokens=n - брать для обработки n-е слово в строке (в нашем случае - 1-е слово)

Окончательный вид команды:

FOR /F "eol=К skip=4 tokens=1 " %%I IN (comps.txt) DO (

pslist.exe -u admin -p pass %%I %1