Обработка ключей запуска CMD- файла
Привет гуру (или гурам?)! В общем привет!
Сделал я такой скриптик - http://forum.oszone.net/thread-141480.html Даже GUI ваяем. Встал вопрос о ключах для командной строки. У меня они организованны убого - по одному ключу (ну еще + 1 опцию) за раз обрабатывается. Вот код: То есть, чтобы выполнить 2 команды надо 2 раза запустить скрипт Код:
nmar -do reg1 Код:
nmar -do reg1 reg2 montp |
Как раз так будет заметное усложнение логики. Наиболее просто реализуется вариант с парами ключ/значение:
Пример вызова: Ключи могут повторяться, перемежаться; главное — чтобы не нарушалось правило «на каждый ключ одно значение». Другой вариант — ещё один ключ, например «-list», задающий имя текстового файла, содержащего те же самые пары «ключ/значение», например, в виде: При нахождении данного ключа в командной строке пакетного файла вызывается процедура его разбора посредством «for /f» и далее делается либо то же самое сравнение, что в предыдущем примере, либо пакетный файл вызывает самого себя, передавая аргументами пару «ключ/значение», заданные в очередной строке текстового файла, наподобие: Пример вызова:Усложнённый пример вызова, с перемежением обычных ключей и ключа «-list»: |
В принципе даже вариант
Код:
nmar -do reg1 -do reg2 -do mountp |
volk1234, не вижу смысла в разборе параметров, которые используются для именования процедур:
Код:
nmar do_reg1 do_reg2 do_mountp Код:
For %%i In (%*) Do Call :%%i Цитата:
|
amel27
Эмм.. не понял :dont-know |
volk1234, один параметр - одна процедура. FOR перебирает все и вызывает их по очереди
|
Тоесть можно сделать переключатель первый -do(-l -un) как я и сделал, а потом можно сделать перебор циклом ?
Код:
-do reg1 reg2 mountp |
Цитата:
Вместо Код:
-do reg1 Код:
doreg1 |
Как то непривычно, старался сделать как в других программках.
Вспомнил - просто не знал как реализовать в принципе обработку ключей - поэтому решил ограничится 2 уровнями - на первом ключи одноуровневые - где переход осуществляется сразу, -ms, -full,-unlockall. А также ключи -do -l -un при обработки которых переход осуществлялся во вторую функцию(метку) где и обрабатывался второй ключ. Пока не совсем предщставляю как реализовать например обработку doreg1 255 |
Цитата:
Код:
@Echo Off Код:
test.cmd doreg1 255 doreg2 128 256 |
Цитата:
Код:
-do_reg1_223 Код:
nmar.cmd -do reg1 223 |
А мне нравится SHIFTом пользоваться, например:
Код:
@Echo off |
amel27
Строка Код:
For /F "Tokens=1* Delims==" %%i In ('Set $_') Do Call :%%j Создается переменная 1* которая состоит из всех оставшихся ключей ? - doreg1 255 doreg2 128 256 Код:
Delims==" Что за хитрые переменные $_* Я понимаю, что они отделяют команды от параметров, но КАК ? :blush: :blush: И тогда почему Set $_, а не Set $_%%i ? |
Цитата:
Цитата:
Цитата:
$_2 - содержит имя 2-го параметра (начинается на "do") с подпараметрами (остальные); ... каждая новая переменная $_* создается если параметр начинается на "do", иначе параметр "прибавляется" к последней такой переменной, команда: Код:
Call Set $_%$I%=%%$_%$I%%%%$P% |
Я прошу прощения за паузу - ну просто невозможно попасть за компьютер, настолько много дел перед н.г.
Вопрос следующий - а вот ключи которые у меня просто - -ms -unlockall -full -nomore -kb Для них отдельные строки писать, или оставить прямую обработку через IF "%1"="-ms" Goto а потом ваш код + обработку -lreg1 ключей и -unreg1 -unreg2 ключей ? |
Цитата:
|
Привет еще раз :)
Все бы хорошо, да я запутался с отсечением знака '-' от имени ключа. Белиберда какая то получается. Как правильно отсечь минус от имени ключа? В самом скрипте поменял строку If /I "%$P:~0,2%"=="-" Set /A $I=%$I%+1 тоесть я знаю надо применить :~1, но не знаю где... А еще как сделать, чтобы проверялись следующие условия- ключ -unlockall должен выполнятся всегда первым или только он один ключи -l* и -un* одновременно выполнятся не должны |
Можно так (удалит все вхождения «-»):
Код:
set key=-ms |
Это не универсально, тогда меня и моя процедура перехода устроит -
If "Key1" = "-ms" goto *** If "Key1" = "-full" goto *** |
Цитата:
Код:
@Echo Off Код:
test.cmd -reg1 255 -reg2 128 256 |
Приведенный код
Код:
Call Set $_%$I%=%%$_%$I%%%%$P:~1% Т.е. приведенная вами тестовая строчка дает результат Код:
reg1 55 Код:
:CMD_PARSE |
Цитата:
Цитата:
Цитата:
Код:
@Echo Off |
Цитата:
Цитата:
|
Код:
@Echo Off |
Единственное - команда -unlockall просто вызывает завершение скроипта, а надо - переход в секцию :unlockall
|
Цитата:
Код:
@Echo Off |
Что то в реальном скрипте не получается обработать несколько парамеров, (один параметр нормально)
похоже глотает пробелы скрипт между ключами и параметрами ключей... Код:
:CORE |
Цитата:
Код:
Call Set $_%$I%=%%$_%$I%%%%$P% |
проблема была в другом- в конкретных секциях ожидались переменные %2 %3 которых теперь просто нет...
т.е. они могут быть, но их нет. |
Время: 03:57. |
Время: 03:57.
© OSzone.net 2001-