CMD - Hello World! ИЛИ - С чего начать?

Начнем с простого, нам нужен 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"

Обратите внимание, если в пути к файлу есть пробелы, то использование кавычек обязательно!

Так же, на современных ОС, часто бывает нужно запустить программу от чьего-то имени, в т.ч. от имени администратора, тогда есть несколько вариантов:
  1. Запускаемая утилита сама предложит ввести пароль или дает возможность прописать пароль в самом батч файле
  2. Использовать утилиту "psexec.exe", которая входит в набор PsTools, который можно свободно скачать с сайта technet.microsoft.com
  3. Использование команды RUNAS, но тогда автоматизация будет половинчатой, т.к. пароль придется вводить вручную.
Я в большинстве случаев использую именно "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



В принципе, сделать можно многое, тут все в фантазию упирается.

В моем случае есть множество наработок, но о них - в отдельной теме.

Comments