我可以在DOS批处理文件中有一个IF块吗?

时间:2011-02-13 09:51:45

标签: if-statement batch-file

在DOS批处理文件中,如果语句体只能有1行?我想我找到了一个地方,我可以使用()作为if块,就像C语言编程语言中使用的{}一样,但是当我尝试这个时它不会执行语句。也没有错误消息。这是我的代码:

if %GPMANAGER_FOUND%==true(echo GP Manager is up
goto Continue7
)
echo GP Manager is down
:Continue7

奇怪的是,当我运行批处理文件时,“GP管理器已启动”或“GP管理器已关闭”都无法打印。

5 个答案:

答案 0 :(得分:125)

您确实可以创建一个语句块,以便在条件之后执行。但你的语法错了。括号必须完全按照所示使用:

if <statement> (
    do something
) else (
    do something else
)

但是,我不认为else-if语句有任何内置语法。遗憾的是,您需要创建if语句的嵌套块来处理它。


其次,%GPMANAGER_FOUND% == true测试看起来对我很可疑。我不知道环境变量的设置或设置方式,但我非常怀疑你展示的代码会产生你想要的结果。


以下示例代码适用于我:

@echo off

if ERRORLEVEL == 0 (
    echo GP Manager is up
    goto Continue7
)
echo GP Manager is down
:Continue7

请注意我的示例代码的一些具体细节:

  • 在条件语句的结尾和左括号之间添加的空格。
  • 我设置@echo off以防止在执行时看到打印到控制台的语句的所有,而只是看到那些特别以{{1}开头的输出}。
  • 我正在使用内置的echo变量作为测试。阅读更多here

答案 1 :(得分:13)

逻辑上,Cody的回答应该有效。但是我不认为命令提示符在逻辑上处理代码块。对于我的生活,我不能用块内的任何一个命令来正常工作。在我的例子中,广泛的测试显示块中的所有命令都被缓存,并在块结束时同时执行。这当然不会产生预期的结果。这是一个简单的例子:

if %ERRORLEVEL%==0 (
set var1=blue
set var2=cheese
set var3=%var1%_%var2%
)

为var3提供以下值:

blue_cheese

但相反产生:

_

因为在退出代码块时所有3个命令都被缓存并同时执行。

我能够通过重写if块来执行一个命令 - goto - 并添加一些标签来克服这个问题。它很笨重,我不太喜欢它,但至少它是有效的。

if %ERRORLEVEL%==0 goto :error0
goto :endif

:error0
set var1=blue
set var2=cheese
set var3=%var1%_%var2%

:endif

答案 2 :(得分:3)

尝试使用&符号,而不是这个goto乱七八糟。或双&符号&amp;&amp; (以errorlevel 0为条件)作为命令分隔符。

我用这个技巧修复了一个脚本片段,总结一下,我有三个批处理文件,一个在找到外部备份驱动器已分配的字母后调用另外两个。我将第一个文件保留在主外部驱动器上,因此对其备份例程的调用工作正常,但是对第二个文件的调用需要更改主动驱动器。下面的代码显示了我如何修复它:

for %%b in (d e f g h i j k l m n o p q r s t u v w x y z) DO (
if exist "%%b:\Backup.cmd" %%b: & CALL "%%b:\Backup.cmd"
)

答案 3 :(得分:1)

我在批处理文件中与IF命令相关的搜索返回的结果中遇到了这篇文章,我无法抵制纠正IF块仅限于单个命令的误解的机会。以下是生产Windows NT命令脚本的一部分,该脚本每天在我撰写此回复的计算机上运行。

    if "%COPYTOOL%" equ "R" (
    WWLOGGER.exe "%APPDATA%\WizardWrx\%~n0.LOG" "Using RoboCopy to make a backup of %USERPROFILE%\My Documents\Outlook Files\*"
    %TOOLPATH% %SRCEPATH% %DESTPATH% /copyall %RCLOGSTR% /m /np /r:0 /tee
    C:\BIN\ExitCodeMapper.exe C:\BIN\ExitCodeMapper.INI[Robocopy] %TEMP%\%~n0.TMP %ERRORLEVEL%
) else (
    WWLOGGER.exe "%APPDATA%\WizardWrx\%~n0.LOG" "Using XCopy to make a backup of %USERPROFILE%\My Documents\Outlook Files\*"
    call %TOOLPATH%  "%USERPROFILE%\My Documents\Outlook Files\*" "%USERPROFILE%\My Documents\Outlook Files\_backups" /f /m /v /y
    C:\BIN\ExitCodeMapper.exe C:\BIN\ExitCodeMapper.INI[Xcopy] %TEMP%\%~n0.TMP %ERRORLEVEL%
)

两行或更多行的块可能仅适用于Windows NT命令脚本(.CMD文件),因为搜索仅限于旧学校批处理(.BAT)文件的应用程序的生产脚本目录,只显示一个 - 命令块。由于应用程序已进入扩展维护(意味着我没有积极参与支持),我不能说这是因为我不需要多行,或者我不能&#39 ;让他们工作。

无论如何,如果后者是真的,有一个简单的解决方法;将多行移动到单独的批处理文件或批处理文件子例程中。我知道后者适用于两种脚本。

答案 4 :(得分:0)

也许有点晚了,但希望它有所帮助:

@echo off 

if %ERRORLEVEL% == 0 (
msg * 1st line WORKS FINE rem You can relpace msg * with any othe operation...
goto Continue1
)
:Continue1
If exist "C:\Python31" (
msg * 2nd line WORKS FINE rem You can relpace msg * with any othe operation...
    goto Continue2
)
:Continue2
If exist "C:\Python31\Lib\site-packages\PyQt4" (  
msg * 3th line WORKS FINE rem You can relpace msg * with any othe operation...
    goto Continue3
)
:Continue3
msg * 4th line WORKS FINE rem You can relpace msg * with any othe operation...
    goto Continue4
)
:Continue4
msg * "Tutto a posto" rem You can relpace msg * with any othe operation...
pause