3

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

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

if "%1" == "-i" (
set is = %2
echo. %is%
shift
)

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

它出什么问题了?

调用示例:

c:\script.bat -i test -d bla
4

1 回答 1

7

你有两个问题。默认情况下,括号中的语句组将一次完成变量扩展,即在您的set命令之前。的语义set也是错误的,你不希望=.

将此添加到文件的顶部:

setlocal ENABLEDELAYEDEXPANSION

并删除周围的=空格set

set is=%2

最后使用延迟扩展:

echo. !is!

可能的第三个问题是您可能需要两个SHIFTs,一个用于-i,一个用于它的is论点。

更新

感谢@dbenham 指出这不是语法错误set,这只是令人惊讶的行为,值得稍微解释一下。如果执行这些命令:

set a=one
echo "%a%"

结果是:

"one"

这是有道理的,但请尝试:

set b = two
echo "%b%"

你得到:

"%b%"

什么?这是未设置环境变量时您所期望b的。但我们只是设置它。还是我们:

echo "%b %"

显示:

" two"

对于 Windowsset命令,与我所知道的任何其他语言或环境不同,空格很重要。前面的空格=成为环境变量名的一部分,后面的空格成为值的一部分。这种不常见的行为是编写 Windows 批处理程序时常见的错误来源。

于 2012-12-10T08:59:49.473 回答