蝙蝠文件和标签

时间:2010-11-03 00:08:42

标签: cmd batch-file

我正在尝试为网络策略编写一个bat文件,如果该程序不存在则会安装该程序以及其他几个函数。我正在使用GOTO语句,具体取决于是否符合某些标准。但是,似乎所有标签都没有正确触发标签。

我简化了我的脚本,以便了解可能发生的事情。

@echo off


IF EXIST c:\test\test.txt (GOTO :EXISTING) ELSE GOTO :MISSING

:EXISTING
echo file exists

:MISSING
echo file missing

ping localhost -n 5 >NUL

基本上它会检查文件“test.txt”是否存在于文件夹“c:\ test”中,而id为。所以应该将echo文件存在于控制台中。但是,“文件存在”和“文件丢失”都会回显到控制台。我发现如果我从文件夹中删除文件或只是重命名它,它只会回应“文件丢失”

为什么它运行两个标签?

5 个答案:

答案 0 :(得分:7)

因为GOTO只是执行跳转到脚本中的某一点,所以从该点开始依次执行。如果你想在运行'EXISTING'之后停止它,那么你需要做这样的事情。请注意额外的GOTO和新标签:

@ECHO OFF
IF EXIST c:\test\test.txt (GOTO :EXISTING) ELSE GOTO :MISSING

:EXISTING
echo file exists
goto :NEXTBIT

:MISSING
echo file missing

:NEXTBIT
ping localhost -n 5 >NUL

值得注意的是,使用cmd.exe(即基于NT的命令shell [NT,Win2k,XP等]),你可以像这样执行IF ... ELSE块:

@ECHO OFF
IF EXIST c:\test\test.txt (
    ECHO File exists
) ELSE (
    ECHO File missing
)
ping localhost -n 5 >nul

...所以你可以完全消除你的GOTO。

答案 1 :(得分:2)

这是因为如果它存在,你需要跳过“丢失”位:

    @echo off

    IF EXIST c:\test\test.txt (GOTO :EXISTING) ELSE GOTO :MISSING

:EXISTING
    echo file exists
    goto :COMMON

:MISSING
    echo file missing

:COMMON
    ping localhost -n 5 >NUL

您可能还需要记住,当前的cmd.exe批处理语言比MS-DOS附带的语言更强大。我更喜欢这个:

@echo off
if exist c:\test\test.txt (
    echo file exists
) else (
    echo file missing
)
ping localhost -n 5 >nul

答案 2 :(得分:1)

存在echo文件后,下一个命令是

echo file missing

您需要做一些事情来跳过遗失的案例。也许另一个转到:PING标签?

当你进行调试时,它有助于保持回声。

答案 3 :(得分:1)

因为GOTO语句将执行移动到该标签。要在像您这样的情况下使用它,您需要添加另一个GOTO标签。

@echo off

IF EXIST c:\test\test.txt (GOTO :EXISTING) ELSE GOTO MISSING

:EXISTING
echo file exists
GOTO END

:MISSING
echo file missing
GOTO END

:END
ping localhost -n 5 >NUL

答案 4 :(得分:0)

@echo off

IF EXIST "c:\test\test.txt" ( :: warning double quotes

GOTO EXISTING
) ELSE (                      :: this format best in batch
GOTO MISSING
)                             :: don't forget

:EXISTING
echo file exists
goto OTHER                    :: if file exist jump OTHER

:MISSING
echo file missing
                              :: label is not required
:OTHER
timeout /t 5 >nul
pause