Sau*_*abh 3 command-line batch-file command-line-arguments
我正在使用一个命令行实用程序,它将一组输入参数作为命令.然后根据预定义的名称验证这些输入参数.以这种方式调用该实用程序:
runUtility.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
Run Code Online (Sandbox Code Playgroud)
但这似乎不起作用,因为-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
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该取值但默认选项是不确定的.
选项存储在与选项名称匹配的变量中(包括短划线).
| 归档时间: |
|
| 查看次数: |
8736 次 |
| 最近记录: |