我正在尝试为网络策略编写一个 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 确实存在。所以它应该回显文件存在到控制台。但是,“文件存在”和“文件丢失”都会回显到控制台。我发现如果我从文件夹中删除文件或简单地重命名它,它只会回显“文件丢失”
为什么它同时运行两个标签?
因为 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。
这是因为你需要跳过“缺失”位,如果它存在的话:
@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
回显文件存在后,下一个命令是
echo file missing
你需要做一些事情来跳过丢失的案例。也许另一个转到 :PING 标签?
当你在调试时,它有助于保持回声。
因为
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
@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
你可以简单地
@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`