Выполнение каких либо действий в заданный интервал времени.



   
Речь пойдет не о запуске командного файла в определенное время, а
о выполнении какой-то его части только в определенный интервал времени,
например, с 10:00 до 12:00. Решения данной задачи потребует сравнения
текущего времени с указанным промежутком. Для примера, создадим командный
файл, выполняющий запуск стандартного калькулятора Windows , только в том
случае, если он запущен в интервале времени от 10:00 до 12:00. Необходимо
получить текущее время и выполнить проверку того, что оно не больше 12:00 и
не меньше 10:00 .

Команда IF позволяет выполнить сравнение строк
при использовании формата:



IF /I строка1 оператор_сравнения строка2 команда


где оператор_сравнения принимает следующие значения:


    EQL - равно
    NEQ - не равно
    LSS - меньше
    LEQ - меньше или равно
    GTR - больше
    GEQ - больше или равно

а ключ /I, если он указан, задает сравнение текстовых строк без учета
регистра. Этот обычно используется для сравнения текстовых строк в
форме строка1==строка2. Сравнения проводятся по общему типу данных,
так что если строки 1 и 2 содержат только цифры, то обе строки преобразуются в
числа, после чего выполняется их сравнение. Следовательно, для решения нашей
задачи нужно сравнить
строку из первых двух символов значения переменной TIME ( чч:мм:сс )
с заданным диапазоном :


REM Время меньше 12:00 - перейти на анализ второго условия, иначе - выход
if %time:~0,2% lss 12  goto tst2
exit
:tst2
Rem Время больше 10:00 - перейти к выполнению, меньше - завершить работу выполнив exit
if %time:~0,2% gtr 10  goto excalc
exit
:excalc
calc.exe




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



Пример создания архива каталога "Мои Документы".



   
Этот командный файл создает архивы содержимого папки
"Мои Документы" пользователей Win2K/XP, размещая их в каталоги

C:\ARHIV\Мои документы\Имя пользователя\Дата\время


Используются переменные окружения USERPROFILE, USERNAME, WINDIR.
Если вы разобрались с предыдущим примером, содержимое данного командного
файла не должно вызывать особых затруднений, поскольку в нем присутствуют
комментарии ( rem ), поясняющие в короткой форме смысл и назначение
последующих строк:


@echo off

rem Задается переменная FROM - откуда брать данные для архивирования

set FROM=%USERPROFILE%\Мои Документы

rem Задается переменная TO - куда помещать архивы

set TO=C:\arhiv\Мои документы\%USERNAME%

rem Создадим каталог ТО

md "%TO%\"

rem Сформируем имя подкаталога из текущей даты

set VDATE=%date:~-10%

rem Сформируем имя файла архива из текущего времени - 12:00:00.99

rem отбросим сотые доли секунды и заменим символ : на символ . Результат - 12.00.00



set vtime=%TIME:~0,-3%

set vtime=%vtime::=.%

rem Создадим подкаталог для файла архива

md "%TO%\%VDATE%"

rem Команда для архивирования. Ключ -r нужен для архивирования с вложенными папками

rem вариант для архиватора ARJ : arj.exe a -r "%TO%\%VDATE%\%VTIME%.arj" "%FROM%\*.*"

rem При использовании архиватора RAR:

rar.exe a -r "%TO%\%VDATE%\%VTIME%.rar" "%FROM%\*.*"



Если у вас возникнут проблемы связанные с неверной кодировкой символов
русского алфавита в именах файлов и каталогов, попробуйте воспользоваться командой
CHCP для смены кодовой страницы

chcp 866 - установить кодовую страницу 866 (DOS-кодировка)

chcp 1251 - установить кодовую страницу 1251 (Windows-кодировка)




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



В операционных системах Windows XP/Vista/7 формат даты по умолчанию не
содержит название дня недели. Если есть необходимость получить это значение
без изменения настроек системы и использования дополнительного программного
обеспечения, можно воспользоваться сценарием Hindows Script Host (WSH).


- создаем файл сценария для получения названия дня недели, пусть с именем
weekday.vbs, и содержащим строку вывода на экран результата выполнения
функции WeekDayName

WScript.Echo WeekDayName(Weekday(Now), True)

- выполняем скрипт WSH с использованием консольной
версии программы обработки сценариев cscript.exe и
подавлением лишних сообщений (ключ //nologo)

cscript //nologo weekday.vbs


Пример командного файла для получения названия дня недели с
использованием функции WeekDayName :

ECHO OFF

echo WScript.Echo WeekDayName(Weekday(Now), True) > weekday.vbs

for /f "Tokens=1*" %%i in ('cscript /nologo weekday.vbs') DO set DayName=%%i

echo %DayName%

REM Дальше можно использовать переменную DayName, а файл weekday.vbs - удалить

REM ERASE dayname.vbs

REM ...




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








Изменение даты и времени файлов или папок.



   
В Windows, к сожалению, не существует стандартного консольного средства для изменения даты и времени создания, доступа и модификации файлов и папок . Кто имел дело с Unix/Linux знает, что в этих операционных системах имеется простая и удобная утилита touch с помощью которой можно изменить время последнего доступа или время модификации файла на текущее значение или на значение времени, заданное в качестве аргумента командной строки. Если файл не существует, утилита создает пустой файл с указанным именем и устанавливает время создания , последнего изменения, и последнего доступа. Поэтому, нередко touch используют для создания пустых файлов.


Не секрет, что командная оболочка Unix/Linux значительно превосходит по своим возможностям командную строку Windows, поэтому, вполне понятно появление пакета UNIX Shell and Utilities для Windows NT и старше. Этот пакет представляет собой Windows-версии наиболее популярных утилит из среды Unix/Linux , которые могут выполняться как консольные команды в среде оболочки пользователя (в среде модуля sh.exe, входящего в пакет) или как исполняемые файлы в командной строке Windows. В набор входит
более 200 программ от компании Mortice Kern Systems (MKS),
рекомендуемых Microsoft в качестве средства миграции с Unix на Windows.


Благодаря набору UNIX Shell and Utilities многие, не решаемые в среде
командной строки Windows задачи, можно решить с помощью unix-подобных утилит.
И в том, числе, задачу изменения даты и времени создания, модификации и
доступа файла или папки с помощью утилиты
touch.exe Скачать, около 50Кб


Справку по работе с touch.exe можно получить при запуске утилиты с принятым в Unix ключом "--help"


touch.exe --help


При этом пользователю выводится краткая подсказка


touch [-acm] [-r|-f файл] [-t [[CC]YY]MMDDhhmm.[SS]] file файл


-a - Устанавливает время последнего доступа ( access )к файлу. Время последнего изменения не устанавливается, если явно не задан ключ -m ( modify )

-c - Указывает утилите не создавать файл, если он не существует.

-m - Устанавливает время последнего изменения файла.

-r file - Использовать значения времени из файла, заданного аргументом file.

-t time - Устанавливает время последнего изменения (модификации) и доступа в соответствии с указанным форматом date_time.

Формат даты, указанный в ключе -t задается в соответствии с шаблоном [[СС]YY]MMDDhhmm[.SS]:

СС - первые две цифры года (век).

YY - последние две цифры года.

MM - двузначный номер месяца.

DD - двузначный номер дня.

hh - значение часов даты.

mm - значение минут даты.

SS - значение секунд даты.


   
Примеры использования утилиты touch.exe в командной строке Windows:



touch C:\folder\myfile.txt - изменить время доступа и модификации файла C:\folder\myfile.txt на текущее. Если файл не существует, он будет создан с нулевой длиной и текущим временем создания, модификации и доступа.

touch C:\folder - изменить время доступа и модификации папки C:\folder на текущее.

touch -f C:\ntldr C:\folder - изменить время доступа и модификации папки C:\folder на время, установленное для файла C:\ntldr

touch -t 199803080102.00 C:\folder - установить для существующей папки "C:\folder" значение даты и времени модификации - 1998г., 8 марта, 1 час : 2 минуты :00 секунд

touch -t 1112.30 C:\folder - установить для существующей папки "C:\folder" значение даты и времени модификации - текущая дата, 11 час : 12 минут :30 секунд

touch -a -t 2222.20 C:\folder - изменить только время доступа, время модификации не изменяется.


   
Кроме утилиты touch для модификации времени
файлов (но не папок) можно воспользоваться простой и удобной программой
Юрия Усманова setdate . Скачать,
архив zip размером около 16Кб).


Примеры использования:


setdate.exe -c C:\1.txt 22.11.2011 - установить для файла C:\1.txt дату создания 22.11.2011

setdate.exe -m C:\1.txt 22.11.2011 - установить для файла C:\1.txt дату изменения (модификации) 22.11.2011

setdate.exe -a C:\1.txt 22.11.2011 - установить для файла C:\1.txt дату доступа 22.11.2011

setdate.exe -d C:\1.txt 22.11.2011 - установить для файла C:\1.txt все даты 22.11.2011








Выполнение команд по расписанию.



В операционных системах WINDOWS 2000/XP и старше существует утилита командной
строки AT.EXE, позволяющая управлять задачами для
планировщика заданий Windows, и таким образом, выполнить команду или
пакетный файл в указанное время на локальном или удаленном компьютере.

Естественно, для успешного функционирования команды AT необходимо,
чтобы была запущена системная служба Планировщик заданий (обычно
она существует и запускается автоматически при стандартной установке
системы).


Примеры команды

AT [\\имя_компьютера] [ [код] [/DELETE] | /DELETE [/YES]]

AT [\\имя_компьютера] время [/INTERACTIVE] [ /EVERY:день[,...] | /NEXT:день[,...]] "команда"


\\имя_компьютера - имя удаленного компьютера. Если этот параметр
опущен, задача относится к локальному компьютеру.

код - порядковый номер запланированной задачи.
Указывается если нужно отменить уже запланированную задачу с помощью
ключа /delete.


/delete - отменить запланированную задачу. Если код задачи опущен,
отменяются все задачи, запланированные для указанного
компьютера.

/yes - не будет запроса на подтверждение при отмене всех
запланированных задач.

время - Время запуска команды.


/interactive - интерактивный режим, разрешение взаимодействия
задачи с пользователем. Задачи, запущенные без этого ключа невидимы для
пользователя компьютера.


/every:день[,...] Запуск задачи осуществляется по указанным дням недели или
месяца. Если дата опущена, используется текущий день

месяца.

/next:день[,...] Задача будет запущена в следующий указанный день недели
(например в следующий четверг). Если дата опущена,
используется текущий день месяца.

"команда" - Команда или имя командного файла.



Примеры использования:



  • Просмотр списка запланированных задач:



  • AT
  • - Удаление уже спланированных задач:



  • AT 3 /DELETE - удаление задачи с номером 3

    AT /DELETE /YES - удаление всех задач без запроса подтверждения


  • Создание интерактивных задач


  • at \\SERVER 15:21 /interactive notepad.exe - на компьютере
    SERVER в 15:21 запустить видимое для пользователя приложение
    "Блокнот" (notepad.exe)

    AT 15:30 /interactive regedit.exe - в 15:30 запустить видимый
    редактор реестра на своем компьютере.




  • Аналог "будильника" - всплывающие окна с текстом, напоминающие о
    необходимости каких-либо действий. Для посылки сообщения удаленному
    пользователю используется утилита NET.EXE в режиме отправки
    сообщения SEND. На компьютерах должна быть запущена служба
    сообщений, иначе NET SEND не будет работать. В ОС Windows Vista и более поздних,
    отправку сообщений нужно выполнять с помощью утилиты msg.exe, поскольку
    команда net send в этих ОС больше не поддерживается. Описание команды MSG



  • AT 17:30 net.exe send COMP Пора домой - в 17:30 отправить сообщение
    "Пора домой" пользователю компьютера COMP

    AT 17:30 msg.exe * /server:COMP Пора домой - то же, что и в предыдущем случае, но с использованием команды msg


    AT 17:39 msg.exe * Пора домой - запланировать на 17:39 отправку текстового сообщения "Пора домой" всем пользователям данного компьютера
    в среде Windows Vista / 7 / 8

    AT \\PROXY 15:30 net.exe send COMP2 Test Message - создать задание на
    компьютере PROXY, чтобы в 15:30 им было отправлено сообщение "Test Message"
    на компьютер COMP2

    AT 15:45 net.exe send имя своего компьютера Task Scheduler test - в
    15:45 на своем компьютере показать сообщение "Task Scheduler test"


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


    Создаваемые командой AT задачи доступны для обработки в среде
    пользователя с помощью оснастки "Назначенные задания" Windows.


    Пуск - Панель управления - Назначенные задания - здесь можно
    просматривать, изменять и удалять созданные командой AT
    задачи. В Windows Vista / 7 используется меню - Панель управления - Администрирование - Планировщик заданий.







    Остановка и запуск системных служб.




     


    Для остановки и запуска служб из
    командной строки, в любой версии Windows, можно воспользоваться командой NET.EXE


    NET.EXE STOP < имя службы >


    NET.EXE START < имя службы >



    В качестве параметра команды можно использование как короткое, так и полное имя службы
    ("Dnscache" - короткое, "DNS-клиент" - полное имя службы).
    Имя службы, содержащее пробелы заключается в двойные кавычки.
    Пример перезапуска службы "DNS-клиент"




    net stop "DNS-клиент"


    net start "DNS-клиент"



    То же, с использованием короткого имени:

    net stop Dnscache


    net start Dnscache





    Полное имя службы можно скопировать из
    "Панель управления" - "Администрирование" - "Службы" - Имя службы -
    "Свойства" - "Выводимое имя".

    То же самое, но в режиме командной
    строки: "Пуск" - "Выполнить" - services.msc.


    Для управления службами гораздо удобнее воспользоваться утилитой
    PsService.exe из
    утилит PsTools
    Утилита не требует установки и работает в любой OS Windows. Кроме запуска и
    остановки, позволяет выполнить поиск конкретной службы на компьютерах локальной сети, опросить состояние и конфигурацию службы, изменить тип запуска, приостановить службу,
    продолжить, перезапустить.






       
    Для работы с системными службами в Windows XP и старше, можно использовать
    утилиту sc.exe,
    позволяющую не только остановить/запустить службу, но и опросить ее
    состояние, параметры
    запуска и функционирования, изменить конфигурацию, а также работать не только
    с системными службами,
    но и с драйверами. При наличии соответствующих прав, можно управлять
    службами не только на локальной, но и на удаленной машине. Примеры:

    sc.exe stop DNSCache - остановить службу DNSCache на локальном компьютере.

    sc \\192.168.0.1 query DNSCache - опросить состояние службы DNSCache на компьютере c
    IP-адресом 192.168.0.1

    sc \\COMP start DNSCache запустить службу DNSCache на компьютере COMP

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

    sc /?







    Выдача значения переменной ERRORLEVEL .





       
    Этот простенький командный файл выдаст на экран значение переменной
    ERRORLEVEL по конкретной командной строке. Вначале выполняется проверка на
    наличие хотя бы одного
    входного параметра, и если ничего не задано, выдается сообщение об ошибке и происходит завершение
    по команде exit. Если же хотя бы один параметр задан, то входные
    параметры считаются командной
    строкой и выполняются, а значение ERRORLEVEL выдается с помощью команды ECHO.
    Содержимое файла (я назвал его echoEL.bat):



    @echo off

    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.




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



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

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

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



    set /p pset="Enter password - "

    echo Password is - %pset%



    Недостатком данного способа является невозможность продолжения выполнения командного
    файла при отсутствии ответа пользователя, поэтому очень часто вместо
    set используются сторонние программы. В составе операционных систем семейства
    Microsoft Windows имеется утилита командной строки CHOICE позволяющая
    довольно просто реализовать диалог с пользователем и проанализировать введенные
    им данные, однако в разных версия ОС утилита может присутствовать в стандартной
    поставке ( Windows 7 ) или входить в наборы дополнительных программных
    инструментов ( Resource Kit Windows XP ) Простейшая версия -
    CHOICE.COM
    Скачать (1.7кб), работающая во
    всех ОС семейства Windows.

    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 секунд


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


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

    Перенаправление вывода команды ping на фиктивное устройство nul ( > nul ) позволяет убрать сообщения утилиты ping.exe с экрана.


    В составе команд CMD Windows 7 имеется команда TIMEOUT для организации режима ожидания заданного интервала времени, либо до нажатия любой клавиши на клавиатуре. Описание команды - по ссылке "Список команд CMD Windows"








    Определение доступности IP-адреса



       
    Для проверки доступности сетевого узла используется упоминаемая выше стандартная утилита ping.exe. Утилита выполняет отправку ICMP-пакета на проверяемый узел (эхо-запрос) и ожидает ответный пакет (эхо-ответ). Результат проверки никак не отражается в переменной ERRORLEVEL и может быть получен только в данных стандартного вывода ping. Ненулевое значение ERRORLEVEL утилита ping.exe формирует только в том случае, если заданы ошибочные параметры командной строки. Иными словами, в некоторых случаях, нужный результат выполнения определенной команды нельзя определить по значению переменной ERRORLEVEL, и приходится анализировать, например, результат текстового вывода.


    Если внимательно посмотреть на сообщения программы ping.exe при опросе доступного и недоступного узла, то можно заметить, что они значительно отличаются :



    ping 456.0.0.1
    - ping на несуществующий адрес


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



    При проверке связи не удалось обнаружить узел 456.0.0.1. Проверьте имя узла и повторите попытку.





    ping yandex.ru
    - ping на адрес узла yandex.ru


    Ответ на ping доступного узла:



    Обмен пакетами с yandex.ru [87.250.250.11] по 32 байт:

    Ответ от 87.250.250.11: число байт=32 время=10мс TTL=55



    Таким образом, для решения задачи определения доступности узла в командном файле, достаточно проанализировать характерные слова в выводе ping.exe при успешном ответе. Наиболее характерно в данном случае наличие слова TTL. Оно никогда не встречается при возникновении ошибки и состоит всего лишь из символов английского алфавита.
    Для поиска "TTL" в результатах ping.exe удобнее всего объединить ее выполнение в цепочку с командой поиска строки символов FIND.EXE (конвейер ping и find). Справку по использованию можно получить командой



    find /?





    Поиск текстовой строки в одном или нескольких файлах.


    FIND [/V] [/C] [/N] [/I] [/OFF[LINE]] "строка" [[диск:][путь]имя_файла[ ...]]


    /V Вывод всех строк, НЕ содержащих заданную строку.

    /C Вывод только общего числа строк, содержащих заданную строку.

    /N Вывод номеров отображаемых строк.

    /OFF[LINE] Не пропускать файлы с установленным атрибутом "Автономный".

    /I Поиск без учета регистра символов.

    "строка" Искомая строка.

    [диск:][путь]имя_файла

    Один или несколько файлов, в которых выполняется поиск.


    Если путь не задан, поиск выполняется в тексте, введенном с клавиатуры

    либо переданном по конвейеру другой командой.


    Как видно из справки, find.exe можно использовать для поиска нужной строки символов в тексте, переданном по конвейеру командой ping.exe. Если текст найден, значение переменной ERRORLEVEL будет равно 0



    ping -n 1 COMPUTER | find /I "TTL" > nul

    if %ERRORLEVEL%==0 goto LIVE

    ECHO computer не доступен

    подпрограмма обработки недоступного состояния

    ...

    Exit

    :LIVE - начало подпрограммы обработки состояния доступности узла

    ...

    ...





    В конвейер добавлена команда перенаправления стандартного вывода на
    фиктивное устройство nul, т.е. подавление вывода.
    Ключ -n 1 задает однократный опрос узла COMPUTER для ping.exe.













    Определение текущей версии Windows.



       
    Так же, как и в предыдущем примере, для определения версии операционной системы в процессе выполнения командного файла, можно воспользоваться поиском определенных фрагментов текста в результатах выполнения команд, отображающих сведения о системе. Например, во всех операционных системах семейства Windows ( и даже в DOS ) существует специальная команда VER, предназначенная для отображения сведений о версии ОС. В результате выполнения команды, например, в среде Windows XP, отображается текст:


    Microsoft Windows XP [Версия 5.1.2600]


    В среде Windows 7, текст отличается:


    Microsoft Windows [Version 6.1.7600]


    Таким образом, результат выполнения команды VER в среде разных версий Windows, всегда содержит определенный текст, характерный только для данной ОС, и задача определения версии решается довольно просто:


    @echo off
    set curr_OS=
    REM
    ver | find /i "5.0"
    if %errorlevel% == 0 set curr_OS=Windows 2000
    REM
    ver | find /i "5.1"
    if %errorlevel% == 0 set curr_OS=Windows XP
    REM
    ver | find /i "5.2.3"
    if %errorlevel% == 0 set curr_OS=Windows Server 2003
    REM
    ver|find /i "6.0"
    if %errorlevel% == 0 set curr_OS=Windows Vista
    REM
    ver | find /i "6.1">nul
    if %errorlevel% == 0 set curr_OS=Windows 7
    REM
    if "%curr_OS%"=="" set curr_OS=Unknown
    echo Текущая версия ОС - %curr_OS%
    




    Можно также воспользоваться более информативным выводом команды NET CONFIG WORKSTATION. При выполнении в среде Windows XP вывод команды представляет собой следующий текст:



    Имя компьютера                                \\COMP1
    Полное имя компьютера                         COMP1.Mydomain
    Имя пользователя                              USER2
    
    Активная рабочая станция на                   
    	NetbiosSmb (000000000000)
    	NetBT_Tcpip_{F53DEAF8-0AF5-4875-B565-8ED55C594769} (000D87009D28)
    
    Версия программы                              Windows 2002
    
    Домен рабочей станции                         Mydomain
    DNS-имя домена рабочей станции                Mydomain
    Домен входа                                   Mydomain
    
    Интервал ожидания открытия COM-порта (с)      0
    Отсчет передачи COM-порта (байт)              16
    Таймаут передачи COM-порта (мс)               250
    Команда выполнена успешно. 
    




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



    Имя компьютера                                \\COMP1
    Полное имя компьютера                    COMP1.Mydomain
    Имя пользователя                              user2
    
    Активная рабочая станция на                   
    	NetBT_Tcpip_{F53DEAF8-0AF5-4875-B565-8ED55C594769} (000D87009D28)
    
    Версия программы                              Windows 7 Professional
    
    Домен рабочей станции                         Mydomain
    Домен входа                                   Mydomain
    
    Интервал ожидания открытия COM-порта (с)      0
    Отсчет передачи COM-порта (байт)              16
    Таймаут передачи COM-порта (мс)               250
    Команда выполнена успешно.
    



    Как видим, строка Версия программы . . . тоже может быть использована для определения версии Windows, в среде которой выполняется командный файл. Кроме того, в результатах выполнения команды NET CONFIG WORKSTATION для серверных версий Windows всегда присутствует слово Server.


    @echo off
    set curr_OS=
    REM
    net config workstation | find /i "Windows 2000"
    if %errorlevel% == 0 set curr_OS=Windows 2000
    REM
    net config workstation | find /i "Windows 2002"
    if %errorlevel% == 0 set curr_OS=Windows XP
    REM
    net config workstation | find /i "Server 2003"
    if %errorlevel% == 0 set curr_OS=Windows Server 2003
    REM
    net config workstation|find /i "Windows Vista"
    if %errorlevel% == 0 set curr_OS=Windows Vista
    REM
    net config workstation | find /i "Windows 7">nul
    if %errorlevel% == 0 set curr_OS=Windows 7
    REM Плюс поиск по "Professional"
    net config workstation | find /i "Версия программы" | find "Professional"
    if errorlevel 0 if not errorlevel 1 set curr_OS=Windows 7 PRO
    REM Если версия неизвестна:
    if "%curr_OS%"=="" set curr_OS=Unknown
    echo %curr_OS%
    









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




       
    Для реализации этого скрипта используются утилиты из пакета 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\SYSTEM32. Пользователь, запускающий его, должен обладать правами администратора по отношению к сканируемым компьютерам.
    И, если текущий пользователь таковым не является, то в параметры запуска утилит 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

    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.EXE 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 .

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


    http://ab57.ru/cmd.html

    This account has disabled anonymous posting.
    If you don't have an account you can create one now.
    HTML doesn't work in the subject.
    More info about formatting

    Profile

    uzverss: (Default)
    uzverss

    December 2024

    S M T W T F S
    12345 67
    891011121314
    15161718192021
    22232425262728
    293031    

    Most Popular Tags

    Style Credit

    Expand Cut Tags

    No cut tags
    Page generated Jan. 22nd, 2026 11:27 pm
    Powered by Dreamwidth Studios