这个问题似乎(非常)愚蠢,因为我无法处理它:(
当我尝试这个批处理代码时:
if "%1" == "-i" (
set is = %2
echo. %is%
shift
)
用 2 个(或更多)参数调用,它不起作用。它实际上打印了一个空白。“shift”命令也没有完成。当我查看执行的代码时(开头没有关闭@echo),我可以看到“set”命令已完成。
它出什么问题了?
调用示例:
c:\script.bat -i test -d bla
这个问题似乎(非常)愚蠢,因为我无法处理它:(
当我尝试这个批处理代码时:
if "%1" == "-i" (
set is = %2
echo. %is%
shift
)
用 2 个(或更多)参数调用,它不起作用。它实际上打印了一个空白。“shift”命令也没有完成。当我查看执行的代码时(开头没有关闭@echo),我可以看到“set”命令已完成。
它出什么问题了?
调用示例:
c:\script.bat -i test -d bla
你有两个问题。默认情况下,括号中的语句组将一次完成变量扩展,即在您的set
命令之前。的语义set
也是错误的,你不希望=
.
将此添加到文件的顶部:
setlocal ENABLEDELAYEDEXPANSION
并删除周围的=
空格set
:
set is=%2
最后使用延迟扩展:
echo. !is!
可能的第三个问题是您可能需要两个SHIFT
s,一个用于-i
,一个用于它的is
论点。
感谢@dbenham 指出这不是语法错误set
,这只是令人惊讶的行为,值得稍微解释一下。如果执行这些命令:
set a=one
echo "%a%"
结果是:
"one"
这是有道理的,但请尝试:
set b = two
echo "%b%"
你得到:
"%b%"
什么?这是未设置环境变量时您所期望b
的。但我们只是设置它。还是我们:
echo "%b %"
显示:
" two"
对于 Windowsset
命令,与我所知道的任何其他语言或环境不同,空格很重要。前面的空格=
成为环境变量名的一部分,后面的空格成为值的一部分。这种不常见的行为是编写 Windows 批处理程序时常见的错误来源。