Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scripting (此时意外-批处理脚本)_Scripting_Batch File - Fatal编程技术网

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-阅读这个问题和我的答案,看看我指的是什么: