如何在 BATCH 文件中使用 SWITCH 解析命令行参数
How to parse command line arguments with SWITCH in BATCH file
我们正在尝试创建一个在批处理文件中解析命令行参数的 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
)
batch.You 中没有 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%
通常情况下,您会尽量保持简单,并为参数设定顺序。要以任意顺序处理参数,比仅知道 %1 = 数字、%2 = 名称和 %3 之后 = 地点要费力得多。
话虽如此,但这是对解决方案的尝试。我忽略了 place 部分中的 --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%
下面的批处理文件解析所有以 -
开头的参数并创建一系列以 "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
这样,如果您想add/change/delete任何选项,您无需更改解析代码,只需使用您想要的选项的值即可。例如:
if defined option-x (
echo Option -x given: "%option-x%"
) else (
echo Option -x not given
)
我们正在尝试创建一个在批处理文件中解析命令行参数的 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
)
batch.You 中没有 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%
通常情况下,您会尽量保持简单,并为参数设定顺序。要以任意顺序处理参数,比仅知道 %1 = 数字、%2 = 名称和 %3 之后 = 地点要费力得多。
话虽如此,但这是对解决方案的尝试。我忽略了 place 部分中的 --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%
下面的批处理文件解析所有以 -
开头的参数并创建一系列以 "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
这样,如果您想add/change/delete任何选项,您无需更改解析代码,只需使用您想要的选项的值即可。例如:
if defined option-x (
echo Option -x given: "%option-x%"
) else (
echo Option -x not given
)