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)
你有两个问题.默认情况下,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批处理程序时,这种不常见的行为是常见的错误来源.