Командные файлы WindowsОбщие сведения о командных файлах. Использование переменных окружения. Передача параметров командному файлу. Переходы и метки. Примеры использования командных файлов:     - Создание пустых файлов     - Присвоение съемному диску одной и той же буквы.     - Создание поколений архивов по датам и времени.     - Создание архивов - более сложный вариант.     - Выполнение команд по расписанию.     - Запуск и остановка служб.     - Выдача на экран значения ERRORLEVEL.     - Диалог с пользователем.     - Задержки в командных файлах.     - Поиск в локальной сети компьютеров с запущенным приложением.     - Поиск компьютеров с запущенным приложением по списку.     - Выключение компьютеров по списку, созданному на основе сетевого окружения.     - Работа с оконными приложениями. Типовые ошибки при написании командных файлов. Использование командных файлов в сценариях регистрации. Общие сведения о командных файлах. Командные файлы (сценарии, скрипты, пакетные файлы) – это обычные текстовые файлы с расширением bat или cmd, строки которых представляют собой команды, предназначенные для последовательного считывания и выполнения стандартным средством операционной системы - интерпретатором команд (command line interpreter), часто называемым командным процессором или командной оболочкой (command shell). В качестве интерпретатора команд современных ОС семейства Windows используется приложение cmd.exe ”Командная строка”. Для MS DOS и семейства Windows9X/Me в качестве интерпретатора команд использовался исполняемый файл command.com. Использование переменных окружения.В командных файлах можно, а нередко, даже и нужно использовать переменные окружения – переменные, значения которых характеризуют программно-аппаратную среду, в которой выполняется команда или пакетный файл. Такие переменные могут использоваться в командных файлах для определения версии ОС, привилегий учетной записи, в контексте которой выполняется команда, имена и расположение системных файлов и каталогов, дату, время и т.п. Обычно, значения стандартных переменных окружения формируются при загрузке ОС и регистрации пользователя в системе, но в командной оболочке можно создавать также и иные переменные с помощью команды SET , формат командной строки которой, выглядит следующим образом:SET [переменная=[строка]] где: переменная - имя переменной среды. строка - строка символов, присваиваемая указанной переменной. Например, командная строка SET mynane=Vasya добавит в среду окружения переменную myname, принимающую значение Vasya. И во всех последующих командах можно будет использовать это значение. Таким образом, например, можно создавать сценарии, оперирующие не с конкретными строковыми значениями (для каждого – свой), а с переменными, значения которых формируются непосредственно перед их выполнением. Значение, принимаемое конкретной переменной, можно получить используя ее имя, заключенное в знаки процента (%). Например команда вывода сообщений на дисплей echo в виде: ECHO time выведет на экран слово time, а команда BR> ECHO %time% отобразит на экране значение переменной time, что будет соответствовать текущему системному времени. Нередко команда SET используется для модификации уже существующих значений переменных: SET PATH=C:\myprogs;%PATH% - установить значение переменной PATH равное строке C:\myprogs; и текущему значению этой же переменной. Таким образом, будет изменен путь поиска исполняемых файлов, определяемый значением PATH с добавлением к нему каталога C:\myprogs в начало списка. При необходимости, можно добавить данный каталог в конец списка: SET PATH=%PATH%;C:\myprogs Для разделения элементов списка каталогов, определяемых переменной PATH, применяется точка с запятой ( ; ) Выполнение команды SET без параметров позволяет отобразить текущие значения переменных окружения, в виде: NUMBER_OF_PROCESSORS=1 - количество процессоров OS=Windows_NT- тип ОС Path=E:\WINDOWS\system32;E:\WINDOWS; - путь поиска исполняемых файлов. PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.JS;.WSH - расширения для исполняемых файлов. PROCESSOR_ARCHITECTURE=x86 - архитектура процессора. PROCESSOR_IDENTIFIER=x86 Family 6 Model 8 Stepping 1, AuthenticAMD - идентификатор процессора. PROCESSOR_LEVEL=6 - уровень (номер модели) процессора. PROCESSOR_REVISION=0801 - версия процессора. ProgramFiles=E:\Program Files - путь к папке "Program Files" PROMPT=$P$G - формат приглашения командной строки $P - путь для текущего каталога $G - знак ">". SystemDrive=E: - буква системного диска. SystemRoot=E:\WINDOWS - каталог ОС Windows. Некоторые переменные по команде SET не отображаются. Это переменные, значения которых динамически изменяются : %CD% - Принимает значение пути текущего каталога. %DATE% - Принимает значение текущей даты. %TIME% - Принимает значение текущего времени. %RANDOM% - Принимает значение случайного десятичного числа в диапазоне 1 - 32767. %ERRORLEVEL% - Принимает текущее значение кода завершения задачи ERRORLEVEL %CMDEXTVERSION% - Принимает значение версии командного процессора CMD.EXE для расширенной обработки команд. %CMDCMDLINE% - Принимает значение строки, которая вызвала командный процессор. Для просмотра значения переменной можно использовать следующую команду: ECHO %переменная%Передача параметров командному файлу.Командная оболочка предполагает возможность передачи командному файлу некоторых параметров командной строки и использования их значений в соответствии с логикой выполняемого алгоритма. BAT-файл < параметр1 > , < параметр2 >, ... < параметрN > При обработке командной строки, первый параметр будет доступен как переменная %1, второй - %2 и т.п. Имя самого командного файла доступно как переменная %0. Для примера создадим командный файл, задачей которого будет выдача на экран значений введенных параметров. Обычно для вывода текста используется команда ECHO < текст > В качестве элементов текста могут использоваться значения параметров командной строки. Например, если в текст добавить %1, - то будет выдан первый параметр, %2 - второй и т.д. Простейший пример – командный файл, например, с именем param.bat следующего содержания: echo Первый параметр=%1 echo Второй параметр=%2 echo Третий параметр = %3 Для запуска командного файла с указанием параметров используется командная строка: param.bat FIRST second “two words” Обратите внимание, что параметр, содержащий пробел, заключен в двойные кавычки. Для того, чтобы обрабатываемые командным процессором строки не выдавались на экран, можно воспользоваться командой ECHO OFF, поместив ее в первую строку командного файла. Если необходимо добавить комментарии, поясняющие алгоритм работы командного файла, используется команда: REM< пробел > текст Комментарии полезны в сложных или больших по объему сценариях. Пример файла с комментариями: rem ECHO OFF выключает режим вывода строк командного файла на экран REM будет выводиться только результат их выполнения. ECHO OFF echo Первый параметр=%1 echo Второй параметр=%2 echo Третий параметр = %3 Если команду ECHO OFF заменить на @ECHO OFF, то сама строка, которая выключает режим вывода, не будет отображаться. Переходы и метки.В командных файлах можно использовать команды условного перехода, меняющие логику их работы в зависимости от выполнения определенных условий. Для иллюстрации приемов использования условных переходов создадим командный файл, целью которого будет присвоение заранее определенной буквы диска для съемных носителей, в качестве которых будут использоваться флэш-диски. Условия таковы – есть 2 флэш-диска, один из которых должен быть виден в проводнике как диск X: а второй – как диск Y: независимо от того, в какой порт USB они подключены и какая буква назначена им системой. Будем считать, что реальные диски могут быть подключены как F: или G: Опознавание дисков будем выполнять по наличию файла с определенным именем (лучше такой файл сделать скрытым в корневом каталоге и назвать его как-нибудь необычно): Flashd1.let – на первом диске Flashd2.let – на втором Таким образом, задача командного файла заключается в том, чтобы проверить наличие на сменных дисках F: и G: файлов Flashd1.let или Flashd2.let и, в зависимости от того, какой из них присутствует, присвоить диску букву X: или Y: Для поиска файла на диске используем команду IF EXIST: IF EXIST имя_файла команда В качестве команды проще всего воспользоваться SUBST, сопоставляющей имя диска и каталог. SUBST X: C:\ - создает виртуальный диск X:, содержимым которого будет корневой каталог диска C: Создаем командный файл setXY.bat со следующими строками: @ECHO OFF IF EXIST G:\flashd1.let SUBST X: G:\ IF EXIST F:\flashd1.let SUBST X: F:\ IF EXIST G:\flashd2.let SUBST Y: G:\ IF EXIST F:\flashd2.let SUBST Y: F:\ После выполнения такого файла у вас появятся диски X: и Y: Но если такой файл выполнить повторно, команда SUBST выдаст сообщение об ошибке – ведь диски X: и Y: уже существуют. Желательно обойти выполнение SUBST, если виртуальные диски X: и Y: уже созданы, (или удалять их, используя SUBST с параметром –d перед подключением ). Модифицируем командный файл с использованием команды GOTO - передачи управления строке пакетного файла по метке. GOTO метка Метка должна находиться в отдельной строке и начинаться с двоеточия. Сделаем изменения в нашем командном файле, чтобы не возникало сообщений об ошибке: @ECHO OFF REM если не существует X: - то перейдем на метку SETX IF NOT EXIST X:\ GOTO SETX REM если существует X: - перейдем на проверку наличия Y: GOTO TESTY :SETX IF EXIST G:\flashd1.let SUBST X: G:\ IF EXIST F:\flashd1.let SUBST X: F:\ :TESTY REM если Y: существует – завершим командный файл. IF EXIST Y:\ GOTO EXIT IF EXIST G:\flashd2.let SUBST Y: G:\ IF EXIST F:\flashd2.let SUBST Y: F:\ REM выход из командного файла :EXIT В данном командном файле сообщение об ошибке SUBST исчезнет. Признаки ошибок при выполнении команд можно отслеживать и в самом командном файле, анализируя переменную ERRORLEVEL, значение которой формируется при выполнении большинства программ. Обычно ERRORLEVEL равно 0, если программа завершилась без ошибок и 1 – при возникновении ошибки. Могут быть и другие значения, если они предусмотрены в выполняемой программе. В качестве команды в строке командного файла можно использовать также командный файл. Причем, для передачи с возвратом обратно к точке выполнения вызывающего командного файла используется
команда CALL. Создадим командный файл test.bat, следующего содержания: Если же в командном файле test.bat убрать CALL , то возврат из файла 1.bat выполняться не будет. Кстати, используя передачу управления командному файлу, можно организовать его зацикливание. Попробуйте добавить в конец файла test.bat строку: CALL test.bat Выйти из зацикливания командного файла можно по нажатию комбинации CTRL-Break. Возможно использование команды CALL для вызова процедуры внутри командного файла. В этом случае в качестве аргумента используется не имя внешнего файла, а метка: .... call :proc1 .... :proc1 .... exit .... ПримерыСоздание файлов. В Windows нет специальной команды для создания файла, но без нее можно легко обойтись несколькими способами: COPY CON myfile.txt При выполнении этой команды данные с клавиатуры (устройство CON) будут заноситься в файл myfile.txt. Нажатие клавиши F6 или комбинации CTRL-Z завершит вывод. ECHO 1 > myfile.txt При выполнении этой команды будет создан файл myfile.txt, содержащий символ “1” COPY CON > myfile.txt < xyz При выполнении этой команды, как и в первом случае, используется копирование с консоли в файл, но вместо данных с клавиатуры используется ввод с несуществующего устройства xyz. Система выдаст сообщение, о том, что такого устройства не существует, но пустой файл myfile.txt будет успешно создан. Совсем простой вариант - копирование с фиктивного устройства с именем nul в файл. copy nul myfile.txt     Если вам часто приходится создавать пустые файлы, можно подготовить свой командный файл (например – newfile.bat или, что еще лучше, - nf.bat), а имя создаваемого файла передавать ему в качестве параметра при запуске. Содержимое файла: @ECHO OFF copy nul %1     Поместите этот командный файл в системный каталог (C:\windows\system32) или любой другой, имеющийся в путях поиска, задаваемых переменной PATH). Командная строка: newfile.bat myfile.txt или nf.bat myfile.txt или nf myfile.txt     Таким образом, мы получили команду nf для создания пустого файла в командной строке Windows. Присвоение съемному диску одной и той же буквы.    Задача заключается в том, чтобы съемный USB диск (флэш диск) был доступен всегда под одной и той же буквой, независимо от того, на каком компьютере он используется и как он подключен. Для ее решения воспользуемся уже упоминаемой выше командой SUBST. Выберем для съемного диска желаемую букву, например - X. Имя диска, с которого был запущен командный файл доступно как переменная %~d0. Создаем командный файл следующего содержания:@echo off subst X: %~d0\ что означает - создать виртуальный диск X:, которому сопоставлен физический диск, откуда был выполнен запуск командного файла. Дополнительное представление о подстановочных значениях переменной %0 можно получить из командного файла следующего содержания: @echo off ECHO ОБРАБАТЫВАЕТСЯ ФАЙЛ - %0 ECHO Дата/время создания/изменения командного файла - %~t0 ECHO Путь командного файла - "%~f0" ECHO Диск командного файла - %~d0 ECHO Каталог командного файла - "%~p0" ECHO Имя командного файла - %~n0 ECHO Расширение командного файла - %~x0 ECHO Короткое имя и расширение - %~s0 ECHO Атрибуты командного файла - %~a0 ECHO Размер командного файла - %~z0 Создание поколений архивов по датам и времени.    Решим следующую задачу - нужно создать архив файлов, находящихся в каталоге C:\Program Files\FAR. Имя архивного файла должно состоять из текущего времени (часы.минуты.секунды - ЧЧ.ММ.СС.rar), и помещен он должен в новый каталог, имя которого должно состоять из текущей даты (день.месяц.год - ДД.ММ.ГГГГ). Для архивирования будем использовать архиватор RAR. Формат запуска для создания архива:RAR a -r < путь и имя архива > < Путь и имя архивируемых данных > a - параметр, задающий добавление файлов в архив (для создания архива). -r - параметр, определяющий архивирование подкаталогов (т.к. в исходной папке есть подкаталоги). Таким образом, для решения задачи нужно правильно создать имена и пути для RAR. Для чего воспользуемся следующими факторами: Дата, получаемая из переменной %DATE% при стандартных настройках региональных установок выглядит следующим образом: Пн 21.01.2005 - День недели(2 символа)-Пробел-дата(10 символов) Для примера, создадим каталог командой MD < имя каталога >. Создаем в памяти временную переменную VDATE и присваиваем ей значение переменной окружения DATE, без первых 3-х символов - 20.01.2018: set VDATE=%date:~3% Создаем каталог на диске C:, имя которого = текущая дата из переменной VDATE: MD C:\%VDATE% После выполнения этой команды на диске C: будет создан каталог с именем 20.01.2018 Время, получаемое из переменной %TIME%: 14:30:59.93 - Часы, минуты, секунды, сотые доли секунды. Сотые доли - это в имени файла архива, пожалуй, лишнее. Создаем временную переменную VTIME и присваиваем ей текущее время без последних 3-х символов set VTIME=%time:~0,-3% Теперь VTIME = 14:30:59, но знак " : " в имени файла использовать нельзя, поэтому заменим его на точку. set VTIME=%VTIME::=.% Переменная VTIME примет значение 14.30.59 . Его вполне можно использовать в качестве имени файла. Для запуска архивирования будет использоваться команда: rar a -r C:\%VDATE%\%VTIME%.rar "C:\Program files\far\*.*" Предполагается, что архиватор rar.exe находится в текущем каталоге или в каталоге исполняемых файлов, определяемом переменной PATH. Например, при установленном в системем, бесплатном архиваторе 7-Zip, можно использовать командную строку с указанием полного пути исполняемого файла: "C:\Program Files\7-Zip\7z.exe a -r %TO%\%VDATE%\%VTIME%.7z" "C:\Program files\far\*.*" Теперь можно создать командный файл с содержимым: set VDATE=%date:~3% md c:\%VDATE% set VTIME=%time:~0,-3% set VTIME=%VTIME::=.% rar a -r C:\%VDATE%\%VTIME%.rar "C:\Program files\far\*.*"     Такой командный файл можно выполнять через автозагрузку, или как часть скрипта, при входе пользователя в домен, либо с помощью планировщика в заданное время, и у вас всегда будут в наличии упорядоченные по времени архивы критических данных. Создание архивов с использованием переменных профиля пользователя.    Этот командный файл создает архивы содержимого папки "Мои Документы" пользователя, размещая их в каталогC:\ARHIV\Мои документы\Имя пользователя\Дата\время Для решения данной задачи используются переменные USERPROFILE, USERNAME, WINDIR. Содержимое командного файла снабжено комментариями и не должно вызывать особых затруднений, если вы разобрались с предыдущим примером: @echo off rem Задается переменная FROM - откуда брать данные для архивирования set FROM=%USERPROFILE%\Мои Документы rem Задается переменная TO - куда помещать архивы set TO=C:\arhiv\Мои документы\%USERNAME% rem Создадим каталог ТО md "%TO%\" rem Сформируем имя подкаталога из текущей даты rem текущая дата при настройках по умолчанию для Win2K - Пн 25.04.2018 rem текущая дата при настройках по умолчанию для WinXP и старше - 25.04.2018 rem Из текущей даты сформируем имя подкаталога - 25.04 rem По умолчанию Windir для WinXP и старше - C:\WINDOWS, а для Win2K - C:\WINNT IF /I %Windir% == C:\WINNT GOTO Win2K set vdate=%DATE:~0,-5% GOTO SetFileName :Win2K set vdate=%DATE:~3,-5% rem Сформируем имя файла архива из текущего времени - 12:00:00.99 rem отбросим сотые доли секунды и заменим символ : на символ . Результат - 12.00.00 :SetFileName set vtime=%TIME:~0,-3% set vtime=%vtime::=.% rem Создадим подкаталог для файла архива md "%TO%\%VDATE%" rem Команда для архивирования. Ключ -r нужен для архивирования с вложенными папками rem вариант для архиватора ARJ, который имеется в путях поиска rem исполняемых файлов : arj a -r "%TO%\%VDATE%\%VTIME%.arj" "%FROM%\*.*" rem При использовании архиватора 7-zip: "C:\Program Files\7-Zip\7z.exe a -r %TO%\%VDATE%\%VTIME%.rar" "%FROM%\*.*" Выполнение команд по расписанию.В операционных системах семейства Windows существует утилита командной строки для управления заданиями планировщика at.exe. Главное ее назначение - выполнить команду или пакетный файл в указанное время на локальном или удаленном компьютере. В настоящий момент утилита считается устаревшей и Microsoft рекомендует использовать вместо нее более функциональную, но и относительно сложную в использовании Schtasks.exe. Тем не менее, для освоения приемов работы с планировщиком заданий, возможностей at.exe вполне достаточно.Формат командной строки: AT [\\имя_компьютера] [ [код] [/DELETE] | /DELETE [/YES]] AT [\\имя_компьютера] время [/INTERACTIVE] AT [ /EVERY:день[,...] | /NEXT:день[,...]] "команда" Параметры командной строки: \\имя_компьютера - Имя удаленного компьютера. Если этот параметр опущен, то используется локальный компьютер. код - Порядковый номер запланированной задачи. Указывается если нужно отменить уже запланированную задачу с помощью ключа /delete. /delete - Отмена запланированной задачи. Если код задачи опущен, отменяются все задачи, запланированные для указанного компьютера. /yes - Подавление запроса на подтверждение при отмене всех запланированных задач. время - Время запуска команды. /interactive - Разрешение взаимодействия задачи с пользователем, работающим на компьютере во время запуска задачи. Задачи, запущенные без этого ключа невидимы для пользователя компьютера. /every:день[,...] - Запуск задачи осуществляется по указанным дням недели или месяца. Если дата опущена, используется текущий день месяца. /next:день[,...] - Задача будет запущена в следующий указанный день недели (например в следующий четверг). Если дата опущена, используется текущий день месяца. "команда" - Команда или имя пакетного файла. - Аналог “будильника” , - всплывающие окна с текстом, напоминающие текущему или указанному пользователю о необходимости выполнения каких-нибудь действий. Для отправки сообщения пользователю Win2k/XP можно использовать стандартную утилиту NET.EXE, а для более поздних версий Windows – MSG.EXE. Необходимо учитывать, что утилита msg.exe прекрасно подходит для обмена сообщениями между сеансами локальных и терминальных пользователей в пределах одной системы, однако, в случаях обмена между разными компьютерами локальной сети, потребуется изменить некоторые настройки безопасности, принятые по умолчанию в операционных системах Windows 7 и более поздних. Подробности – по ссылке с описанием утилиты, приведенной выше. AT 13:50 net.exe send * Пора пить кофе AT 13:50 c:\windows\system32\msg.exe * Пора пить кофе AT 17:50 net.exe send User Пора домой AT \\SERVER 13:45 c:\windows\system32\msg.exe mydomain\admin /SERVER:SRV001 Нужно перезагрузить сервер - Просмотр списка запланированных задач: AT - Удаление уже спланированных задач: AT 3 /DELETE – удаление задачи с номером 3 AT /DELETE /YES – удаление всех задач Создаваемые в командной строке задания доступны через оснастку планировщика заданий панели управления. Остановка и запуск системных служб.Для остановки и запуска служб из командной строки можно воспользоваться стандартными утилитами NET.EXE и SC.EXE. Последняя обладает широкими возможностями для конфигурирования, опроса состояния, остановки, запуска, удаления и добавления системных служб. NET.EXE STOP < имя службы > NET.EXE START < имя службы > Возможно использование как короткого, так и полного имени ("Dnscache" - короткое, "DNS-клиент" - полное имя службы). Имя службы, содержащее пробелы заключается в двойные кавычки. Пример перезапуска службы “DNS-клиент” net stop "DNS-клиент" net start "DNS-клиент" Те же действия, но с использованием короткого имени: net stop Dnscache net start Dnscache Полное имя службы можно скопировать из “Службы” – < Имя службы > - “Свойства” - “Выводимое имя” Возможности утилиты sc.exe отличаются в разных версиях ОС Windows, но функции опроса состояния, остановки и запуска служб одинаковы. Кроме того, данная утилита позволяет управлять службами не только на локальной, но и на удаленной машине. Примеры: sc.exe stop DNSCache - остановить службу DNSCache на локальном компьютере. sc \\192.168.0.1 query DNSCache - опросить состояние службы DNSCache на компьютере c IP-адресом 192.168.0.1 sc \\COMP0 start DNSCache запустить службу DNSCache на компьютере COMP0 Подсказку по работе с утилитой можно получить, введя: 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%     - будет выполнена команда NET SHARE (выдать список разделяемых сетевых ресурсов) и выдан код ERRORLEVEL echoEL.bat NET SHARE X"="C:\     - будет выполнена команда NET SHARE X:=C:\ (создать разделяемый сетевой ресурс с именем X, и путем в корневой каталог диска C:) Обратите внимание на то, что символ = заключен в двойные кавычки.     Перечисленные выше примеры задают корректную командную строку. Но попробуйте задать неверный параметр для NET.EXE или вообще несуществующую команду и вы увидите, какое значение примет ERRORLEVEL. Также, нужно учитывать, что командная строка реально выполняется и, например, вариант "echoEL.bat RD C:\Mydocs" приведет к удалению каталога Mydocs на диске C: . Диалог с пользователем
   
Для диалога с пользователем можно использовать команду:SET /P < имя переменной >=< текст > при выполнении которой, на экран выдается текстовое сообщение < текст > и ожидается ввод ответного текста. Пример - выполним запрос пароля и присвоим его значение переменной "pset": set /p pset="Enter password - " echo Password is - %pset% Недостатком данного способа является невозможность продолжения выполнения командного файла при отсутствии ответа пользователя, поэтому очень часто вместо стандартной команды set используются специальные программы. Одна из них - CHOICE. В большинстве версий ОС семейства утилита отсутствует в стандартной поставке и входит в состав дополнительных инструментов поддержки. Скачать (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, можно создавать командные файлы, логика работы которых, определяется диалогом с пользователем по ходу их выполнения. Задержки в командных файлахПри выполнении некоторых операций, например, при остановке или запуске системных служб, командный файл получает управление еще до того, как реально выполнится предыдущая команда. В результате возможна неправильная интерпретация программных событий, вызванная отсутствием задержки, необходимой для выполнения предыдущей команды. В ОС Windows Vista и более поздних для организации задержек используется стандартная команда TIMEOUT. Формат командной строки:TIMEOUT [/T] таймаут [/NOBREAK] Параметры командной строки: /T таймаут - Время ожидания в секундах. Допустимый интервал: от -1 до 99999 секунд. /NOBREAK - Игнорировать нажатия клавиш, ждать указанное время. /? - Вывод справки по использованию. Примечание: значение таймаута, равное -1 задает неограниченное время ожидания до нажатия клавиши. Примеры: TIMEOUT /? - отобразить краткую справку по использованию команды TIMEOUT /T 10 установить режим ожидания 10 секунд. На экран выдается информационное сообщение с отсчетом оставшегося до завершения интервала времени ( 10, 9, 8 секунд . . . ): Время ожидания 10 сек., нажмите любую клавишу для продолжения Нажатие любой клавиши приведет к прерыванию таймаута и переходу к выполнению следующей команды. TIMEOUT /T 300 /NOBREAK - установить интервал ожидания 300 секунд. Нажатие любых клавиш на клавиатуре игнорируется. Также, имеется удобная, но входящая только в в состав дополнительного пакета Resource Kit, команда SLEEP. Формат командной строки: sleep секунды sleep -m миллисекунды Примеры: sleep 10 установить режим ожидания 10 секунд. sleep –m 2500 - установить интервал ожидания 2500 миллисекунд (2.5 секунды). Для прерывания команды sleep можно использовать комбинации клавиш CTRL+C или CTRL+Break. Также можно воспользоваться ранее рассмотренной командой CHOISE без вывода текста и с автоматическим формированием ответа через nn секунд (1-99): choice.com /T:y,10 /N     - задержка на 10 секунд     Более универсальный способ основан на опросе командой PING интерфейса замыкания на себя (петлевого интерфейса) нужным количеством пакетов. PING для петлевого интерфейса (имя хоста - localhost или IP- адрес 127.0.0.1) выполняется без реальной передачи данных, т.е. практически мгновенно, а интервал между отправкой ICMP-пакетов составляет 1 секунду. Указывая количество пингов с помощью ключа "-n" можно получить задержку на n секунд: ping 127.0.0.1 -n 30 > nul     - даст задержку на 30 секунд Поиск компьютеров с запущенным приложениемВ состав современных ОС семейства Windows входит стандартная утилита командной строки TASKLIST, предназначенная для получения списка процессов, выполняющихся на локальном или удаленном компьютере в данный момент времени. При использовании команды без параметров, отображается список процессов выполняющихся на локальном компьютере. Для получения списка процессов на удаленном компьютере используется ключ /S: tasklist /S comp0 - отобразить список процессов, выполняющихся на компьютере comp0. Для обнаружения выполняющегося процесса с конкретным именем, например, chkdsk.exe используется выполнение TASKLIST в цепочке с командой FIND: tasklist /S comp0 | find /I ”chkdsk.exe” При необходимости, в командной строке указывается имя пользователя и пароль для доступа к удаленному компьютеру: tasklist /S comp0 /U user1 /P mypasswd | find /I ”chkdsk.exe” Кроме стандартной утилиты tasklist.exe можно воспользоваться утилитой PSList из комплекта сервисных программ PSTools сайта Windows Sysinternals. Краткое описание пакета программ PSTools с примерами. Утилита PSList проще в использовании и работает немного быстрее, по сравнению с TASKLIST, что особенно заметно при ее использовании для получения списка процессов, выполняющихся на удаленном компьютере. Создадим командный файл, который будет выполнять поиск в локальной сети компьютеров с выполняющейся программой, имя которой (начальная часть имени) задается в качестве параметра при запуске, например, 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 будет выглядеть следующим образом: 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 нужно добавить ключи, задающие имя пользователя и пароль. Вместо данных утилит можно использовать стандартные TASKLIST и TASKKILL Поиск компьютеров с запущенным приложением по списку.    В предыдущем примере использовался прямой перебор 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 или MSG.         Окончательное содержимое командного файла: @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 ) С использованием команды MSG, последняя строка будет выглядеть следующим образом: IF NOT ERRORLEVEL 1 msg.exe /SERVER:%COMPUTERNAME% Компьютер - %%i процесс - %1 Выключение компьютеров по списку, созданному на основе сетевого окружения.    Предыдущий пример можно использовать для создания командного файла, задачей которого является выключение всех компьютеров в локальной сети. Выключение питания производится утилитой PsShutdown.exe из упоминаемого ранее пакета утилит PSTools или стандартной командой shutdown –s. Как и в предыдущем примере, сначала создается файл со списком компьютеров на основе сетевого окружения, а затем выполняется их поочередное выключение, при условии, что имя компьютера не равно текущему (иначе он может выключиться до окончания выполнения командного файла). Содержимое файла: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 ) В случае, когда для выключения питания компьютеров используется стандартная утилита Windows shutdown.exe предпоследняя строка командного файла имеет следующее значение: IF /I %%i NEQ %COMPUTERNAME% shutdown -s -t 0 -m %%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 Работа с оконными приложениями.
   
Допустим, вам нужно из одного и того же командного файла запустить notepad.exe
и cmd.exe. Если просто вставить строкиnotepad.exe cmd.exe то после запуска notepad.exe выполнение командного файла приостановится и пока не будет завершен notepad, cmd.exe не запустится. Самый простой способ обойти эту проблему - использовать стандартную утилиту Windows 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 без установки. Позволяет получить список окон, перемещать, изменять размеры, переименовывать, сворачивать/разворачивать, активировать/деактивировать, закрывать, скрывать окна приложений и многое другое. Справку можно получить по команде: cmdow /? Используется около 30 ключей. Описание на русском языке найдете здесь. Некоторые примеры: 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" - то будет скрыто и его окно. Типовые ошибки в командных файлах.Как правило, причиной является тот факт, что на момент выполнения вашего командного файла переменные среды могут быть совсем другими, чем на момент его написания и запуска из командной строки. Например, в командном файле используется запуск приложения myprog.exe, находящегося в каталоге SCRIPTS на диске D: . Если в командном файле используется имя модуля без полного пути … MYPROG.EXE и если каталог D:\SCRIPTS не прописан в путях поиска (переменная PATH ) то модуль MYPROG.EXE может быть найден и выполнен только если текущим каталогом является D:\SCRIPTS. Но если вы укажете полный путь к myprog.exe … D:\SCRIPTS\myprog.exe
То программа будет найдена и выполнена в любом случае. Есть еще одна тонкость - нередко программа, указанная в командном файле использует для поиска своих компонент (dll, ini и т.п. ) собственный каталог. Но на момент ее выполнения текущим каталогом может быть любой (чаще всего – системный каталог Windows). Естественно, компоненты не находятся и программа не выполняется. Для устранения проблемы добавьте в командный файл команды, обеспечивающие переход в нужный каталог. Например, программа myprog.exe должна выполняться в каталоге D:\SCRIPTS: Rem Сменим текущий диск D: Rem перейдем в каталог SCRIPTS CD D:\SCRIPTS myprog.exe Прием со сменой каталога наиболее универсален и, как правило, всегда срабатывает. Причина в том, что при создании командных файлов вы использовали текстовый редактор, в котором русские символы представлены не в DOS-кодировке. Если в приведенном выше примере перезапуска службы “DNS-клиент” вы используете неверную кодировку, то русская часть имени службы не будет опознана из-за неверной кодировки и будет выдано сообщение, что указанная служба не установлена. Чтобы избежать проблем с русскими символами в командных файлах, используйте редактор с поддержкой DOS-кодировки, например, встроенный редактор файлового менеджера FAR. Переключение между кодировками в редакторе осуществляется нажатием F8 . С помощью FAR можно легко осуществлять перекодировку, скопировав (вырезав) текст в буфер обмена, затем нажав F8 и вставив текст из буфера.     Обычно это вызвано применением в командных файлах абсолютных значений вместо переменных среды окружения. Вместо C:\WINDOWS правильнее использовать %SYSTEMROOT%, потому, что на другом компьютере система может быть установлена в другой каталог или на другой диск. Старайтесь вместо имени командного файла использовать переменную %0 и ее подстановочные варианты (%~d0 - диск с которого запущен сценарий, %~dp0 - полный путь и т.д.).     Строки с переменными, принимающими значения имен файлов и каталогов лучше заключать в кавычки. Командная строка DIR %ProgramFiles% не выдаст вам содержимого каталога C:\Program Files , поскольку из-за наличия пробела будет интерпретирована как DIR C:\Program Командная строка DIR "%ProgramFiles%" выполнится верно.     Старайтесь использовать команды Setlocal и Endlocal, чтобы не оставлять мусор из переменных, созданных или модифицированных командным файлом. Использование командных файлов в сценариях регистрации пользователей .Командные файлы удобно использовать для выполнения каких-либо действий при регистрации пользователя в домене. Делается это с помощью вкладки "Profile" свойств пользователя домена. Сами командные файлы скриптов должны находиться в сетевой папке   Netlogon (Windows\ Ssysvol\ Domain\ Scripts , для Win2k - WINNT\SYSVOL \ DOMAIN \ SCRIPTS) контроллера домена, доступ на чтение к которой должен быть у всех пользователей, проходящих регистрацию. Страницы близкой тематики: Список команд, используемых в командной строке Windows. . - Перечень команд CMD Windows и краткая справка с примерами Работа с сетью в командной строке - Примеры использования командной строки для диагностики сетевых проблем, анализа состояния и настроек сетевых устройств. Настройка командной строки Windows - Примеры настроек приложения командной строки. Если вы желаете поделиться ссылкой на эту страницу в своей социальной сети, пользуйтесь кнопкой "Поделиться" |