Автор Тема: Создаём БАТ-ник "с нуля"  (Прочитано 962 раз)

0 Пользователей и 1 Гость смотрят эту тему.

Оффлайн KREKER12345

  • Ветеран
  • *****
  • Сообщений: 645
  • Пол: Мужской
    • Просмотр профиля
Создаём БАТ-ник "с нуля"
« : 26 Сентября 2016, 19:29:52 »
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\system32F:\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, иначе система будет воспринимать русский текст как крякозябры.

ila_rendered

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 кБ - загружено 84 раз.)

Оффлайн Мак-Гуру

  • Старожил
  • ****
  • Сообщений: 301
  • Пол: Мужской
  • game edition вам в руки.
    • Просмотр профиля
Re: Создаём БАТ-ник "с нуля"
« Ответ #1 : 02 Октября 2016, 22:16:19 »
Спасибо, дружище!