2013-03-14 3 views
0

Существует пакетный скрипт, который мне нужно написать, назовем его script.bat. И я хочу, чтобы у него были опции, давайте назовем их option1 и option2. Точно так же, как знаменитый --help, мы видим везде.Запись командного файла с дефисными параметрами

И я хотел бы 4 следующих строк, чтобы быть 4 возможными командами для запуска сценария, в соответствии с потребностями пользователя:

script.bat -option1 value1 -option2 value2 
script.bat -option2 value2 -option1 value1 
script.bat -option1 value1 
script.bat -option2 value2 

Теперь на кодирование сценария: Я хотел бы аккуратный способ справиться опция считывание. Я знаю о показаниях параметров (% 0 для имени программы,% 1 для параметра 1 и т. Д.). Но это не очень гибко, поскольку параметры, как следует из названия, могут быть необязательными и в любом порядке (cf выше команды в строке 2 блока кода).

Как бы вы так поступили?

Спасибо!

+0

возможно дубликат [Windows Bat подать необязательный аргумент синтаксический] (http://stackoverflow.com/questions/3973824/windows-bat-file-optional-argument- разбор) – dbenham

ответ

2
@ECHO OFF 
SETLOCAL 
SET options=option1 option2 anotheroption 
SET switches=switch1 switch2 anotherswitch 
CALL :readoptions %* 
FOR %%i IN (%options% %switches% badoptions) DO IF DEFINED %%i (SET %%i) ELSE (ECHO %%i NOT set) 
GOTO :eof 

:readoptions 
FOR %%i IN (%options% %switches% badoptions) DO (SET %%i=) 
:optlp 
SET _parm1=%1 
IF NOT DEFINED _parm1 GOTO :EOF 
FOR %%i IN (%switches%) DO IF %_parm1%==-%%i SET %%i=Y&(SET _parm1=) 
IF NOT DEFINED _parm1 shift&GOTO :optlp 
FOR %%i IN (%options%) DO IF %_parm1%==-%%i (
SET %%i=%2 
IF DEFINED %%i shift&shift&(SET _parm1=) 
) 
IF DEFINED _parm1 SET badoptions=%badoptions% %1&SHIFT 
GOTO :optlp 

Если вы хотите/опции или/переключатели, изменения должны быть очевидны

Для любого набора переключателей, поместите switchnames в эр, switches и так же имена параметров в options. Если -switchname находится в командной строке, то переменная switchname установлена ​​в Y, иначе она не будет установлена. Аналогично, если найдено -optionname, то следующий параметр задается как значение переменной optionname, в противном случае optionname не установлен.

Любой параметр, который не является ни обозначенную switchname ни Optionname, ни OptionValue будут собраны в badoptions

Так что - с набором опций и переключателей, как показано на рисунке, команда

thisbatch -switch2 -option2 optionvalue -invalid 

бы очистить переменные option1 , anotheroption, switch1 и anotherswitch; комплект switch2 = Y; установить option2 = OptionValue и badoptions = -invalid

+0

Большое спасибо за ваш ответ. Не могли бы вы объяснить, что это значит: ".% _ Parm1% == .- %% i" Я путаюсь в использовании точек. – Myna

+1

Хмм - похоже, это похмелье из какого-то более раннего кода. Логически им не обязательно быть там. Идея заключалась в том, чтобы ни в коем случае ни одна строка слева или справа от '==' не была пустой, поскольку пустая строка в этих позициях создавала синтаксическую ошибку. Поскольку %% i не может быть пустым, и каждому непосредственно предшествует 'IF NOT DEFINED', действующий на переменной' _parm1', тогда точки являются излишними. Я отредактирую их и добавлю несколько заметок ... – Magoo

+0

Спасибо за редактирование, это намного яснее! – Myna

3

Не 100%, что вы были после, но как насчет:

@echo off 

setlocal 

set OPTION1= 
set OPTION2= 
set OPTION3= 

:ARGS_LOOP 
if {%1} == {} goto END_OF_ARGS 
set ARG=%1 

if /i "%ARG:~0,9%" == "/OPTION1:" set OPTION1=%ARG:~9% 
if /i "%ARG:~0,9%" == "/OPTION2:" set OPTION2=%ARG:~9% 
if /i "%ARG:~0,9%" == "/OPTION3:" set OPTION3=%ARG:~9% 

shift 

goto ARGS_LOOP 

:END_OF_ARGS 

echo Option 1 was set to [%OPTION1%] 
echo Option 2 was set to [%OPTION2%] 
echo Option 3 was set to [%OPTION3%] 

endlocal 

Это может быть сохранен как, например, TEST.CMD, а затем запустить как:

TEST.CMD/option1: xxx/option2: yyy

И т.д. Порядок опций, указанных в командной строке, не имеет значения.

+0

Сладкий, спасибо Саймон. Только вопрос, не могли бы вы рассказать мне, что делает эта команда? : if/i "% ARG: ~ 0,9%" == "/ OPTION1:" set OPTION1 =% ARG: ~ 9% – Myna

+1

Он сравнивает первые девять символов 'ARG' с'/OPTION1: ', а затем устанавливает значение 'OPTION1' для всего после девятого символа. – aphoria

Смежные вопросы