蝙蝠文件和标签

问题描述 投票:0回答:6

我正在尝试为网络策略编写一个 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:est”中,id 确实存在。所以它应该回显文件存在到控制台。但是,“文件存在”和“文件丢失”都会回显到控制台。我发现如果我从文件夹中删除文件或简单地重命名它,它只会回显“文件丢失”

为什么它同时运行两个标签?

cmd batch-file
6个回答
11
投票

因为 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 的命令外壳 [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

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


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

1
投票

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

echo file missing

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

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


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

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

0
投票

你可以简单地

@echo off


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

:EXISTING
  echo file exists
goto :eof
rem eof means end of file

:MISSING
  echo file missing
goto :eof

ping localhost -n 5 >NUL`enter code here`
© www.soinside.com 2019 - 2024. All rights reserved.