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

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

В предыдущем примере использовался прямой перебор 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 IF NOT ERRORLEVEL 1 net.exe send ADMINCOMP %%i %1 )

Обратите внимание - в пакетных файлах для переменных команды FOR используется два знака процента (запись %%переменная вместо %переменная) и имена переменных учитывают регистр букв (%i отличается от %I). Работать это будет следующим образом - пропускаются первые 4 строки текстового файла со списком компьютеров, и далее в цикле переменной I присваивается значение первого слова (текст от начала строки до разделителя - пробела), выполняется утилита PSlist.exe, для которой в качестве имени компьютера используется значение этой переменной. Если ERRORLEVEL менее 1 - задача с искомым именем присутствует в списке процессов и выполняется отправка сообщения с помощью NET SEND. Окончательное содержимое командного файла:

@echo off if "%1" NEQ "" GOTO PARMOK ECHO Нужно задать имя процесса для поиска exit :PARMOK REM REM Создадим текстовый файл comps.txt со списком компьютеров с помощью NET VIEW net view /DOMAIN:MyDomain > comps.txt REM REM FOR /F "параметры" - использование данных из файла REM eol=К - не использовать строки, начинающиеся с "К" - "Команда выполнена успешно" REM skip=4 - пропустить первые 4 строки в файле REM tokens=1 - брать для обработки 1-е слово в строке REM FOR /F "eol=К skip=4 tokens=1 " %%i in (comps.txt) do ( pslist.exe -u admin -p pass %%i %1 IF NOT ERRORLEVEL 1 net.exe send %COMPUTERNAME% Компьютер - %%i процесс - %1 )

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

Предыдущий пример натолкнул меня на мысль сделать пакетный файл для быстрого выключения всех компьютеров в сети. Выключение производится утилитой PsShutdown.exe (описание в статье "Утилиты пакета PSTools"). Как и в предыдущем примере, сначала создается файл со списком компьютеров на основе сетевого окружения, а затем выполняется их поочередное выключение, при условии, что компьютер не свой (иначе он может выключиться до окончания выполнения командного файла). Содержимое файла:

rem @echo off REM Здесь нужно задать REM имя домена или рабочей группы для которых строится список машин для выключения set MyDomain=имя домена REM REM Создадим текстовый файл comps.txt со списком компьютеров с помощью NET VIEW net view /DOMAIN:%MyDomain% > comps.txt REM REM FOR /F "параметры" - использование данных из файла REM eol=К - не использовать строки, начинающиеся с "К" - "Команда выполнена успешно" REM skip=4 - пропустить первые 4 строки в файле REM tokens=1 - брать для обработки 1-е слово в строке FOR /F "eol=К skip=4 tokens=1 " %%i in (comps.txt) do ( REM Свой компьютер выключать не будем REM Если имя компьютера не равно COMPUTERNAME - выключаем IF /I %%i NEQ %COMPUTERNAME% psshutdown -k -t 0 %%i )

Вам нужно только подредактировать строку: set MyDomain= указав имя домена и, при необходимости, добавить параметры -u -p для psshutdown.exe . Один из посетителей этой странички (спасибо, Danila17) подсказал мысль о том, что, как правило, в реальной жизни из списка выключаемых компьютеров нужно исключить несколько штук, для чего удобно использовать команду FIND в цепочке с net.exe в скрипте формирования списка на основе сетевого окружения. Данная команда используется для поиска строк в текстовом файле по шаблону. Ключ /V используется для поиска строк не совпадающих с шаблоном. Для выключения компьютеров, исключая server1...server4 удобно использовать такой вариант:

net view | find "\\" | find /v "сервер1" | find /v "сервер2" | find /v "сервер3" | find /v "сервер4" > comps.txt FOR /F "tokens=1 " %%i in (comps.txt) do shutdown.exe -f -s -m %%i