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

Предыдущий пример натолкнул меня на мысль сделать пакетный файл для быстрого выключения всех компьютеров в сети. Выключение производится утилитой 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

 

Работа с оконными приложениями.

Допустим, вам нужно из одного и того же командного файла запустить notepad.exe и cmd.exe. Если просто вставить строки
notepad.exe
cmd.exe
то после запуска notepad.exe выполнение командного файла приостановится и пока не будет завершен notepad, cmd.exe не запустится. Самый простой способ обойти эту проблему - использовать стандартную утилиту Windows start.exe. Полную справку по использованию можно получить по:
start.exe /?
Попробуйте создать командный файл следующего содержания:

start /MAX notepad.exe
start "This is CMD.EXE" /MIN cmd.exe
net send %COMPUTERNAME% NOTEPAD and CMD running.

После выполнения этого командного файла вы увидите стартовавшие, в развернутом окне (ключ /MAX) блокнот, в свернутом окне (ключ /MIN) командный процессор CMD.EXE и окно с сообщением net.exe. Стандартный заголовок окна cmd.exe заменен на текст "This is CMD.EXE". Обратите внимание на то что заголовок окна можно опускать, но особенность обработки входных параметров утилитой start.exe может привести к неожиданным результатам при попытке запуска программы, имя или путь которой содержит пробел(ы). Например при попытке выполнить следующую команду:
start "C:\Program Files\FAR\FAR.EXE"
Из-за наличия пробела в пути к исполняемому файлу, строка для запуска FAR.EXE должна быть заключена в двойные кавычки, однако формат входных параметров для start.exe предполагает наличие заголовка окна, также заключаемого в двойные кавычки, в результате чего "C:\Program Files\FAR\FAR.EXE" интерпретируется не как исполняемая программа, а как заголовок окна. Для того, чтобы подобного не случилось нужно использовать любой, пусть даже пустой, заголовок:
start "" "C:\Program Files\FAR\FAR.EXE"


Если вам все же потребуется расширенное управление окнами приложений, придется воспользоваться сторонним программным обеспечением, например, CMDOW Скачать ~15кб
Сайт разработчика
Из-за специфического поведения эта утилита большинством антивирусов определяется как вирус, поэтому для нормальной работы нужно занести ее в исключения антивируса.
Cmdow.exe - крошечная утилита, работающая в Windows NT4/2000/XP/2003 без установки. Позволяет получить список окон, перемещать, изменять размеры, переименовывать, сворачивать/разворачивать, активировать/деактивировать, закрывать, скрывать окна приложений и многое другое. Справку можно получить по команде:
cmdow /?
Используется около 30 ключей. Описание на русском языке найдете здесь. Некоторые примеры:

· Получение информации об окнах:

cmdow.exe или cmdow.exe > wins.txt - выдать информацию обо всех окнах на экран или в файл wins.txt
cmdow /T- выдать информацию об окнах, отображаемых на панели задач рабочего стола.
Информация содержит колонки:

Handle - дескриптор окна - шестнадцатеричное число, связанное с данным окном.
Lev - уровень окна. Приложение может быть многооконным с несколькими уровнями окон.
Pid - идентификатор процесса, породившего окно.
-Window status- - состояние окна (видимое - Vis, скрытое - Hid, активное - Act, свернутое - Min и т.п.
Image - программа вызвавшая окно.
Caption - название окна

Манипулировать окнами можно используя название окна, или его дескриптор. Если название окна содержит пробелы, то оно заключается в двойные кавычки. Если имеются русские буквы, то должна использоваться DOS-кодировка. Символ @ используется для указания текущего окна. Иногда проще использовать дескриптор окна, а не его название. Полезным может быть и использование команды поиска по строке find.exe, выполняемой в цепочке с cmdow:
cmdow.exe | find.exe /I "hid" > wins.txt- в файл wins.txt попадут только строки содержащие шаблон "hid" и мы получим список скрытых окон.
cmdow.exe | find.exe /I "MyIE" > wins.txt- список окон приложения MyIE

· Манипулирование окнами.

Если вы хотите, чтобы ваш командный файл выполнялся скрытно, добавьте в него строку:
cmdow @ /HID - скрыть текущее окно
Ниже командный файл с комментариями, демонстрирующий возможности работы cmdow:

@ECHO OFF
REM Свернуть все окна - /MA
cmdow /MA
REM запустить cmd.exe с заголовком окна MyCMD
start "MyCMD" cmd.exe
REM ждать 5 секунд
call :wait5s
REM
:M1
REM Скрыть окно MyCND
cmdow MyCMD /hid
call :wait5s
REM Сделать видимым
cmdow MyCMD /vis
call :wait5s
REM Переместить в верхний левый угол экрана и развернуть окно
cmdow MyCMD /MOV 0 0
cmdow Mycmd /max
call :wait5s
REM Изменить размер на 320 х 240 и переместить вправо на 320 точек
cmdow MyCMD /MOV 320 0 /SIZ 320 240
call :wait5s
REM Переместить окно в точку с координатами 320 x 240 и изменить размер на 350x50
cmdow MYCMD /MOV 320 240 /SIZ 350 50
call :wait5s
REM Восстановить окно
cmdow MYCMD /RES
call :wait5s
REM Восстановить и сделать активным окно этого командного файла
cmdow @ /RES /ACT
ECHO Для завершения нажмите CTRL-C (CTRL-Break)
call :wait5s
call :wait5s
REM Зацикливание - переход к метке :M1
GOTO M1
REM Подпрограмма задержки на 5секунд
:wait5s
@ping -n 5 localhost > nul

Пример командного файла, закрывающего окна Проводника Интернет (IEXPLORE.EXE):

@echo off
:M1
for /f "tokens=1-2,8" %%a in ('cmdow') do (
if /i "%%c"=="IEXPLORE" if "%%b"=="1" cmdow %%a /END > nul
)
goto M1

Работает это следующим образом. Из выходных данных CMDOW берется первое, второе и 8-е поля. Первое - дескриптор окна (Handle), второе - уровень (Lev), третье - имя программы (Image). В цикле выполняется cmdow и если в ее выводе имеется строка, где имя программы IEXPLORE и уровень окна 1 выполняется cmdow <дескриптор> /END. Пока этот командный файл выполняется, запустить "Проводник интернета" не получится. А если в начало командного файла добавить "cmdow @ /hid" - то будет скрыто и его окно.