用于解析包含逗号分隔值的命令行输入的批处理文件

Sau*_*abh 3 command-line batch-file command-line-arguments

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

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        
Run Code Online (Sandbox Code Playgroud)

但这似乎不起作用,因为-B具有逗号分隔值,因此对于B进行两次移位时,在下一次迭代中,y变为%1,z变为%2.由于y不是参数,因此最后一行代码"参数y无效"失败.实际上,逗号被SHIFT命令视为分隔符,因此x,y,z确实保持单个值.

我想将x,y,z视为单个值,还是有其他方法来处理它?我对批处理脚本有点新意,我尝试使用FOR循环,但是在每次迭代中我都无法将%1和%2放在一起.

dbe*_*ham 9

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

runUtility.cmd -A -B "x,y,z" -C w
Run Code Online (Sandbox Code Playgroud)

您的脚本可以使用~修饰符删除封闭的引号.这也是引号内您的整个作业,以防止有问题的字符是一个好主意&,|等在下面的分配双引号将不包括在该值.

set "argumentValue=%~2"
Run Code Online (Sandbox Code Playgroud)


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

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

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

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

set "options=-A: -B:"" -C:"""
Run Code Online (Sandbox Code Playgroud)

含义的-A,这并不需要一个价值选择,并-B-C该取值但默认选项是不确定的.

选项存储在与选项名称匹配的变量中(包括短划线).