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

2024-04-09

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

运行实用程序.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 。


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

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

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

set "argumentValue=%~2"


我开发了一个您可能想看看的选项解析器:Windows Bat文件可选参数解析 https://stackoverflow.com/a/8162578/1012053.

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

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

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

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

意思是-A不带值的选项,以及-B and -C接受值但默认情况下未定义的选项。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐