我正在使用下面的批处理脚本并收到错误
(此时出乎意料。
我知道问题出在第一行,但我不明白出了什么问题。 有什么想法吗?
脚本:
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
)
答案 0 :(得分:17)
实际上,问题是第一行不。
问题是cmd
在解析IF
语句(包括其正文)时会立即执行变量替换。因此行:
IF %isDefault%==y (
是有问题的,因为在解析外部isDefault
语句时未设置IF
,因此它变为:
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
。)
答案 1 :(得分:4)
正如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
)
答案 2 :(得分:1)
我有一个非常相似的问题和代码构造,这让我很难解决。我的错误消息是"。在这个时候是出乎意料的" ......
由于这个问题我花了很长时间才弄清楚另一个类似的考虑因素......请在这里查看以下问题和后续解决方案:". was unexpected at this time" generated from batch script line 'if exist [file] (...
解决方案只是处理'('和')'在IF语句块内的ECHO行上。
关键是,在对IF(以及可能的FOR)语句进行故障排除时,请考虑将特殊字符处理为问题的可能来源。
HTH某人...