(此时出乎意料 - 批处理脚本

时间:2012-03-21 06:42:59

标签: 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
        SET step=1
        SET to=10
        SET lan="Local Area Connection 2"
        GOTO :USERLOOP
    )
    IF %isDefault%==n GOTO :END
    GOTO :LOOP1 
)

3 个答案:

答案 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某人...

相关问题