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

Компьютерный форум 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

 

Аватара для volk1234

Старовер


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

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


Приведенный код
Код: Выделить весь код
 Call Set $_%$I%=%%$_%$I%%%%$P:~1%
отрезает не только '-' но и первые цифры, буквы от параметров.
Т.е. приведенная вами тестовая строчка дает результат

Код: Выделить весь код
reg1 55 
reg2 28 56
Второй вопрос - можно вставить такую обработку команды -unlockall, чтобы она выполнялась одна и другие ключи игнорировались?

Код: Выделить весь код
:CMD_PARSE
  If /I "%$P:~0,1%"=="-" Set /A $I=%$I%+1
  Call Set $_%$I%=%%$_%$I%%%%$P:~1% 

  If "$_%$I%"=="unloackall" Goto :unlockall
GoTo :EOF
Ах да, еще мне не совсем понятно - как организовать в таком случае проверку синтаксиса - в случае указания несуществующего ключа, как завернуть скрипт на секцию :syntax_error

-------

Ю-ху!


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


Отправлено: 23:03, 17-12-2009 | #21



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

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


Googler


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

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


Цитата volk1234:
отрезает не только '-' но и первые цифры »
да, поторопился - исправил

Цитата volk1234:
чтобы она выполнялась одна и другие ключи игнорировались? »
те, что после нее?

Цитата volk1234:
как организовать в таком случае проверку синтаксиса - в случае указания несуществующего ключа, как завернуть скрипт на секцию :syntax_error »
например, так:
Код: Выделить весь код
@Echo Off

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

Exit /B

:REG1
  Echo REG1 %*
GoTo :EOF

:REG2
  Echo REG2 %*
GoTo :EOF

:SYNTAX_ERROR
  Echo ОШИБКА! Ключ "%1" не поддерживается!
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

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


Аватара для volk1234

Старовер


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

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


Цитата volk1234:
Второй вопрос - можно вставить такую обработку команды -unlockall, чтобы она выполнялась одна и другие ключи игнорировались? »
Цитата amel27:
те, что после нее? »
Нет, просто чтобы игнорировались все команды кроме нее. Просто этот ключ отменяет действия всех других - поэтому нет смысла его выполнять наряду с ними.

-------

Ю-ху!


Отправлено: 02:01, 18-12-2009 | #23


Googler


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

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


Код: Выделить весь код
@Echo Off

Set $I=0& For %%i In (%*) Do Set $P=%%i& Call :CMD_PARSE
If Not Defined $SKIP For /F "Tokens=1* Delims==" %%i In ('Set $_') Do 2>Nul Call :%%j||Call :ERR0 %%j

Exit /B

:REG1
  Echo REG1 %*
Exit /B 0

:REG2
  Echo REG2 %*
Exit /B 0

:ERR0
  Echo ОШИБКА! Ключ "%1" не поддерживается!
GoTo :EOF

:CMD_PARSE
  If /I "%$P%"=="-unlockall" Set $SKIP=TRUE
  If /I "%$P:~0,1%"=="-" Set $P=%$P:~1%& Set /A $I=%$I%+1
  Call Set $_%$I%=%%$_%$I%%%%$P% 
GoTo :EOF
Это сообщение посчитали полезным следующие участники:

Отправлено: 02:45, 18-12-2009 | #24


Аватара для volk1234

Старовер


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

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


Единственное - команда -unlockall просто вызывает завершение скроипта, а надо - переход в секцию :unlockall

-------

Ю-ху!


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


Googler


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

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


Цитата volk1234:
команда -unlockall просто вызывает завершение скроипта »
не ЗАВЕРШЕНИЕ, а пропуск обработки парметров и ПРОДОЛЖЕНИЕ работы скрипта, можно и так:
Код: Выделить весь код
@Echo Off

Set $I=0& For %%i In (%*) Do Set $P=%%i& Call :CMD_PARSE
If Defined $SKIP (GoTo :UnlockAll
) Else For /F "Tokens=1* Delims==" %%i In ('Set $_') Do 2>Nul Call :%%j||Call :ERR0 %%j

  Echo Код ПОСЛЕ обработки всех ключей
Exit /B

:UnlockAll
  Echo Код ВМЕСТО обработки ключей с последующим выходом
Exit /B

:REG1
  Echo REG1 %*
Exit /B 0

:REG2
  Echo REG2 %*
Exit /B 0

:ERR0
  Echo ОШИБКА! Ключ "%1" не поддерживается!
GoTo /B 0

:CMD_PARSE
  If /I "%$P%"=="-unlockall" Set $SKIP=TRUE
  If /I "%$P:~0,1%"=="-" Set $P=%$P:~1%& Set /A $I=%$I%+1
  Call Set $_%$I%=%%$_%$I%%%%$P% 
GoTo :EOF
P.S. Если заменить "GoTo" на "CALL :", то в :UnlockAll будет "Код ВМЕСТО обработки ключей с последующим ПРОДОЛЖЕНИЕМ"
Это сообщение посчитали полезным следующие участники:

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


Аватара для volk1234

Старовер


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

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


Что то в реальном скрипте не получается обработать несколько парамеров, (один параметр нормально)
похоже глотает пробелы скрипт между ключами и параметрами ключей...

Код: Выделить весь код
:CORE
Set $I=0& For %%i In (%*) Do Set $P=%%i& Call :KEYS_PARSE
If Defined $SKIP (GoTo :UnlockAll
) Else For /F "Tokens=1* Delims==" %%i In ('Set $_') Do 2>Nul Call :%%j||Call :Syntax_Error %%j

Echo.
Echo Skript end working& Pause
Echo.

Exit /B 0

:KEYS_PARSE
  If /I "%$P%"=="-unlockall" Set $SKIP=TRUE
  If /I "%$P:~0,1%"=="-" Set $P=%$P:~1%& Set /A $I=%$I%+1
  Call Set $_%$I%=%%$_%$I%%%%$P%

GoTo :EOF

-------

Ю-ху!


Отправлено: 16:49, 18-12-2009 | #27


Googler


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

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


Цитата volk1234:
в реальном скрипте не получается обработать несколько парамеров »
для "реального скрипта" не хватает обработчиков ошибок, параметров и "unlockall", поэтому не ясно о чем речь, кроме того в строке
Код: Выделить весь код
  Call Set $_%$I%=%%$_%$I%%%%$P% 
GoTo :EOF
отсутствует обязательный оконечный пробел, разделяющий параметры

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


Аватара для volk1234

Старовер


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

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


проблема была в другом- в конкретных секциях ожидались переменные %2 %3 которых теперь просто нет...
т.е. они могут быть, но их нет.

-------

Ю-ху!


Последний раз редактировалось volk1234, 21-12-2009 в 10:23.


Отправлено: 21:46, 20-12-2009 | #29



Компьютерный форум 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




 
Переход