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

Показать сообщение отдельно

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


Сообщения: 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