为什么命令行参数在 ELSE 中表现异常?
Why do command line arguments behave strangely inside an ELSE?
我有一个名为 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.
)
在通过解析 "loop" 的第一次迭代中,显然有一个参数,但是 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) 当你给括号内的变量赋值时你需要delayed expansion
2) GOTO 中断括号上下文(包括在 IF 内)并且右括号无效
Here's a technique 这将允许您在括号内移动。
我有一个名为 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.
)
在通过解析 "loop" 的第一次迭代中,显然有一个参数,但是 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) 当你给括号内的变量赋值时你需要delayed expansion
2) GOTO 中断括号上下文(包括在 IF 内)并且右括号无效
Here's a technique 这将允许您在括号内移动。