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

Command line 用于分析包含逗号分隔值的命令行输入的批处理文件,command-line,command-line-arguments,batch-file,Command Line,Command Line Arguments,Batch File,我正在开发一个命令行实用程序,它将一组输入参数作为命令。 然后根据预定义的名称验证这些输入参数。以以下方式调用该实用程序: runUtility.cmd-A-bx,y,z-cw 这里的参数是A、B和C(以-)开头的参数。 现在验证规则如下所示: 参数的名称应该匹配预定义的名称,这样就不能传递任何无效的参数,比如-UVW 参数可能有值,也可能没有值。在上面的例子中,-A没有值,而-B有x,y,z,-C有w 我编写了以下代码来验证输入: :validate set argument=%1 set

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

runUtility.cmd-A-bx,y,z-cw

这里的参数是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放在一起。

    这里有一些东西可以让您继续,它基于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
    )
    )
    )
    )
    )
    )
    

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

    runUtility.cmd -A -B "x,y,z" -C w
    
    您的脚本可以使用
    ~
    修饰符删除包含的引号。最好将整个作业括在引号内,以防止出现问题字符,如
    &
    |
    等。下面作业中的双引号将不包含在值中

    set "argumentValue=%~2"
    

    我开发了一个选项解析器,您可能想看看:

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

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

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

    set "options=-A: -B:"" -C:"""
    
    表示不带值的
    -A
    选项,以及带值但默认为未定义的
    -B
    -C
    选项


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

    目的是验证参数的名称和空值。但当我们得到任何参数的逗号分隔值时,代码失败。我认为以上的解决方案对它不起作用。任何建议都欢迎。编辑-我更正了必须对链接选项解析器进行更改的列表,如果要将其用于此问题。