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

时间:2012-11-09 16:14:43

标签: command-line command-line-arguments batch-file

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

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

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

  1. 参数名称应与预定义名称匹配,因此无法传递任何无效参数,例如-UVW

  2. 参数可能有也可能没有值。在上面的例子中-A没有值,而-B有x,y,z和-C有w。

  3. 我编写了这段代码来验证输入:

    :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放在一起。

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
)
)
)
)
)
)