如何使用BATCH文件中的SWITCH解析命令行参数

Abh*_*ahu 2 batch-file switch-statement

我们正在尝试创建一个switch语句,该语句在批处理文件中解析命令行参数.

mybatch.bat -a 10 -b name -c India --zipcode 20

只有-a,-b,-c是解析参数(以 - 开头)

我们的代码就像

mybatch.bat -a 10 -b name -c India --zipcode 20
Run Code Online (Sandbox Code Playgroud)

Aac*_*ini 11

下面的批处理文件解析所有以...开头的参数,-并创建一系列以"option"开头的变量以及给出的所有选项的名称和值:

@echo off
setlocal EnableDelayedExpansion

set "option="
for %%a in (%*) do (
   if not defined option (
      set arg=%%a
      if "!arg:~0,1!" equ "-" set "option=!arg!"
   ) else (
      set "option!option!=%%a"
      set "option="
   )
)

SET option
Run Code Online (Sandbox Code Playgroud)

例如:

>test -a 10 -b name -c India --zipcode 20
option--zipcode=20
option-a=10
option-b=name
option-c=India
Run Code Online (Sandbox Code Playgroud)

这样,如果要添加/更改/删除任何选项,只需使用所需选项的值,就不需要对解析代码进行任何更改.例如:

if defined option-x (
   echo Option -x given: "%option-x%"
) else (
   echo Option -x not given
)
Run Code Online (Sandbox Code Playgroud)


Sco*_*t C 7

通常,您会尝试保持简单并为参数设置顺序.要处理任何参数,随机顺序要比知道%1 =数字,%2 =名称和%3以后=地点要多得多.

也就是说,这是尝试解决方案.我忽略了 - 在地方部分的游戏,只是将价值观加在一起.

@echo off
setlocal

:loop
if x%1 equ x goto done
set param=%1
if %param:~0,1% equ - goto checkParam
:paramError
echo Parameter error: %1 

:next
shift /1
goto loop

:checkParam
if "%1" equ "-a" goto A
if "%1" equ "-b" goto B
if "%1" equ "-c" goto C
goto paramError

:A
    shift /1
    set first_number=%1
    goto next

:B
    shift /1
    set name=%1
    goto next

:C
    set place=
:GetPlaces
    shift /1
    set param=%1
    if not defined param goto donePlaces
    if %param:~0,2% equ -- (
        shift /1
        goto processPlace
    )
    if %param:~0,1% equ - goto donePlaces
:processPlace
echo.%place%
    if x%1 neq x (
        set place=%place% %1
        goto GetPlaces
    )
:donePlaces
    rem remove leading space
    if defined place set place=%place:~1%
    goto loop



:done

echo num=%first_number%     name=%name%     place=%place%
Run Code Online (Sandbox Code Playgroud)