3

我正在开发一个命令行实用程序,它将一组输入参数作为命令。然后根据预定义的名称验证这些输入参数。该实用程序以这种方式调用:

runUtility.cmd -A -B x,y,z -C w

这里的参数是 A、B 和 C(以 - 开头的参数)。现在验证规则如下:

  1. 参数的名称应该与预定义的名称匹配,这样就不能传递任何无效的参数,比如 -UVW

  2. 参数可能有也可能没有值。在上面的例子中 -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 放在一起。

4

2 回答 2

10

批处理使用空格、逗号、分号、制表符和等于分隔参数的任意组合。如果要在参数中包含任何这些字符,则必须引用该参数。

runUtility.cmd -A -B "x,y,z" -C w

~您的脚本可以使用修饰符删除封闭引号。将整个作业用引号括起来也是一个好主意,以防止出现问题字符,例如&,|等。下面作业中的双引号不会包含在值中。

set "argumentValue=%~2"


我开发了一个您可能想要查看的选项解析器:Windows Bat 文件可选参数解析

无论您定义什么选项,解析代码几乎不会改变。唯一需要改变的是使用单个变量定义选项,SHIFT /3应该修改为SHIFT /1,每个都%~3变成%~1%~4变成%~2

选项解析器能够自动为未指定的选项提供默认值。

假设您没有默认值,您的选项将被定义为

set "options=-A: -B:"" -C:"""

意味着一个-A不带值的选项,以及-B-C值但默认情况下的选项是未定义的。

选项存储在与选项名称匹配的变量中(包括破折号)。

于 2012-11-09T18:38:15.577 回答
0

这里有一些东西可以帮助你,它基于 3 个参数,ABC,每个参数最多有 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
)
)
)
)
)
)
于 2012-11-09T17:01:11.643 回答