如何在批处理文件中使用SWITCH解析命令行参数

4
我们正在尝试制作一个在批处理文件中解析命令行参数的switch语句。
mybatch.bat -a 10 -b name -c India --zipcode 20

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

我们的代码将会是这样的:

for %%x in (%*) do (
     switch(%%x) (
          case a:
                 SET first_number=%arg%
                 break
          case b:
                 SET name=%arg%
          case c:
                 for %%x in (%*) do (
                       SET place =%place% %arg%
                  )
          default:
                  echo wrong parameter
           )
3个回答

14
下面的批处理文件解析以“-”开头的所有参数,并创建一系列以“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
例如:
>test -a 10 -b name -c India --zipcode 20
option--zipcode=20
option-a=10
option-b=name
option-c=India

这种方式可以让你在想要添加/改变/删除任何选项时无需更改解析代码,只需使用你想要的选项值即可。例如:

if defined option-x (
   echo Option -x given: "%option-x%"
) else (
   echo Option -x not given
)

8
通常情况下,您尝试保持简单并对参数进行设置顺序。处理任意、随机顺序的参数比只知道 %1 = 数字、%2 = 名称和 %3 及以后的参数= 地点要费力得多。虽然如此,在这里我会尝试解决方案。我将忽略地点部分中的 --params,只需将值连接在一起即可。
@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%

当我使用给定的示例参数运行此命令时:-a 10 -b name -c India --zipcode 20,我得到输出:India,然后出现错误2 was unexpected at this time. - Sam Hasler
很好的发现@SamHasler,我已经更新了我的示例以添加if not defined param goto donePlaces。显然,我所有的测试都是使用-c作为早期参数。 - Scott C

1
在批处理中没有switch命令。您需要使用if语句进行解决:
@echo off
setlocal enableDelayedExpansion
for /l %%a in (1,2,6) do (
    set /a next=%%a+1

    set param=%%a

    call set _param=%%!param!
    call set _next=%%!next!

    rem echo -!next! -!_next! #!_param! #%%a 

    if "!_param!" equ "-a" (
        set first_number=!_next!
    )

    if "!_param!" equ "-b" (
        call set name=!_next!
    )

    if "!_param!" equ "-c" (
        set place=!_next!
    )

)

for %%a in (place first_number name) do (
    if not defined %%a set wrong_parameter=1
)

if defined wrong_parameter (
    echo wrong parameter
)

echo %place% %first_number% %name%

请将位置参数放在最后一个,-c 可以作为第二个参数。<br/> 例如:<br/>mybatch.bat -a 10 -c India --zipcode 20 -b name - Abhi Kumar Sahu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接