Scripting (此时意外-批处理脚本)
我正在使用下面的批处理脚本,并得到一个错误 (这在当时是出人意料的 我知道问题出在第一行,但我不明白哪里出了问题。 有什么想法吗 脚本:Scripting (此时意外-批处理脚本),scripting,batch-file,Scripting,Batch File,我正在使用下面的批处理脚本,并得到一个错误 (这在当时是出人意料的 我知道问题出在第一行,但我不明白哪里出了问题。 有什么想法吗 脚本: IF [%1]==[] ( :LOOP1 SET /P isDefault=Value Missing, do you want to use default values [1,1,10,Local Area Connection 2]?[y/n] IF %isDefault%==y ( SET from=1
IF [%1]==[] (
:LOOP1
SET /P isDefault=Value Missing, do you want to use default values [1,1,10,Local Area Connection 2]?[y/n]
IF %isDefault%==y (
SET from=1
SET step=1
SET to=10
SET lan="Local Area Connection 2"
GOTO :USERLOOP
)
IF %isDefault%==n GOTO :END
GOTO :LOOP1
)
事实上,问题不在第一行
问题在于,cmd
在解析IF
语句(包括其主体)时会立即进行变量替换。因此,行:
IF %isDefault%==y (
是有问题的,因为在分析外部IF
语句时未设置isDefault
,因此它会变成:
IF ==y (
因此,您会遇到有关(
意外)的错误。您可以通过为延迟环境变量扩展启用命令扩展(SETLOCAL ENABLEDELAYEDEXPANSION
)来解决此问题(有关详细信息,请参阅set/?
)。您还可以重写脚本:
@ECHO OFF
IF NOT "%1"=="" GOTO :EOF
:LOOP1
SET /P isDefault=Value Missing, do you want to use default values [1,1,10,Local Area Connection 2]?[y/n]
IF "%isDefault%"=="y" (
SET from=1
SET step=1
SET to=10
SET lan="Local Area Connection 2"
GOTO :USERLOOP
)
IF "%isDefault%"=="n" GOTO :EOF
GOTO :LOOP1
(我做了一些其他更改,例如使用内置的
:EOF
标签而不是:END
)正如jamesdlin所说,这是空变量和延迟扩展的问题。然后,将
%isDefault%
替换为!isDefault!
,解决方案很简单,即使isDefault为空,该方法也可以工作
setlocal EnableDelayedExpansion
IF [%1]==[] (
:LOOP1
SET /P isDefault=Value Missing, do you want to use default values [1,1,10,Local Area Connection 2]?[y/n]
IF !isDefault!==y (
SET from=1
SET step=1
SET to=10
SET lan="Local Area Connection 2"
GOTO :USERLOOP
)
IF !isDefault!==n GOTO :END
GOTO :LOOP1
)
我遇到了一个非常类似的问题和代码构造,这给我带来了很多麻烦。我的错误消息是。这一次是出乎意料的“ 由于这个问题,我花了好几天的时间才想出另一个类似的考虑因素……请在此查看以下问题和后续解决方案: 解决方案只是在IF语句块内的回显行上处理“(”和“)” 问题是,当故障排除(如果可能)语句时,请考虑处理特殊字符作为问题的可能来源。
HTH某人…您使用第一个IF语句戏剧性地改变了预期的行为。我不能确定,但它可能应该是
IF NOT“%~1”==”GOTO:USERLOOP
。您假设在:END
标签后面没有代码-可能在末尾有必须执行的清理代码,因此GOTO:EOF
可能不正确。@dbenham:Argh再次出现。我的意思是第一行的如果没有。这就是我匆忙回答的结果。是的,我做了一些假设关于:END
;很难说没有看到更多的脚本。仍然不正确-我认为应该转到:USERLOOP。如果提供了参数,那么批处理将直接转到代码的功能部分(:USERLOOP)。否则,它将进入默认参数处理,然后可能进入:USERLOOP.Jeb-在IF块中保留goto标签真是太淘气了:)我意识到代码会像写的那样正常工作。但是如果choppy认为这是可以的,他/她会得到一个粗鲁的惊喜,然后在有ELSE子句时也会这样做。@choppy-阅读这个问题和我的答案,看看我指的是什么: