为什么命令行参数在ELSE中表现奇怪?

时间:2015-08-28 16:36:11

标签: batch-file if-statement command-line-arguments

我有一个名为arg_parse.cmd的Windows批处理文件,它在某些条件下解析命令行参数。在其他条件下,它会做其他事情。下面是一个最小的(非)工作示例:

@ECHO OFF

IF 0 == 1 (
    REM Do nothing
) ELSE (
    :parse
        REM Print input argument.
        ECHO.
        ECHO 1 = %1

        REM Set argument to local variable.
        SET arg1=%1

        REM Break after parsing all arguments.
        IF "%~1" == "" GOTO :endcmd

        REM Print local variable.
        ECHO arg1 = %arg1%

        SHIFT
        GOTO :parse
    :endcmd
    REM Do not remove this comment.
)

在第一次迭代中,通过解析"循环",显然有一个参数,但是SET似乎什么都不做,因为arg1是一个空字符串。在进一步的迭代中,它表现正常。例如,如果我使用一些参数运行脚本:

arg_parse.cmd test some arguments

我得到了这个输出:

1 = test
arg1 =

1 = some
arg1 = some

1 = arguments
arg1 = arguments

1 =

为什么它在第一次迭代时的行为如此?此外,如果删除最终评论,为什么会出现) was unexpected at this time错误?

1 个答案:

答案 0 :(得分:1)

这里有两个问题。

1)当您为括号内的变量赋值时,您需要delayed expansion

2)GOTO打破括号上下文(包括在IF中)并且右括号变为无效

Here's a technique,允许你在括号内移位。