Проект Game Edition > Инструкции
Создаём БАТ-ник "с нуля"
(1/1)
KREKER12345:
1. Общие правила
Спойлер: 1. Для запуска командного файла (*.cmd, *.bat) необходимо присутствие в папке system32 файла cmd.exe. Такое же имя будет носить и запущенный процесс. Остановить выполнение любого БАТ-ника можно убив этот процесс.
2. Чтобы команды выполнялись - в системе (как правило в system32) должны присутствовать соответствующие утилиты для запуска. То есть команда
ping -a 192.168.1.1
не будет выполнена, если в папке system32 нет файла ping.exe. Исключение - если утилита "прописана" в системе специальным образом (см. ниже), тогда команда на запуск может не совпадать с именем файла запуска. Имя процесса всегда совпадает и именем файла который этот процесс запустил.
3. В "классическом" варианте при выполнении БАТ-ника появляется (большое) окно командной строки, что загромождает экран и сильно мешает. Убрать это окно можно прописав в самом начале БАТ-ника cmdow @ /HID. В конце прописываем EXIT, иначе после завершения работы БАТ-ника cmdow.exe будет висеть в процессах. Требует наличия файла cmdow.exe.
cmdow @ /HID
.....
.....
.....
EXIT
4. В БАТ-нике можно писать комментарии. Они нужны для удобства составителя, нигде не учитываются и системой не воспринимаются:
Rem Запускаем Блокнот..
notepad
В файлах реестра комментарий обозначается в начале строки символом ; (точка с запятой):
*.reg: Windows Registry Editor Version 5.00
;Отключить анимацию окон при свертывании и развертывании:
[HKEY_CURRENT_USER\Control Panel\Desktop\WindowMetrics]
"MinAnimate"="0"[/b]
5. БАТ-ник может удалять сам себя. Если в первой строчке указана команда на самоудаление, то выполнение БАТ-ника будет продолжено даже после того как сам файл удалён.
2. Прописывание утилит
Спойлер: Установленной программе в которой (явно) есть файл запуска можно дать имя в системе, по которой её можно будет идентифицировать в дальнейшем.
Для примера возьмём Total Commander, установленный в Program Files, файл запуска Totalcmd.exe, имя которое мы хотим ему дать - total. Решение сводится к прописыванию в реестре расположения файла запуска и папки в которой он находится.
*.reg: Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\total.exe]
@="C:\\Program Files\\Total Commander\\Totalcmd.exe"
"Path"="C:\\Program Files\\Total Commander"
Теперь если в окно Пуск - Выполнить ввести total - откроется наш Total Commander. Так же он откроется, если эту команду ввести через БАТ-ник. Можно создать ещё одну ветку реестра, заменив total.exe на total123.exe, тогда командер будет запускаться и командой total, и командой total123. Запущенный процесс в обоих случаях будет такой же как и файл запуска - Totalcmd.exe. При попытке запустить таким образом непрописанную утилиту (например - totalcmd) - система выдаст ошибку.
Этим можно пользоваться и для открытия чего-либо (файлов, дисков, папок) через прописанную программу. Команда:
total %windir%\system32
откроет папку WINDOWS\system32 в Total Commander-е.
3. Запуск
Спойлер: Запуск может быть нескольких видов:
1. Простой запуск:
Если запустить такой БАТ-ник:
notepad
calc
То сначала откроется Блокнот и выполнение БАТ-ника будет приостановлено пока его принудительно не закроют. После закрытия сразу же запустится Калькулятор, и пока он не будет закрыт в процессах будет висеть cmd.exe. Тот же результат даёт такой код:
start /wait notepad
start /wait calc
Отличия - простой запуск не работает с пробелами в путях файлов. Подробнее о путях запуска см. в разделе 6. БАТ-ники и файлы реестра.
2. Запуск без ожидания окончания процесса:
start notepad
start calc
Обе утилиты запустятся по очереди, сразу после чего БАТ-ник завершит свою работу. Работает только в БАТ-нике, в Пуск - Выполнить выдаст ошибку.
3. Запустить свёрнутым:
start /min notepad - запустит Блокнот в свёрнутом виде.
4. Использование многофункциональной утилиты NirCmd позволяет делать с окнами практически всё что угодно. Например Блокнот можно запустить так, что он будет не видимым ни в панели задач, ни в трее (только в процессах):
nircmd.exe exec hide notepad
Чтобы сделать его видимым нужна команда:
nircmd.exe win show ititle pad
В данном случае для идентификации окна указана часть его заголовка, pad. Это может быть Notepad или Akelpad. Подробнее - см. инструкцию к NirCmd, она ещё и не такое может.
К сожалению мне не удалось отыскать утилиту позволяющую запускать приложения свёрнутыми в трей. Но не факт что такой утилиты не существует.
Синтаксис команд утилиты NirCmd иногда не совпадает с синтаксисом командной строки. Например чтобы запустить файл C:\WINDOWS\WinRoll\Winroll.exe можно использовать обе эти утилиты, но по разному:
nircmd.exe exec hide "~$folder.windows$\WinRoll\WinRoll.exe"
start %windir%\WinRoll\WinRoll.exe
Первая строка запустит файл без показа в трее (hide), вторая его просто запустит.
5. Запуск из разных папок (директорий):
Создадим текстовый файл с именем 1.txt, и поместим его в папку C:\WINDOWS. Теперь чтобы открыть этот файл из БАТ-ника нужно учесть где этот БАТ-ник расположен. Если он в той же папке что и запускаемый файл, то выглядеть он будет так (варианты):
1.txt
start 1.txt
Если БАТ-ник находится в корне диска C: текст в нём будет такой:
start WINDOWS\1.txt
Если БАТ-ник расположен на другом диске, или его расположение неизвестно нужно указывать полный путь:
start C:\WINDOWS\1.txt
start %systemdrive%\WINDOWS\1.txt
start %windir%\1.txt
Существует и способ для запуска файла из дочерней папки. Для этого нужно строкой раньше указать каталог, который будет восприниматься системой как рабочий. В этом случае родительский каталог обозначается двумя точками (не двоеточие) через пробел. Если БАТ-ник расположен в папке C:\WINDOWS\system32 он будет выглядеть так:
cd ..
start 1.txt
Для папки C:\WINDOWS\system32\drivers нужно будет переместиться вверх на 2 уровня (до папки WINDOWS)
cd ..\..
start 1.txt
После смены каталога если нет специальной команды для его смены все дальнейшие операции БАТ-ника будут проходить с ним. Вернуть текущий каталог (папка в которой находится БАТ-ник):
cd /d "%~dp0"
4. Остановка процесса
Спойлер: Рекомендую утилиту gukill32.exe
Применение (*.bat-файл) для закрытия Блокнота:
gukill32.exe notepad.exe
Прописывать нужно полностью с *.exe в конце. Будут остановлены все процессы notepad.exe, откуда бы они не были запущены.
5. Задержка выполнения
Спойлер: Рекомендую надёжную утилиту sleep.exe. Пример (*.bat-файл):
sleep 30
notepad
При запуске БАТ-ника запускается утилита sleep.exe на 30 секунд, после отработки которых запускается Блокнот. Если процесс sleep.exe принудительно завершить, Блокнот запустится сразу же.
Ещё один вариант (*.bat-файл) использования sleep.exe для выключения компьютера через 5 минут (300 секунд):
sleep 300
%windir%\system32\shutdown.exe -s -t 00
6. БАТ-ники и файлы реестра
Спойлер: Общее правило такое. Файлы реестра (*.reg-файлы) плохо понимают синтаксис командной строки. Они не знают что:
%windir% - это папка C:\WINDOWS.
Соответственно %windir%\system32 - это C:\WINDOWS\system32, F:\WINDOWS_0\system32.......;
%systemdrive% - это системный диск;
%userprofile% - это C:\Documents and Settings\Администратор;
%AllUsersProfile% - это C:\Documents and Settings\All Users;
%ProgramFiles% - это C:\Program Files.
БАТ-ники в свою очередь очень капризно относятся к русскому языку, особенно когда это касается путей файлов.
Исходя из этого для универсальности использования рекомендую такой подход:
1. Всё что касается реестра (кроме путей) делаем через *.reg-файлы;
2. Для путей создаём отдельный файл реестра;
3. Конвертируем его в командный файл с помощью утилиты Reg Tools. Правый клик на файле реестра - "Конверитровать в CMD". Не забываем потом переименовать его в *.bat чтобы потом не запутаться;
4. Меняем вручную пути которые можно заменить. Практика показывает что вышеописанных пяти путей вполне хватает.
Запустить файл реестра через БАТ-ник можно командой:
regedit /s 123.reg - запуск файла 123.reg из одной папки с БАТ-ником;
regedit /s %systemdrive%\123.reg - запуск файла 123.reg расположенного в корне системного диска.
Ключ /s (от слова SILENT) нужен чтобы система не запрашивала подтверждения на добавление данных в реестр.
Если всё-таки в БАТ-нике присутствует кириллица, да ещё и с пробелами - следует после start поместить двойные кавычки, и ещё в одни кавычки заключить полный путь к файлу:
start "" "C:\Program Files\Мои загрузки\BaskeT.exe"
В случае использования кириллицы БАТ-ник должен быть сохранён в единственной кодировке "понимающей" русский язык - ОЕМ-886, иначе система будет воспринимать русский текст как крякозябры.
7. Повторение однотипных действий
Спойлер: Часто бывает нужно повторить ряд команд определённое количество раз. Делается это организацией цикла:
for /l %%[Буква] in ( [Начальное],[Шаг],[Конечное] ) do (
[Команда 1]
[Команда 2]
[Команда 3]
....
....
)
Буква может быть любой латинской. После имени переменной указываем начальное значение, шаг, конечное значение. Если первые два значения - единицы, то третье будет количеством циклов которые будут повторяться. Этот БАТ-ник 5 раз выполнит цикл команд ограниченных скобками - "запустить Блокнот, запустить Калькулятор".
for /l %%a in (1,1,5) do (
start notepad
start calc
)
Имя переменной можно использовать и в названии создаваемых файлов-папок, например этот БАТ-ник:
for /l %%a in (1,1,10) do (
md Program%%afile
)
Создаст в текущей папке 10 папок с именами Program1file, Program2file... Program10file
8. Имитация нажатия клавиш
Спойлер: Для этого подойдёт уже упомянутая NirCmd:
1. Клавиатура:
nircmd.exe sendkey [ Клавиша/Код клавиши (Shift/0x10) ] [ Нажать/Отпустить/Нажать-и-Отпустить (down/up/press) ]
Нажать клавишу Alt, нажать и отпустить клавишу Tab, отпустить Alt.
Такой вариант с назаваниями клавиш может не сработать:
nircmd.exe sendkey alt down
nircmd.exe sendkey tab press
nircmd.exe sendkey alt up
Более надёжный - второй вариант с кодами:
nircmd.exe sendkey 0x12 down
nircmd.exe sendkey 0x09 press
nircmd.exe sendkey 0x12 up
Коды клавиш здесь.
2. Мышь
2.1 Нажатие кнопок мыши:
nircmd.exe sendmouse [Правая/Левая/Средняя (right/left/middle)] [Нажать/Отпустить/Клик/Двойной клик (down/up/click/dblclick)]
nircmd.exe sendmouse right click - одиночный правый клик;
nircmd.exe sendmouse left dblclick - двойной левый клик
2.2 Перемещение мыши:
nircmd.exe sendmouse move [Влево/Вправо] [Вверх/Вниз]
Указанные команды перемещают курсор мыши на 50 пикселей:
nircmd.exe sendmouse move -50 0 - влево
nircmd.exe sendmouse move 50 0 - вправо
nircmd.exe sendmouse move 0 -50 - вверх
nircmd.exe sendmouse move 0 50 - вниз
Зажать левую кнопку, переместить мышь влево на 30 и вниз на 20 пикселей, отпустить левую кнопку:
nircmd.exe sendmouse left down
nircmd.exe sendmouse move -30 20
nircmd.exe sendmouse left up
2.3 Прокрутка мышью:
nircmd.exe sendmouse wheel [Шаг вверх/Шаг вниз(120/-120)]
Прокрутить колесо на 1 шаг "на себя" или "в конец документа":
nircmd.exe sendmouse wheel -120
Прокрутить колесо на 1 шаг "от себя" или "в начало документа":
nircmd.exe sendmouse wheel 120
В описании к утилите NirCmd утверждается что прокручивать можно на несколько шагов, указывая число кратное 120 (1200 - 10 шагов). Но практика показывает что такая методика работает криво. Возможно дело в "навороченных" мышах и драйверах к ним, возможно - в чём-то другом. У меня получается стабильная работа когда в прокрутку колеса в БАТ-нике прописываешь по одному шагу, делая между этими шагами минимальные паузы (в миллисекундах):
nircmd.exe sendmouse wheel 120
nircmd.exe wait 1
nircmd.exe sendmouse wheel 120
nircmd.exe wait 1
nircmd.exe sendmouse wheel 120
nircmd.exe wait 1
nircmd.exe sendmouse wheel 120
nircmd.exe wait 1
nircmd.exe sendmouse wheel 120
9. Отслеживание файлов
Спойлер: Есть готовое решение как запустить группу команд после появления определённого файла. По сути это "запуск при условии" - организация цикла по отслеживанию наличия этого файла. Если после очередной проверки (цикл 10 секунд - параметр sleep 10) оказывается что файл 1.txt присутствует в корне диска C:\, условие считается выполненным, и запускается нужная группа команд:
:metka1
if exist c:\1.txt goto metka2
sleep 10
goto metka1
:metka2
start notepad
start calc
Если файл большого размера и закачивается долго, то при очередном обращении к недозакачанному файлу система выдаст ошибку. Чтобы её избежать БАТ-ник нужно немного модифицировать. Добавляем попытку переименовать его раз в 5 секунд, и смотрим выдаёт ли он ошибку. Если ошибки нет - запускается группа команд:
:metka1
if exist c:\1.txt goto metka2
sleep 10
goto metka1
:metka2
rename c:\1.txt 1.txt
sleep 5
if not errorlevel 0 goto metka2
start notepad
start calc
В путях файлов следует избегать пробелов и кириллицы.
Источник
10. Отслеживание процессов
Спойлер: Ещё одно готовое решение для запуска группы команд при наличии/отсутствии указанного процесса в системе. По сути это выполнение действия при выполнении условия (наличия/отсутствия процесса). Если условие не выполнено - БАТ-ник продолжает свою работу, переходит на следующую строку. После проверки условия наличия или отсутствия процесса можно задавать одну команду (в этой же строке), группу команд с использованием скобок, или метку перехода.
Примеры:
Если процесс присутствует в системе - выполняется переход к метке:
tasklist /FI "imagename eq [Процесс]" |>NUL find /i "[Процесс]" && goto [Метка]
Если процесс отсутствует в системе - выполняется группа команд. Если процесс появляется - условие считается невыполненным и управление передаётся командам находящимся за последней (самой нижней) скобкой:
tasklist /FI "imagename eq [Процесс]" |>NUL find /i "[Процесс]" || do (
[Команда 1]
[Команда 2]
[Команда 3]
....
....
)
Примеры:
1. "Один за всех"
БАТ-ник запускает Блокнот, Калькулятор и Paint. При закрытии одного из них все остальные тоже закрываются. Каждые 5 секунд отслеживаются все три процесса (по очереди). Сначала проверяется запущен ли Блокнот. Если запущен происходит переход к метке m2 и проверяется запущен ли Paint. Если же Блокнота нет в процессах происходит переход к метке m9, после которой идёт группа команд на убивание всех процессов задействованных в БАТ-нике. Если же Paint и Калькулятор висят в процессах происходит переход в самое начало к метке m1, после чего система ждёт 5 секунд и всё повторяется.
start mspaint.exe
start calc.exe
start Notepad.exe
:m1
sleep 5
tasklist /FI "imagename eq Notepad.exe" |>NUL find /i "Notepad.exe" && goto m2
goto m9
:m2
tasklist /FI "imagename eq mspaint.exe" |>NUL find /i "mspaint.exe" && goto m3
goto m9
:m3
tasklist /FI "imagename eq calc.exe" |>NUL find /i "calc.exe" && goto m1
:m9
gukill32.exe notepad.exe
gukill32.exe calc.exe
gukill32.exe mspaint.exe
gukill32.exe sleep.exe
gukill32.exe cmd.exe
gukill32.exe sleep.exe
gukill32.exe cmd.exe
2. "Неубиваемый калькулятор"
БАТ-ник запускает Блокнот и Калькулятор. Каждые 5 секунд отслеживается есть ли Калькулятор в процессах. При попытке закрыть Калькулятор при очередном цикле он опять запускается. Закрытие Блокнота автоматически приводит к закрытию Калькулятора. Команда на закрытие всех процессов идёт после метки m3, а на неё можно выйти только закрыв Блокнот.
start calc.exe
start "" "%windir%\system32\Notepad.exe"
:m1
sleep 5
tasklist /FI "imagename eq Notepad.exe" |>NUL find /i "Notepad.exe" && goto m2
goto m3
:m2
tasklist /FI "imagename eq calc.exe" |>NUL find /i "calc.exe" || start calc.exe
goto m1
:m3
gukill32.exe notepad.exe
gukill32.exe calc.exe
gukill32.exe sleep.exe
gukill32.exe cmd.exe
gukill32.exe sleep.exe
gukill32.exe cmd.exe
В архиве - все упомянутые файы. Закидываются в Windows\System32
Sys_32_Files.rar (570.31 кБ - загружено 1626 раз.)
Мак-Гуру:
Спасибо, дружище!
KREKER12345:
Общие сведения о командной оболочке CMD
Полная инструкция по оболочке CMD в виде *.htm-файла. Открывается любым браузером.
All_CMD_Info.rar (218.02 кБ - загружено 1118 раз.)
mihail1961:
Спасибо.
Навигация
Перейти к полной версии