Command line 用于分析包含逗号分隔值的命令行输入的批处理文件
我正在开发一个命令行实用程序,它将一组输入参数作为命令。 然后根据预定义的名称验证这些输入参数。以以下方式调用该实用程序: runUtility.cmd-A-bx,y,z-cw 这里的参数是A、B和C(以-)开头的参数。 现在验证规则如下所示: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
: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
选项
选项存储在与选项名称(包括破折号)匹配的变量中。目的是验证参数的名称和空值。但当我们得到任何参数的逗号分隔值时,代码失败。我认为以上的解决方案对它不起作用。任何建议都欢迎。编辑-我更正了必须对链接选项解析器进行更改的列表,如果要将其用于此问题。