批量变量分配

el_*_*rom 2 variables batch-file

这个问题似乎(非常)愚蠢,我无法处理它:(

当我尝试这个批处理代码时:

if "%1" == "-i" (
set is = %2
echo. %is%
shift
)
Run Code Online (Sandbox Code Playgroud)

用2(或更多)参数调用,它不起作用.它实际上打印出一个空白."shift"命令也没有完成.当我观察执行的代码(开头没有关闭@echo)时,我可以看到"set"命令已完成.

它出什么问题了?

调用示例:

c:\script.bat -i test -d bla
Run Code Online (Sandbox Code Playgroud)

jim*_*ark 5

你有两个问题.默认情况下,parens中的语句组将同时执行变量扩展,即在set命令之前完成.语义set也是错误的,你不需要周围的空格=.

将其添加到您的文件顶部:

setlocal ENABLEDELAYEDEXPANSION
Run Code Online (Sandbox Code Playgroud)

和周围删除空格=set:

set is=%2
Run Code Online (Sandbox Code Playgroud)

最后使用延迟扩展:

echo. !is!
Run Code Online (Sandbox Code Playgroud)

可能的第三个问题是你可能需要两个SHIFTs,一个用于-i,一个用于它的is参数.

更新

感谢@dbenham指出它不是语法错误set,这只是令人惊讶的行为值得一点解释.如果您执行以下命令:

set a=one
echo "%a%"
Run Code Online (Sandbox Code Playgroud)

结果是:

"one"
Run Code Online (Sandbox Code Playgroud)

这是有道理的,但尝试:

set b = two
echo "%b%"
Run Code Online (Sandbox Code Playgroud)

你得到:

"%b%"
Run Code Online (Sandbox Code Playgroud)

什么?这是您在b未设置环境变量时所期望的.但我们只是设定它.或者我们:

echo "%b %"
Run Code Online (Sandbox Code Playgroud)

显示:

" two"
Run Code Online (Sandbox Code Playgroud)

对于Windows set命令,与我所知道的任何其他语言或环境不同,空间非常重要.在=成为环境var名称的一部分之前的空格,空格成为值的一部分之后.在编写Windows批处理程序时,这种不常见的行为是常见的错误来源.