Начнем с простого, нам нужен BAT или CMD файл, который мы и будем менять и запускать.
Ну, во первых - лучше CMD, почему - потому, что там больше возможностей. Единственное - CMD файлы не будут работать на старых 9х системах. Более подробно можно поискать в Интернете по поиску.
Начало.
Открываем блокнот и пишем:
echo off
title Hello World!
color 0a
cls
echo.
echo. Hello World!
echo.
pause
Сохраняем сие произведение под именем "hello world.cmd" на рабочий стол и смело запускаем.
В итоге получаем черное окошечко с зеленым приветствием и предложением нажать любую кнопку.
Что же мы сделали? Отвечаю:
echo off
- отключение вывода команд файла при запуске, если не писать, то в окошке будет виден весь ход выполнения файла;title
- имя окошка;color
- цвет фона и текста;cls
- очистка окна, т.к. туда уже успело попасть приветствие интерпретатора и команда echo off;echo
- сама по себе команда вывода сообщений, в случае если она пишется с точкой, делает следующее - все дальнейшие пробелы после точки участвуют в выводе, т.е. таким образом можно сделать отступ от края окна и добиться лучшей читаемости сообщений, а если просто использовать echo с точкой и не написать больше ничего, то выведется пустая стока;pause
- команда остановки и ожидания действия пользователя, если ее не использовать, то окно само закроется и вы ничего не увидите, если нужно выполнять файл в автоматическом режиме (через планировщик задач), то ее использовать нельзя, т.к. файл не закроется по факту выполнения и соответственно система выдаст ошибку.pause > NULL
" - в этом случае пользователь не увидит в окне сообщения типа "Для продолжения нажмите любую клавишу . . .".Подробнее о цветах:
0 = Черный
1 = Синий
2 = Зеленый
3 = Голубой
4 = Красный
5 = Лиловый
6 = Желтый
7 = Белый
8 = Серый
9 = Светло-синий
A = Светло-зеленый
B = Светло-голубой
C = Светло-красный
D = Светло-лиловый
E = Светло-желтый
Пишем лог
В тех случаях, когда файл исполняется в автоматическом режиме и у нас нет возможности наблюдать за ходом его исполнения, полезно записывать т.н. события в отдельный текстовый файл, на тот случай, если произошел сбой и нужно понять на каком месте программа "запнулась".
Опять-таки есть два варианта, либо мы пишем с эха (echo), либо из запущенного чего-нибудь еще, о чем позже.
Чтобы осуществить вывод эха в файл достаточно после текста вывода поставить символ > и имя файла, в который будет сообщение выводится, пример:
echo. Hello World! > hw.log
или же
ping 127.0.0.1 > ping.log
если же нужно дописать уже имеющийся файл, то ставим два знака >> :
echo. Batch roools! >> hw.log
Запускаемся
Как правило, основное назначение батч файлов - это запуск чего либо в требуемой нам последовательности.
Если то, что мы запускаем находится в той же папке, что и наш батч файл, то запускаем просто по имени:
programm.exe
Если программа лежит где-то еще на диске, тогда нужно указывать путь до нее:
"C:\My Programm\programm.exe"
Обратите внимание, если в пути к файлу есть пробелы, то использование кавычек обязательно!
Так же, на современных ОС, часто бывает нужно запустить программу от чьего-то имени, в т.ч. от имени администратора, тогда есть несколько вариантов:
Я в большинстве случаев использую именно "psexec.exe".
Если же нужно запустить из одного батч файла другой, и при этом, чтобы процесс продолжился после его завершения, нужно использовать команду call
:
call second.cmd
Безопасность
А если батч файл запускается таким образом, что его могут открыть пользователи и посмотреть в него, а там обнаружить Ваш СуперПуперСекретныйПароль, то советую использовать программки типа:
Вносим записи в реестр
Довольно-таки часто нужно с помощью батч файла внести изменения в реестр, - это элементарно (как говорил один профессор), для начало нужно создать файл реестра, а потом применить его:
regedit /S izmeneniya.reg
или же, если нужно его сформировать динамически, то сначала создаем его, применяем, а потом чистим за собой:
echo REGEDIT4 > wua.tmp.reg
echo [HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate] >> wua.tmp.reg
echo "TargetGroupEnabled"=dword:00000001 >> wua.tmp.reg
regedit.exe /S wua.tmp.reg
del /Q wua.tmp.reg
Остановим время! или поставим на паузу
Так же часто нужно притормозить выполнение батч файла, будь то в конце или же в процессе его выполнения, причины могут быть разными, и тут простой командой pause не обойтись.
echo Wscript.Sleep 15000> sleep.vbs
start /w wscript.exe sleep.vbs
del sleep.vbs
Для начала создается файл sleep.vbs
или как Вы его там назовете, при том, временной интервал в 15000
соответствует 15 секундам, т.е. указывается в миллисекундах. Далее запускаем его через встроенную в систему wscript.exe
(Windows Scripting), а потом удаляем.
Вообще, с помощью WSH можно реализовать множество интересных вещей, но об этом я буду писать отдельно.
Работаем в сети
Бывает, но редко, когда нужно подключить сетевой диск, в процессе выполнения батч файла, эта задача связанна с запуском программ с серверов или компьютеров по сети, но при этом в батч файле нельзя прописать запуск типа "\\172.16.0.5\shara\programm.exe
", поэтому делаем следующее:
net use Y: \\172.16.0.5\shara /USER:domain\username password
Y:\programm.exe
Переменные и их использование
А нужны ли они, - я говорю да, нужны. Когда? Ну, скажем в случае, когда нужно обработать сегодняшнюю дату в формат, удобный при использовании в именах файлов. Например создадим файл Date.cmd
:
echo off
title Date
color 0e
SETLOCAL
cls
echo.
set arcver=%DATE%
echo. System date - %arcver%
set arcver=%arcver:~-10%
set arcver=%arcver:~0,5%
set arcver1=%arcver:~0,2%
set arcver2=%arcver:~3,2%
set arcver=%arcver2%.%arcver1%
set arcver=%arcver:.=-%
echo. Date for file - %arcver%
echo.
pause
На выходе получим следующее:
System date - 06.04.2012
Date for file - 04-06
Кстати, команда SETLOCAL
нужна для того, чтобы переменные, которые Вы задаете, не попала в системные, и сбросилась по завершению батч файла.
Или же, если нужно работать с длинными путями к файлам, или же если пути могут измениться, а перебирать весь батч в поисках изменившихся связей процедура не для слабонервных:
rem Directory for archive
set ARCHDIR=Group Of Co
rem Directory of archive
set FROMDRIVE=c
set FROMDIR=1C Base\1SBDB
xcopy "%FROMDRIVE%:\%FROMDIR%\*.*" "z:\%ARCHDIR%-%arcver%\" /S /E /V /Q /H /R /K /Y
Подведем итог:
set
%FROMDRIVE%
- обрамляя знаками процентаset /?
Интерактивный интерфейс?
Случалось, бывало, нужда возникала задать вопрос пользователю или самому себе, при выполнении батч файла. Сделать можно, например, выключить удаленно компьютер в сети, к которому мы имеем доступ. Создаем файл kill pc.cmd
:
@echo off
title Kill PC
color 0b
cls
SET Choice=
SET /P Choice= Kill PC IP: ?
cls
echo.
echo. Killing PC IP %Choice%
echo.
psshutdown.exe -r -f -t 1 \\%Choice%
echo.
color 0b
echo Wscript.echo " 5 sec. Pause" > sleep.vbs
echo Wscript.Sleep 5000 >> sleep.vbs
CScript.exe //Nologo sleep.vbs
del /F /Q sleep.vbs
При этом используется одна из утилит набора PsTools, который можно свободно скачать с сайта technet.microsoft.com
После запуска нужно будет ввести IP адрес компьютера, а на результат работы можно будет посмотреть в течении 5 секунд, после того как команда на выключение будет отправлена на сетевой компьютер.
В принципе, таким образом можно и свой выключить, если вписать 127.0.0.1.
Можно сменить IP адрес компьютера с помощью cmd файла
Очень редки случаи, но были. В файле прописываем:
netsh int ip del address name=External addr=10.104.140.23
netsh int ip add address name=External addr=10.104.140.21 mask=255.0.0.0
В принципе, сделать можно многое, тут все в фантазию упирается.
В моем случае есть множество наработок, но о них - в отдельной теме.