我正在使用一个命令行实用程序,它将一组输入参数作为命令。 然后根据预定义的名称验证这些输入参数。以这种方式调用该实用程序:
runUtility.cmd -A -B x,y,z -C w
这里的参数是A,B和C(以 - 开头)。 现在验证规则如下:
参数名称应与预定义名称匹配,因此无法传递任何无效参数,例如-UVW
参数可能有也可能没有值。在上面的例子中-A没有值,而-B有x,y,z和-C有w。
我编写了这段代码来验证输入:
:validate
set argument=%1
set argumentValue=%2
if "%argument%" == "-A" (
shift
goto validate
)
if "%argument%" == "-B" (
if "%argumentValue%" == "" (
echo Empty value for -B
goto end
)
shift
shift
goto validate
)
if "%argument%" == "-C" (
if "%argumentValue%" == "" (
echo Empty value for -C
goto end
)
shift
shift
goto validate
)
if %argument%" == "" (
goto end
)
Argument %argument% is invalid
:end
但这似乎不起作用,因为-B具有逗号分隔值,因此对于B进行两次移位时,在下一次迭代中,y变为%1而z变为%2。由于y不是参数,因此最后一行代码“参数y无效”失败。 实际上,逗号被SHIFT命令视为分隔符,因此x,y,z确实保持单个值。
我希望将x,y,z视为单个值,还是有其他方法可以处理它吗? 我对批处理脚本有点新意,我尝试使用FOR循环,但是在每次迭代中我都无法将%1和%2放在一起。
答案 0 :(得分:9)
批处理使用空格,逗号,分号,制表符和等于分隔参数的任意组合。如果要在参数中包含任何这些字符,则必须引用该参数。
runUtility.cmd -A -B "x,y,z" -C w
您的脚本可以使用~
修饰符删除封闭的引号。最好将整个作业括在引号内,以防止&
,|
等问题字符。下面的作业中的双引号不会包含在值中。
set "argumentValue=%~2"
我开发了一个您可能想要查看的选项解析器:Windows Bat file optional argument parsing。
无论您定义什么选项,解析代码都不会发生变化。唯一需要更改的是使用单个变量定义选项,SHIFT /3
应修改为SHIFT /1
,每%~3
变为%~1
,{{{} 1}}变为%~4
。
选项解析器能够自动为未指定的选项提供默认值。
假设您没有默认值,您的选项将被定义为
%~2
表示不带值的set "options=-A: -B:"" -C:"""
选项,以及默认情况下取值的-A
和-B
选项未定义。
选项存储在与选项名称匹配的变量中(包括短划线)。
答案 1 :(得分:0)
这是让你前进的东西,它基于3个参数A B C,每个参数最多有3个参数,用空格分隔。它没有完成,因为我没有时间将它们放在一起,但它应该给你一些工作,你可以根据需要进行调整。
@echo off
set p1=%1
set p2=%2
set p3=%3
set p4=%4
set params=(-A -B -C)
for %%x in %params% do (
if "%p1%"=="" (
echo No parameters given
exit /b >nul
) else (
if "%p1%"=="%%x" (
if not "%p4%"=="" (
echo %%x has 3 parameters
) else (
if not "%p3%"=="" (
echo %%x has 2 parameters
) else (
if not "%p2%"=="" (
echo %%x has 1 parameter
)
)
)
)
)
)