Войти

Показать полную графическую версию : [решено] Можно ли передать в cmd/bat именованные параметры?


FunkyByte
09-02-2009, 20:06
Возможно ли передать в cmd/bat именованные параметры, например как-то так:
somebat.bat /firstparam:firstvalue /secparam:secvalue
Т.е. чтобы в скрипте обращаться к параметрам можно было не по порядковому номеру, а по имени параметра.

Котяра
09-02-2009, 20:49
FunkyByte, насколько я знаю, нет :(

Petya V4sechkin
09-02-2009, 21:10
FunkyByte, придется обработку делать в самом скрипте:
@Echo Off
SetLocal EnableExtensions EnableDelayedExpansion

:CmdLine
Set P=%1
If "!P!"=="" GoTo :Cont

If /I "!P:~0,12!"=="/FirstParam:" Set FirstParam=!P:~12!
If /I "!P:~0,10!"=="/SecParam:" Set SecParam=!P:~10!

Shift
GoTo :CmdLine
:Cont

Echo FirstParam=!FirstParam!
Echo SecParam=!SecParam!

Здесь 12 - длина строки "/FirstParam:", 10 - длина строки "/SecParam:"
Результаты в переменных !FirstParam! и !SecParam!

gora
11-02-2009, 10:18
FunkyByte, немного изменил скрипт от Petya V4sechkin, чтобы не привязываться к именам переменных и их количеству, которые могут быть изменены пользователем, и не зависеть от их длины.@Echo off
SetLocal EnableExtensions EnableDelayedExpansion

:CmdLine
If %1#==# GoTo :Cont
Set P=%1
for /f "tokens=1,2 delims=:" %%i in ("!P:~1!") do Set %%i=%%j

Shift
GoTo :CmdLine
:Cont
rem следующие строки нужны только для контроля при отладке, т.к., имена переменных могут быть изменены пользователем
Echo FirstParam=!FirstParam!
Echo SecParam=!SecParam!

romkus
24-05-2014, 12:33
Здравствуйте все! Спасибо gora! Натолкнуло на мысли... ещё подредактировал его скрипт, и вот что получилось:
@Echo off
SetLocal EnableExtensions EnableDelayedExpansion

REM Скрипт создает переменные среды с именами и значениями параметров.
REM Каждый параметр должен начинатся с имени, перед которым стоит знак "/", "-" или "\". Значение параметра следует за именеи через разделительный знак (по умолчанию - пробел).
REM Имеет два служебных параметра:
REM cDelims - знак, разделяющий имя параметра и его значение. По умолчанию - пробел. Для изменения знака первым параметром нужно передать "cDelims <знак>":
Set cDelims=
REM cTraceParams=1 включает отображение параметров и их значений при разборе:
Set cTraceParams=

SET EXCLAMATION=^^!

Set cParamName=
Set /A cParamNum=0

Set cParReturnStr=

:CmdLine
If %1#==# GoTo :Cont
Set P=%1

for /f "tokens=1,2 delims=%cDelims%" %%i in ("!P!") do (
Set cFirstPart=%%i
Set cParamIdent=!cFirstPart:~0,1!

Set cNameFound=0
if defined cParamIdent (
if "!cParamIdent!"=="/" Set cNameFound=1
if "!cParamIdent!"=="-" Set cNameFound=1
if "!cParamIdent!"=="\" Set cNameFound=1
)

if !cNameFound! EQU 1 (
REM Якщо знайшли iдентифiкатор параметра то опис попереднього параметра закiнчився, приймаємо його:
call :AcceptLastParam

Set cParamName=!cFirstPart:~1!

Set !cParamName!=%%~j
) else (
if defined cParamName (
REM echo Була назва "!cParamName!"

REM Додаємо слово до параметра (якщо значення вказано без лапок):
Set cValue=
call :getvalue !cParamName! cValue
REM Set cValue=!TmpVar!
Set cValueContinuation=
call :DelSemicolons !P! cValueContinuation
if defined cValue (
Set !cParamName!=!cValue! !cValueContinuation!
) else (
Set !cParamName!=!cValueContinuation!
)
) else (
echo Неожиданное значение !P!...
)
)
)

Shift
GoTo :CmdLine

:AcceptLastParam
if defined cParamName (
REM Якщо задали параметер "cTraceParams" - вiдображаємо параметри:
if defined cTraceParams (
if !cTraceParams! EQU 1 (
call :ShowParam
)
)
REM Формуємо рядок передачi параметрiв з цього скрипта на рiвень вище:
call :AcceptParam
)
exit /b

:AcceptParam
REM Варiант 1: вписуємо iмена змiнних щоб потiм повернути їх як глобальнi:
if defined cParReturnStr (
Set cParReturnStr=!cParReturnStr! ^& ^(SET !cParamName!=!EXCLAMATION!!cParamName!!EXCLAMATION!^)
) else (
Set cParReturnStr=^(SET !cParamName!=!EXCLAMATION!!cParamName!!EXCLAMATION!^)
)
exit /b

:ShowParam
Set cParamValue=
call :getvalue !cParamName! cParamValue
if defined cParamValue (
Set /A cParamNum=!cParamNum!+1
echo.
echo !cParamNum!: !cParamName!=!cParamValue!

) else (
echo !cParamNum!: для "!cParamName!" значение ещё не найдено...
)
exit /b

:getvalue
Set %2=!%1!
exit /b

:DelSemicolons
Set %2=%~1
exit /b


:ReturnParameters
Set %2="%~1"
exit /b

:Cont

REM Читання останнього параметра закiнчилося, приймаємо його:
call :AcceptLastParam

Set ParResStr=
REM Розкриваємо вписанi iмена змiнних в їхнi значення. Беремо все в лапки щоб не розпiзнавалося тут як команда..:
Call :ReturnParameters "!cParReturnStr!" ParResStr

EndLocal & %ParResStr:~1,-1%

Теперь скрипт можно вызывать из другого скрипта, передавая ему именованные параметры. Также теперь значения параметров могут содержать пробелы и не быть заключены в кавычки (впрочем, для передачи, например, знаков препинания кавычки нужно ставить). Можно изменять знак между именем и значением при вызове скрипта. В ответ скрипт создаст переменные с соответствующими именами и значениями.
Правда, как и раньше, требует доработки для передачи спецсимволов в значениях параметров.
Может кому-то пригодится для чего-нибудь доброго... :)




© OSzone.net 2001-2012