Командный файл windows текущий каталог
Общие сведения о командных файлах.
Командные файлы – это текстовые файлы с расширением bat или cmd , строки которых представляют собой команды или имена исполняемых файлов. Когда вы запускаете на выполнение командный файл, то управление получает командный процессор операционной системы (часто называемый интерпретатором команд), который последовательно считывает и интерпретирует строки командного файла. Для Windows9X этим занимается command.com , для WinNT/2K/XP – cmd.exe . Строки командных файлов могут содержать команды самого процессора команд (FOR, GOTO, IF и т.п.) или имена исполняемых модулей (net.exe, regedit.exe, win.com и т.п.). В операционных системах WinNT/2K/XP можно получить краткую справку по составу команд с помощью командной строки:
или по конкретной команде:
HELP Имя команды
Для выдачи текста справки не на экран, а в файл, можно воспользоваться перенаправлением вывода . При использовании командной строки, стандартным устройством ввода является клавиатура, а устройством вывода – дисплей, однако эти устройства можно переназначить с использованием символов перенаправления
> — перенаправление вывода (или > > — перенаправление в существующий файл, когда выводимые данные дописываются в конец файла.)
Для вывода потока данных команды HELP в файл help.txt командная строка будет следующей:
Для вывода справки по команде GOTO в файл goto.txt:
HELP GOTO > goto.txt
Использование переменных окружения.
В командных файлах можно, а зачастую, и нужно использовать переменные окружения – переменные, значения которых характеризуют среду, в которой выполняется команда или пакетный файл. Значения переменных окружения формируются при загрузке ОС и регистрации пользователя в системе, а также могут быть заданы с помощью команды SET , формат которой:
переменная Имя переменной среды.
строка Строка символов, присваиваемая указанной переменной.
Например, командная строка
добавит переменную myname, принимающую значение Vasya.
Можно получить значение переменной в программах и командных файлах, используя ее имя, заключенное в знаки процента ( %) . Например команда
выведет на экран слово time, а команда
выведет на экран значение переменной time, принимающей значение текущего времени.
А командная строка
добавит в путь поиска исполняемых программ, описываемый значением переменной PATH каталог C:\myprog
Выполнение команды SET без параметров вызывают выдачу текущих значений переменных на экран, в виде:
NUMBER_OF_PROCESSORS=1 — количество процессоров
OS=Windows_NT- тип ОС
Path=E:\WINDOWS\system32;E:\WINDOWS;E:\Program Files\Far — путь поиска исполняемых файлов.
PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.JS;.WSF;.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% — Принимает значение строки, которая вызвала командный процессор.
Для просмотра значения переменной можно использовать командную строку:
Входные параметры для командного файла.
Существует возможность передать командному файлу параметры командной строки и использовать их значения в операторах самого командного файла.
В самом командном файле первый параметр будет доступен как переменная %1 , второй — %2 и т.п. Имя самого командного файла доступно как переменная %0 . Для примера создадим командный файл, задачей которого будет выдача на экран значений введенных параметров. Обычно для вывода текста используется команда
Однако если текст заменить на %1, — то будет выдан первый параметр, на %2 — второй и т.д.
Создаем файл parm.bat следующего содержания:
echo Первый параметр=%1
echo Второй параметр=%2
echo Третий параметр = %3
и запускаем его на выполнение следующей командой:
parm.bat FIRST second “two words”
после его выполнения вы поймете, как это работает и что параметры с пробелами, нужно заключать в двойные кавычки. Для того, чтобы обрабатываемые командным процессором строки не выдавались на экран, можно воспользоваться командой ECHO OFF , поместив ее в первую строку командного файла. Для того, чтобы строка командного файла игнорировалась командным процессором поместите в ее начало REM . Таким образом можно помещать комментарии, зачастую нелишние в больших командных файлах:
rem ECHO OFF выключает режим вывода содержания строк командного файла на экран
REM будет выводиться только результат их выполнения.
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 со следующими строками:
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 — передачи управления строке пакетного файла по метке.
Метка должна находиться в отдельной строке и начинаться с двоеточия. Сделаем изменения в нашем командном файле, чтобы не возникало сообщений об ошибке:
REM если не существует X: — то перейдем на метку SETX
IF NOT EXIST X:\ GOTO SETX
REM если существует X: — перейдем на проверку наличия Y:
IF EXIST G:\flashd1.let SUBST X: G:\
IF EXIST F:\flashd1.let SUBST X: F:\
REM если Y: существует – завершим командный файл.
IF EXIST Y:\ GOTO EXIT
IF EXIST G:\flashd2.let SUBST Y: G:\
IF EXIST F:\flashd2.let SUBST Y: F:\
REM выход из командного файла
Сообщение об ошибке SUBST исчезло. Признаки ошибок при выполнении команд можно отслеживать и в самом командном файле, анализируя переменную ERRORLEVEL , значение которой формируется при выполнении большинства программ. ERRORLEVEL равно 0, если программа завершилась без ошибок и 1 – при возникновении ошибки. Могут быть и другие значения, если они предусмотрены в выполняемой программе.
В качестве команды в строке командного файла можно использовать также командный файл. Причем, для передачи с возвратом обратно к точке выполнения вызывающего командного файла используется команда CALL . Создадим командный файл test.bat, следующего содержания:
ECHO Вызов 1.bat
И файл 1.bat, содержащий команду PAUSE , приостанавливающую выполнение командного файла до нажатия любой клавиши.
При выполнении test.bat будет выдано на экран сообщение
и управление получит 1.bat с командой pause. После начатия клавиши на клавиатуре управление получит командная строка “ECHO Возврат.” и на экран будет выдано
Если же в test.bat убрать CALL , то возврат из файла 1.bat выполняться не будет. Кстати, используя передачу управления командному файлу, можно организовать его зацикливание. Попробуйте добавить в конец файла 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 nul в файл.
copy nul myfile.txt
Если вам часто приходится создавать пустые файлы, можно подготовить свой командный файл (например – newfile.bat или, что еще короче — nf.bat), а имя создаваемого файла передавать ему в качестве параметра при запуске.
Поместите этот командный файл в системный каталог (C:\windows\system32 или любой другой, имеющийся в путях поиска, задаваемых PATH).
или
nf myfile.txt
Вот вам и команда nf для создания пустого файла в командной строке.
Присвоение съемному диску одной и той же буквы.
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 Размер командного файла — %
Создание поколений архивов по датам и времени.
Решим следующую задачу — нужно создать архив файлов, находящихся в каталоге C:\Program Files\FAR. Имя архивного файла должно состоять из текущего времени (часы.минуты.секунды — ЧЧ.ММ.СС.rar), и помещен он должен в новый каталог, имя которого должно состоять из текущей даты (день.месяц.год — ДД.ММ.ГГГГ). Для архивирования будем использовать архиватор RAR. Формат запуска для создания архива:
a — команда создания архива.
-r — ключ, определяющий архивирование подкаталогов (т.к. в исходной папке есть подкаталоги).
Таким образом, для решения задачи нужно правильно создать имена и пути для RAR. Для чего воспользуемся следующими факторами:
Дата, получаемая из переменной %DATE% при стандартных настройках региональных установок выглядит следующим образом:
Пн 21.01.2005 — День недели(2 символа)-Пробел-дата(10 символов)
Для примера, создадим каталог командой MD .
Создаем в памяти временную переменную VDATE и присваем ей значение переменной окружения DATE, без первых 3-х символов — 20.01.2005:
Создаем каталог на диске C:, имя которого = текущая дата из переменной VDATE:
MD C:\%VDATE%
После выполнения этой команды на диске C: будет создан каталог с именем 20.01.2005
Время, получаемое из переменной %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\*.*»
Теперь можно создать командный файл с содержимым:
3%
md c:\%VDATE%
set VTIME=%time:
0,-3%
set VTIME=%VTIME::=.%
rar a -r C:\%VDATE%\%VTIME%.rar «C:\Program files\far\*.*»
Такой командный файл можно выполнять через автозагрузку, или как часть скрипта, при входе пользователя в домен, либо с помощью планировщика в заданное время, и у вас всегда будут в наличии упорядоченные по времени архивы критических данных.
Создание архивов с использованием переменных профиля пользователя.
Этот командный файл создает архивы содержимого папки «Мои Документы» пользователей Win2K/XP, размещая их в каталоги
C:\ARHIV\Мои документы\Имя пользователя\Дата\время
Используются переменные USERPROFILE, USERNAME, WINDIR, поэтому в WIN9X этот командный файл работать не будет. (Хотя, при желании вы можете вставить в autoexec.bat команды для установки значений этих переменных и использовать его в однопользовательском варианте практически без изменений). Содержимое командного файла снабжено комментариями и не должно вызывать особых затруднений, если вы разобрались с предыдущим примером:
@echo off
rem Задается переменная FROM — откуда брать данные для архивирования
set FROM=%USERPROFILE%\Мои Документы
rem Задается ппеременная TO — куда помещать архивы
set TO=C:\arhiv\Мои документы\%USERNAME%
rem Создадим каталог ТО
md «%TO%\»
rem Сформируем имя подкаталога из текущей даты
rem текущая дата при настройках по умолчанию для Win2K — Пн 25.04.2005
rem текущая дата при настройках по умолчанию для WinXP — 25.04.2005
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 : arj a -r «%TO%\%VDATE%\%VTIME%.arj» «%FROM%\*.*»
rem При использовании архиватора RAR:
rar a -r «%TO%\%VDATE%\%VTIME%.rar» «%FROM%\*.*»
Выполнение команд по расписанию.
В WIN2K/XP существует утилита командной строки AT , позволяющая выполнить команду или пакетный файл в указанное время на локальном или удаленном компьютере. Для использования команды AT необходимо, чтобы была запущена служба планировщика заданий (обычно запущена по умолчанию при установке системы).
AT [\\имя_компьютера] [ [код] [/DELETE] | /DELETE [/YES]]
AT [\\имя_компьютера] время [/INTERACTIVE]
[ /EVERY:день[. ] | /NEXT:день[. ]] «команда»
\\имя_компьютера Имя удаленного компьютера. Если этот параметр опущен,
используется локальный компьютер.
код Порядковый номер запланированной задачи. Указывается если нужно отменить уже запланированную задачу с помощью ключа /delete .
/delete Отмена запланированной задачи. Если код задачи опущен,
отменяются все задачи, запланированные для указанного
/yes Отмена запроса на подтверждение при отмене всех
время Время запуска команды.
/interactive Разрешение взаимодействия задачи с пользователем,
работающим на компьютере во время запуска задачи. Задачи, запущенные без этого ключа невидимы для пользователя компьютера.
/every:день[. ] Запуск задачи осуществляется по указанным дням недели или
месяца. Если дата опущена, используется текущий день
/next:день[. ] Задача будет запущена в следующий указанный день недели
(например в следующий четверг). Если дата опущена,
используется текущий день месяца.
«команда» Команда или имя пакетного файла.
— Аналог “будильника” , — всплывающие окна с текстом, напоминающие текущему или указанному пользователю о необходимости выполнения каких-нибудь действий. Для отправки сообщения пользователю используем утилиту NET.EXE
AT 13:50 net.exe send * Пора пить кофе
AT 17:50 net.exe send User Пора домой
AT \\SERVER 13:45 net.exe send Нужно перезагрузить сервер
— Просмотр списка запланированных задач:
— Удаление уже спланированных задач:
AT 3 /DELETE – удаление задачи с номером 3
AT /DELETE /YES – удаление всех задач
“Панель управления” — “Назначенные задания” позволяют просматривать, изменять и удалять созданные командой AT задания.
Остановка и запуск системных сервисов.
Для остановки и запуска служб Win2K/XP из командной строки используется команда NET.EXE
Возможно использование как короткого, так и полного имени («Dnscache» — короткое, «DNS-клиент» — полное имя службы). Имя службы, содержащее пробелы заключается в двойные кавычки. Пример перезапуска службы “DNS-клиент”
net stop «DNS-клиент»
net start «DNS-клиент»
То же, с использованием короткого имени:
net stop Dnscache
net start Dnscache
Полное имя службы можно скопировать из “Службы” – — “Свойства” — “Выводимое имя”
Для управления службами гораздо удобнее воспользоваться утилитой PsService.exe из утилит PsTools Утилита не требует установки и работает в любой OS Windows. Кроме запуска и остановки службы, позволяет выполнить поиск конкретной службы на компьютерах локальной сети, опросить состояние и конфигурацию службы, изменить тип запуска, приостановить службу, продолжить, перезапустить.
Для работы с системными службами в Windows XP/7/8 можно использовать утилиту 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. И УЧТИТЕ, что командная строка реально ВЫПОЛНЯЕТСЯ и, например, вариант «echoEL.bat format A:» запустит форматирование дискеты в дисководе A:.
Диалог с пользователем
Для диалога с пользователем можно использовать команду:
SET /P =
при выполнении которой, на экран выдается текстовое сообщение и ожидается ввод ответного текста. Пример — выполним запрос пароля и присвоим его значение переменной «pset»:
set /p pset=»Enter password — »
echo Password is — %pset%
Недостатком данного способа является невозможность продолжения выполнения командного файла при отсутствии ответа пользователя, поэтому очень часто вместо set используются сторонние программы. Одна из них — CHOICE.COM Скачать (1.7кб).
CHOICE выдает пользователю текстовое сообщение и ожидает выбора одного из заданных вариантов ответа (нажатия клавиш на клавиатуре). По результатам выбора формируется переменная ERRORLEVEL, значение которой равно порядковому номеру выбора. По умолчанию вариантов выбора два — Y или N. Если ответ равен Y — то ERRORLEVEL=1, если N — то ERRORLEVEL=2. Можно использовать более 2-х вариантов выбора и есть возможность задать выбор по умолчанию, когда пользователь за определенное время не нажал ни одной клавиши. Формат командной строки:
CHOICE [/C[:]choices] [/N] [/S] [/T[:]c,nn] [text]
/C[:]choices — определяет допустимые варианты выбора. Если не задано — YN
/N — не выдавать варианты выбора.
/S — строчные и заглавные буквы отличаются.
/T[:]c,nn — Выбор по умолчанию равен «c» через «nn» секунд
text — Строка текста выводимая в качестве запроса
Создадим командный файл, демонстрирующий использование CHOICE. Он будет реагировать на нажатие клавиш «1»,»2″,3″ и «0» . При нажатии «0» выполняется завершение, а при нажатии остальных — сообщение пользователю. Если в течении 10 секунд ничего не нажато — завершение.
@ECHO OFF
:CHOICE
CHOICE /C:1230 /T:0,10 Ваш вариант
IF %ERRORLEVEL% EQU 4 GOTO EXIT
echo Ваш выбор=%ERRORLEVEL%
GOTO CHOICE
:EXIT
Теперь, используя CHOICE вы можете создавать командные файлы, логика работы которых может определяться пользователем.
Задержки в командных файлах
Когда-то, еще в DOS, для организации ожидания в командном файле использовалась удобная команда SLEEP, но затем она почему-то перекочевала из стандартного установочного набора Windows в дополнительный Resource Kit. Можно просто скопировать его оттуда в каталог \system32 и использовать в ваших командных файлах.
: SLEEP N — где N — количество секунд для задержки.
Если же Resource Kit нет под рукой, можно воспользоваться ранее рассмотренной командой CHOISE без вывода текста и с автоматическим формированием ответа через nn секунд (1-99):
choice.com /T:y,10 /N — задержка на 10 секунд
Более универсальный способ основан на пинговании петлевого интерфейса нужным количеством пакетов. Пинг для петлевого интерфейса (имя хоста — localhost или IP- адрес 127.0.0.1) выполняется без реальной передачи данных, т.е. практически мгновенно, а интервал между пингами составляет 1 секунду. Указывая количество пингов с помощью ключа «-n» можно получить задержку на n секунд:
ping 127.0.0.1 -n 30 > nul — даст задержку на 30 секунд
Поиск компьютеров с запущенным приложением
Для реализации этого скрипта используются утилиты из пакета PSTools (краткое описание). Создадим командный файл, выполняющий поиск в локальной сети компьютеров с выполняющейся программой, имя которой (начальная часть имени) задается в качестве параметра при запуске, например, game . При обнаружении будет послано сообщение на компьютер ADMINCOMP и обнаруженное приложение будет принудительно завершено. Для поиска будем использовать утилиту Pslist.exe и анализировать ее код возврата. Значение переменной ERRORLEVEL равное нулю означает, что утилита обнаружила на удаленном компьютере процесс, удовлетворяющий условиям поиска. Имя процесса для поиска будем задавать в качестве параметра при запуске командного файла. Присвоим нашему командному файлу имя psl.bat . Запуск с параметром будет выглядеть следующим образом:
psl.bat game
Для начала, нужно проверить, задан ли параметр в командной строке при запуске, и, если не задан, выдадим сообщение пользователю и завершим выполнение. Если же параметр задан — перейдем на метку » PARMOK «:
@echo off
if «%1» NEQ «» GOTO PARMOK
ECHO Нужно задать имя процесса для поиска
exit
:PARMOK
Теперь нужно обеспечить последовательное формирование IP-адресов компьютеров для командной строки PSlist. Проще всего это сделать с помощью присвоения временной переменной окружения (действительной только на время выполнения командного файла) значения постоянной составляющей адреса (например — 192.168.0.) и вычисляемого значения младшей части (например, в диапазоне 1-254). Для примера будем считать, что нам необходимо просканировать компьютеры в диапазоне адресов:
192.168.0.1 — 192.168.0.30:
set IPTMP=192.168.0. — старшая часть адреса
set /A IPLAST=1 — младшая часть. Ключ /A означает вычисляемое числовое выражение
set IPFULL=%IPTMP%%IPLAST% — значение полного IP-адреса.
Командная строка для PSlist будет выглядеть cледующим образом:
pslist \\%IPFULL% %1
Теперь осталось только циклически запускать PSlist, прибавляя в каждом цикле единицу к младшей части адреса, пока ее значение не достигнет 30 и анализировать значение ERRORLEVEL после выполнения. Для анализа результата будем выполнять переход командой:
GOTO REZULT%ERRORLEVEL%
обеспечивающей переход на метку REZULT0 при обнаружении процесса и на REZULT1 — при его отсутствии.
Окончательное содержимое командного файла:
@echo off
if «%1» NEQ «» GOTO PARMOK
ECHO Нужно задать имя процесса для поиска
exit
:PARMOK
set IPTMP=192.168.0.
rem Зададим начальное значение » хвоста » IP- адреса
set /A IPLAST=1
rem M0 — метка для организации цикла
:M0
rem Переменная IPFULL — полное значение текущего IP-адреса
set IPFULL=%IPTMP%%IPLAST%
rem Если » хвост «больше 30 — на выход
IF %IPLAST% GTR 30 GOTO ENDJOB
pslist \\%IPFULL% %1
GOTO REZULT%ERRORLEVEL%
:REZULT0
rem Если найдено приложение- отправим сообщение на ADMINCOMP
net send ADMINCOMP Запущено %1 — %IPFULL%
rem И завершим приложение с помощью PSkill
pskill \\%IPFULL% %1
:REZULT1
rem Сформируем следующий IP-адрес
set /A IPLAST=%IPLAST% + 1
rem Перейдем на выполнение следующего шага
GOTO M0
rem Завершение работы
:endjob
exit
В заключение добавлю, что для того, чтобы этот скрипт работал, PSlist.exe и PSkill.exe должны быть доступны в путях поиска исполняемых файлов, например в каталоге WINDOWS. Пользователь, запускающий его, должен обладать правами администратора по отношению к сканируемым компьютерам. И, если текущий пользователь таковым не является, то в параметры запуска утилит PSlist.exe и PSkill.exe нужно добавить ключи, задающие имя пользователя и пароль.
Поиск компьютеров с запущенным приложением по списку
В предыдущем примере использовался прямой перебор IP-адресов компьютеров в локальной сети, что не всегда удобно, поскольку в процедуру опроса оказываются вовлечены и выключенные компьютеры. Решим задачу другим способом. Создадим текстовый файл со списком компьютеров и опросим их по этому списку.
Список можно получить из сетевого окружения с использованием команды:
net.exe view > comps.txt
После выполнения такой команды файл comps.txt будет содержать список следующего вида:
Обрабатывать содержимое этого текстового файла будем с помощью команды FOR с ключом /F:
FOR /F [«ключи»] %переменная IN (имя файла) DO команда [параметры]
Данная команда позволяет получить доступ к строкам в текстовом файле с использованием ключей:
skip=n — пропустить n строк от начала файла (в нашем случае — 4 строки)
eol= — не использовать строки, начинающиеся с заданного символа. (в нашем случае — пропустить последнюю строку, начинающуюся с символа «К» — «Команда выполнена успешно»
tokens=n — брать для обработки n-е слово в строке (в нашем случае — 1-е слово)
Окончательный вид команды:
FOR /F «eol=К skip=4 tokens=1 » %%I IN (comps.txt) DO (
pslist.exe -u admin -p pass %%I %1
IF NOT ERRORLEVEL 1 net.exe send ADMINCOMP %%i %1
)
Обратите внимание — в пакетных файлах для переменных команды FOR используется два знака процента (запись %%переменная вместо %переменная ) и имена переменных учитывают регистр букв ( %i отличается от %I ).
Работать это будет следующим образом — пропускаются первые 4 строки текстового файла со списком компьютеров, и далее в цикле переменной I присваивается значение первого слова (текст от начала строки до разделителя — пробела), выполняется утилита PSlist.exe, для которой в качестве имени компьютера используется значение этой переменной. Если ERRORLEVEL менее 1 — задача с искомым именем присутствует в списке процессов и выполняется отправка сообщения с помощью NET SEND.
Окончательное содержимое командного файла:
@echo off
if «%1» NEQ «» GOTO PARMOK
ECHO Нужно задать имя процесса для поиска
exit
:PARMOK
REM
REM Создадим текстовый файл comps.txt со списком компьютеров с помощью NET VIEW
net view /DOMAIN:MyDomain > comps.txt
REM
REM FOR /F «параметры» — использование данных из файла
REM eol=К — не использовать строки, начинающиеся с «К» — «Команда выполнена успешно»
REM skip=4 — пропустить первые 4 строки в файле
REM tokens=1 — брать для обработки 1-е слово в строке
REM
FOR /F «eol=К skip=4 tokens=1 » %%i in (comps.txt) do (
pslist.exe -u admin -p pass %%i %1
IF NOT ERRORLEVEL 1 net.exe send %COMPUTERNAME% Компьютер — %%i процесс — %1
)
Выключение компьютеров по списку, созданному на основе сетевого окружения.
Предыдущий пример натолкнул меня на мысль сделать пакетный файл для быстрого выключения всех компьютеров в сети. Выключение производится утилитой PsShutdown.exe (описание в статье «Утилиты пакета PSTools»). Как и в предыдущем примере, сначала создается файл со списком компьютеров на основе сетевого окружения, а затем выполняется их поочередное выключение, при условии, что компьютер не свой (иначе он может выключиться до окончания выполнения командного файла). Содержимое файла:
rem @echo off
REM Здесь нужно задать
REM имя домена или рабочей группы для которых строится список машин для выключения
set MyDomain=имя домена
REM
REM Создадим текстовый файл comps.txt со списком компьютеров с помощью NET VIEW
net view /DOMAIN:%MyDomain% > comps.txt
REM
REM FOR /F «параметры» — использование данных из файла
REM eol=К — не использовать строки, начинающиеся с «К» — «Команда выполнена успешно»
REM skip=4 — пропустить первые 4 строки в файле
REM tokens=1 — брать для обработки 1-е слово в строке
FOR /F «eol=К skip=4 tokens=1 » %%i in (comps.txt) do (
REM Свой компьютер выключать не будем
REM Если имя компьютера не равно COMPUTERNAME — выключаем
IF /I %%i NEQ %COMPUTERNAME% psshutdown -k -t 0 %%i
)
Вам нужно только подредактировать строку:
set MyDomain=
указав имя домена и, при необходимости, добавить параметры -u -p для psshutdown.exe .
Один из посетителей этой странички (спасибо, Danila17) подсказал мысль о том, что, как правило, в реальной жизни из списка выключаемых компьютеров нужно исключить несколько штук, для чего удобно использовать команду FIND в цепочке с net.exe в скрипте формирования списка на основе сетевого окружения. Данная команда используется для поиска строк в текстовом файле по шаблону. Ключ /V используется для поиска строк не совпадающих с шаблоном. Для выключения компьютеров, исключая server1. server4 удобно использовать такой вариант:
net view | find «\\» | find /v «сервер1» | find /v «сервер2» | find /v «сервер3» | find /v «сервер4» > comps.txt
FOR /F «tokens=1 » %%i in (comps.txt) do shutdown.exe -f -s -m %%i
Работа с оконными приложениями.
Допустим, вам нужно из одного и того же командного файла запустить 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 и изменить размер на 350×50
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: . Если в командном файле используется имя модуля без полного пути
и если каталог D:\SCRIPTS не прописан в путях поиска (переменная PATH ) то модуль MYPROG.EXE может быть найден и выполнен только если текущим каталогом является D:\SCRIPTS. Но если вы укажете полный путь к myprog.exe
То программа будет найдена и выполнена в любом случае.
Есть еще одна тонкость — нередко программа, указанная в командном файле использует для поиска своих компонент (dll, ini и т.п. ) собственный каталог. Но на момент ее выполнения текущим каталогом может быть любой (чаще всего – системный каталог Windows). Естественно, компоненты не находятся и программа не выполняется. Для устранения проблемы добавьте в командный файл команды, обеспечивающие переход в нужный каталог. Например, программа myprog.exe должна выполняться в каталоге D:\SCRIPTS:
Rem Сменим текущий диск
Rem перейдем в каталог SCRIPTS
Прием со сменой каталога наиболее универсален и, как правило всегда срабатывает.
- Не удается использовать русские имена файлов, служб и т.п.
Причина в том, что при создании командных файлов вы использовали текстовый редактор, в котором русские символы представлены не в 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 (для Win2k — это папка WINNT \ SYSVOL \ DOMAIN \ SCRIPTS) контроллера домена, доступ на чтение к которой должен быть у всех пользователей, проходящих регистрацию.