我正在开发一个命令行实用程序,它将一组输入参数作为命令。
然后根据预定义名称验证这些输入参数。该实用程序以这种方式调用:
运行实用程序.cmd -A -B x,y,z -C w
这里的参数是 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 。
批处理使用空格、逗号、分号、制表符和等于分隔参数的任意组合。如果要在参数中包含任何这些字符,则必须用引号引起该参数。
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(使用前将#替换为@)