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

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

Ответить
Настройки темы
CMD/BAT - [решено] Можно ли передать в cmd/bat именованные параметры?

Новый участник


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

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


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

Отправлено: 20:06, 09-02-2009

 

Аватара для Котяра

Ветеран


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

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


FunkyByte, насколько я знаю, нет

Отправлено: 20:49, 09-02-2009 | #2



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

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



Moderator


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

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


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!

Отправлено: 21:10, 09-02-2009 | #3


Аватара для gora

Ушёл из жизни


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

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


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!
Это сообщение посчитали полезным следующие участники:

Отправлено: 10:18, 11-02-2009 | #4


Новый участник


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

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


Здравствуйте все! Спасибо 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%
Теперь скрипт можно вызывать из другого скрипта, передавая ему именованные параметры. Также теперь значения параметров могут содержать пробелы и не быть заключены в кавычки (впрочем, для передачи, например, знаков препинания кавычки нужно ставить). Можно изменять знак между именем и значением при вызове скрипта. В ответ скрипт создаст переменные с соответствующими именами и значениями.
Правда, как и раньше, требует доработки для передачи спецсимволов в значениях параметров.
Может кому-то пригодится для чего-нибудь доброго...

Отправлено: 12:33, 24-05-2014 | #5



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

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

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Установка - [решено] Как через cmd отключить параметры схемы питания? Milagro Microsoft Windows 7 3 21-12-2011 19:01
Разное - [решено] перезагрузка из .bat или .cmd San_dr Программирование и базы данных 7 03-08-2011 01:58
CMD/BAT - [решено] разница между bat и cmd alexandri Скриптовые языки администрирования Windows 2 11-01-2010 22:29
CMD/BAT - [решено] Параметры сети через BAT. как? Pozia Скриптовые языки администрирования Windows 1 04-11-2009 20:36
Как передать параметры из формы с множественным значением koresaram Вебмастеру 3 22-07-2006 13:06




 
Переход