我正在尝试为网络策略编写一个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文件存在于控制台中。但是,“文件存在”和“文件丢失”都会回显到控制台。我发现如果我从文件夹中删除文件或只是重命名它,它只会回应“文件丢失”
为什么它运行两个标签?
答案 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