【问题标题】:Bat file and labelsBat 文件和标签
【发布时间】:2021-11-08 00:55:01
【问题描述】:

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

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

【问题讨论】:

  • 你在这里写了一个switch 没有break 的。
  • 您将GOTO 视为function() 调用,但事实并非如此。

标签: cmd batch-file


【解决方案1】:
@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

【讨论】:

    【解决方案2】:

    因为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
    

    【讨论】:

      【解决方案3】:

      因为 GOTO 只是在执行中跳转到脚本中的某个点,因此从该点开始按顺序继续执行。如果您希望它在运行“现有”后停止,那么您需要执行类似的操作。注意额外的 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
      

      ...这样您就可以完全消除 GOTO。

      【讨论】:

      • 我不认为localhost 可以处理 5 品脱
      • @jncpl ... 啤酒驱动的电脑?还是啤酒动力编程? :-) 错字已修复,ta。
      • @Joey ... ta,已修复。好多年没碰过NT4了,也没有NT4盒子所以回不去那么远了。
      • 如果我在 for 循环中使用 goto 怎么办,我如何返回循环而不是去 :end ?对于 /L %%i IN (1,1,45) 调用 :docopy %%i goto end
      【解决方案4】:

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

          @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
      

      【讨论】:

        【解决方案5】:

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

        echo file missing
        

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

        在调试时,保持回显是有帮助的。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-08-31
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多