Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Обработка ключей запуска CMD- файла

Ответить
Настройки темы
CMD/BAT - [решено] Обработка ключей запуска CMD- файла

Аватара для volk1234

Старовер


Сообщения: 1708
Благодарности: 314


Конфигурация

Профиль | Отправить PM | Цитировать


Изменения
Автор: volk1234
Дата: 10-12-2009
Привет гуру (или гурам?)! В общем привет!
Сделал я такой скриптик - http://forum.oszone.net/thread-141480.html
Даже GUI ваяем. Встал вопрос о ключах для командной строки.
У меня они организованны убого - по одному ключу (ну еще + 1 опцию) за раз обрабатывается.
Вот код:
читать дальше »

Код: Выделить весь код
Set Key1=%1
Set Key2=%2

.....

:CORE1
If "%Key1%" == "-full" Goto :full
If "%Key1%" == "-nomore" Goto :nomore
If "%Key1%" == "-kb" Goto :kbinstall
If "%Key1%" == "-p" Goto :pusb
If "%Key1%" == "-pd" Goto :pdisk
If "%Key1%" == "-pall" Goto :pall
If "%Key1%" == "-ms" Goto :ms
If "%Key1%" == "-unlockall" Goto :unlockall
If "%Key1%" == "-do" Goto :CORE_do
If "%Key1%" == "-l" Goto :CORE_l
If "%Key1%" == "-un" Goto :CORE_u

If "%Key1%" == "-help" Goto :Syntax

Goto :Syntax_Error

:CORE_do
If "%Key2%" == "" Goto :Syntax_Error
If "%Key2%" == "reg1" Goto :reg1
If "%Key2%" == "reg2" Goto :reg2
If "%Key2%" == "srvoff" Goto :srvoff
If "%Key2%" == "srvon" Goto :srvon
If "%Key2%" == "mountp" Goto :mountp

Goto :Syntax_Error

:CORE_l
Call :subinacl_DETECT

If "%Key2%" == "" Goto :Syntax_Error
If "%Key2%" == "reg1" Goto :lockreg1
If "%Key2%" == "reg2" Goto :lockreg2
If "%Key2%" == "usbadd" Goto :lockusbadd
If "%Key2%" == "usbuse" Goto :lockusbuse
If "%Key2%" == "usbwrite" Goto :lockusbwrite
If "%Key2%" == "mountp" Goto :lockmountp

Goto :Syntax_Error

:CORE_u
Call :subinacl_DETECT

If "%Key2%" == "" Goto :Syntax_Error
If "%Key2%" == "reg1" Goto :unreg1
If "%Key2%" == "reg2" Goto :unreg2
If "%Key2%" == "usbadd" Goto :unusbadd
If "%Key2%" == "usbuse" Goto :unusbuse
If "%Key2%" == "usbwrite" Goto :unusbwrite
If "%Key2%" == "mountp" Goto :unmountp

Goto :Syntax_Error

.....

:reg1
If Not "%Key3%"=="" Set NDTAR=%Key3%
....


То есть, чтобы выполнить 2 команды надо 2 раза запустить скрипт
Код: Выделить весь код
nmar -do reg1
nmar -do reg2
А конечно охота сразу все указывать
Код: Выделить весь код
nmar -do reg1 reg2 montp
Я сделал как мог, дабы не усложнять скрипт и себе жизнь. Но может кто подскажет чего ?

-------

Ю-ху!


Отправлено: 00:34, 10-12-2009

 

Аватара для Drongo

Будем жить, Маэстро...


Сообщения: 6694
Благодарности: 1393

Профиль | Сайт | Отправить PM | Цитировать


Цитата volk1234:
doreg1 255 »
У меня в GUI, команда формируется так
Код: Выделить весь код
-do_reg1_223
Но потом в процессе обработки символы подчёркивания заменяются на пробелы. И на выходе мы видим
Код: Выделить весь код
nmar.cmd -do reg1 223

-------
Правильная постановка вопроса свидетельствует о некотором знакомстве с делом.
3нание бывает двух видов. Мы сами знаем предмет — или же знаем, где найти о нём сведения.
[Quick Killer 3.0 Final [OSZone.net]] | [Quick Killer 3.0 Final [SafeZone.cc]] | [Парсер логов Gmer] | [Парсер логов AVZ]

http://tools.oszone.net/Drongo/Userbar/SafeZone_cc.gif


Отправлено: 13:25, 11-12-2009 | #11



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Старожил


Сообщения: 426
Благодарности: 108

Профиль | Отправить PM | Цитировать


А мне нравится SHIFTом пользоваться, например:
Код: Выделить весь код
@Echo off
SetLocal EnableExtensions
rem демонстрация обработки ключей.
:Loop
set Key=%1
set Key=%Key:?=h%
shift
rem Недостаток в том, что желательно проверить ключ на совпадение, иначе будет аварийное завершение батника.
GoTo L%Key% 2>nul
Echo Неверный параметр: "%1" (используйте спраку: %~nx0 /? )
:L
exit

:L-H
:L/h
Echo Ключи:
Echo  -h			- Подсказка
Echo  -d ^<mask^>		- Каталог
Echo  -r			- Перезагрузка ;)
Echo  -p ^<Start^> ^<Finish^>	- Пинг диапазона адресов
Goto Loop

:L/D
:L-D
dir /b /on /a /s %1
shift
Goto Loop

:L/R
:L-R
msg * Bye! ;)
rem Reboot -r -t 1
Goto Loop

:L/P
:L-P
for /L %%a in (%1,1,%2) do ping -a -n 1 192.168.0.%%a
shift & shift
Goto Loop

-------
Как сказало Дерево Дровосеку: "я - пень".


Отправлено: 15:25, 11-12-2009 | #12


Аватара для volk1234

Старовер


Сообщения: 1708
Благодарности: 314

Профиль | Отправить PM | Цитировать


amel27
Строка

Код: Выделить весь код
For /F "Tokens=1* Delims==" %%i In ('Set $_') Do Call :%%j
Непонятна.

Создается переменная 1* которая состоит из всех оставшихся ключей ? -
doreg1 255 doreg2 128 256

Код: Выделить весь код
Delims=="
означает что разделители - пробелы и знак равно могут быть?

Что за хитрые переменные $_*
Я понимаю, что они отделяют команды от параметров, но КАК ?

И тогда почему Set $_, а не Set $_%%i
?

-------

Ю-ху!


Отправлено: 12:42, 13-12-2009 | #13


Googler


Сообщения: 3665
Благодарности: 1563

Профиль | Отправить PM | Цитировать


Цитата volk1234:
Строка
For /F "Tokens=1* Delims==" %%i In ('Set $_') Do Call :%%j
Непонятна. »
тут как раз все просто - команда "Set $_" выдает список переменных, имя которых начинается на $_, из этого списка выделяются только значения (только то, что находится после знака "="), далее выполняется CALL по каждому такому значению

Цитата volk1234:
означает что разделители - пробелы и знак равно могут быть? »
нет, только "="

Цитата volk1234:
Что за хитрые переменные $_* »
$_1 - содержит имя 1-го параметра (начинается на "do") с подпараметрами (остальные);
$_2 - содержит имя 2-го параметра (начинается на "do") с подпараметрами (остальные);
...

каждая новая переменная $_* создается если параметр начинается на "do", иначе параметр "прибавляется" к последней такой переменной, команда:
Код: Выделить весь код
Call Set $_%$I%=%%$_%$I%%%%$P%
Это сообщение посчитали полезным следующие участники:

Отправлено: 15:11, 13-12-2009 | #14


Аватара для volk1234

Старовер


Сообщения: 1708
Благодарности: 314

Профиль | Отправить PM | Цитировать


Я прошу прощения за паузу - ну просто невозможно попасть за компьютер, настолько много дел перед н.г.

Вопрос следующий - а вот ключи которые у меня просто -

-ms
-unlockall
-full
-nomore
-kb

Для них отдельные строки писать, или оставить прямую обработку через IF "%1"="-ms" Goto
а потом ваш код + обработку -lreg1 ключей и -unreg1 -unreg2 ключей ?

-------

Ю-ху!


Отправлено: 01:35, 15-12-2009 | #15


Googler


Сообщения: 3665
Благодарности: 1563

Профиль | Отправить PM | Цитировать


Цитата volk1234:
Для них отдельные строки писать, или оставить прямую обработку »
главное, чтобы соблюдалось строгое однозначное соответствие ключ --> процедура, а префикс для определения где ключ, а где его параметр можно задать какой угодно: "do", "-" или что угодно

Отправлено: 03:26, 15-12-2009 | #16


Аватара для volk1234

Старовер


Сообщения: 1708
Благодарности: 314

Профиль | Отправить PM | Цитировать


Привет еще раз
Все бы хорошо, да я запутался с отсечением знака '-' от имени ключа. Белиберда какая то получается. Как правильно отсечь минус от имени ключа? В самом скрипте поменял строку

If /I "%$P:~0,2%"=="-" Set /A $I=%$I%+1

тоесть я знаю надо применить :~1, но не знаю где...
А еще как сделать, чтобы проверялись следующие условия-
ключ -unlockall должен выполнятся всегда первым или только он один
ключи -l* и -un* одновременно выполнятся не должны

-------

Ю-ху!


Последний раз редактировалось volk1234, 17-12-2009 в 02:13.


Отправлено: 01:22, 17-12-2009 | #17


Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


Можно так (удалит все вхождения «-»):
Код: Выделить весь код
set key=-ms
set skey=%key:-=%
echo [%key%], [%skey%]

Отправлено: 04:10, 17-12-2009 | #18


Аватара для volk1234

Старовер


Сообщения: 1708
Благодарности: 314

Профиль | Отправить PM | Цитировать


Это не универсально, тогда меня и моя процедура перехода устроит -

If "Key1" = "-ms" goto ***
If "Key1" = "-full" goto ***

-------

Ю-ху!


Отправлено: 10:20, 17-12-2009 | #19


Googler


Сообщения: 3665
Благодарности: 1563

Профиль | Отправить PM | Цитировать


Цитата volk1234:
Все бы хорошо, да я запутался с отсечением знака '-' от имени ключа. Белиберда какая то получается. Как правильно отсечь минус от имени ключа? »
не совсем понял о чем речь, поэтому старый пример для ключей "-":
Код: Выделить весь код
@Echo Off

Set $I=0& For %%i In (%*) Do Set $P=%%i& Call :CMD_PARSE
For /F "Tokens=1* Delims==" %%i In ('Set $_') Do Call :%%j

Exit /B

:REG1
  Echo DOREG1 %*
GoTo :EOF

:REG2
  Echo DOREG2 %*
GoTo :EOF

:CMD_PARSE
  If /I "%$P:~0,1%"=="-" Set $P=%$P:~1%& Set /A $I=%$I%+1
  Call Set $_%$I%=%%$_%$I%%%%$P% 
GoTo :EOF
Код: Выделить весь код
test.cmd -reg1 255 -reg2 128 256

Последний раз редактировалось amel27, 18-12-2009 в 01:07.

Это сообщение посчитали полезным следующие участники:

Отправлено: 10:40, 17-12-2009 | #20



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Обработка ключей запуска CMD- файла

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - [решено] Помогите запустить CMD-файл из CMD-файла с параметрами Oleg48 Скриптовые языки администрирования Windows 2 18-11-2009 11:08
CMD/BAT - [решено] вывод текстового файла на экран cmd idsp Скриптовые языки администрирования Windows 6 06-04-2009 07:18
[решено] Службы - Изменение типа запуска через CMD vagner_HATE Microsoft Windows NT/2000/2003 2 03-09-2008 06:31
Помогите пожалуйста не срабатывает команда из*cmd файла запускаемого из RanOnceEx.cmd vovchiku Автоматическая установка Windows 2000/XP/2003 6 25-09-2007 23:38
Обработка лог-файла на C++ Guest Программирование и базы данных 17 23-03-2004 01:11




 
Переход