我可以在DOSbatch file中有一个IF块吗?

在DOSbatch file中,我们只能有1行,如果语句正文? 我想我find了一个可以像if语句一样使用() ,但是当我尝试这个时,它不会执行语句。 没有错误信息。 这我的代码:

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

当我运行batch file时,奇怪的是既没有“GP Manager is up”,也没有“GP Manager down”的打印。

你确实可以在条件之后创build一个语句块来执行。 但是你的语法错了。 必须正确地使用括号,如下所示:

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

但是,我不相信else-if语句有任何内置的语法。 您将不幸需要创buildif语句的嵌套块来处理。

其次,这%GPMANAGER_FOUND% == truetesting看起来%GPMANAGER_FOUND% == true怀疑我。 我不知道环境variables设置为什么,或者你如何设置它,但是我非常怀疑你所显示的代码会产生你正在寻找的结果。

以下示例代码适合我:

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

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

  • 条件语句的结尾和左括号之间添加的空格。
  • 我将@echo off设置为@echo off ,以便在执行时不会看到打印到控制台的所有语句,而只是查看那些专门以echo开头的输出。
  • 我正在使用内置的ERRORLEVELvariables作为testing。 在这里阅读更多

从逻辑上讲,科迪的答案应该起作用。 不过,我不认为命令提示符逻辑上处理代码块。 对于我的生活,我不能使用块内的任何一个命令来正确工作。 在我的情况下,广泛的testing显示块内的所有命令都被caching,并在块的末尾同时执行。 这当然不会产生预期的结果。 这是一个简单的例子:

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

应该为var3提供以下值:

 blue_cheese 

而是产生:

 _ 

因为所有3个命令在退出代码块时被同时caching和执行。

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

 if %ERRORLEVEL%==0 goto :error0 goto :endif :error0 set var1=blue set var2=cheese set var3=%var1%_%var2% :endif 

也许有点晚,但希望它:

 @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 

我在batch file中search与IF命令有关的search结果时碰到了这篇文章,我忍不住有机会纠正IF块仅限于单个命令的误解。 以下是生成Windows NT命令脚本的一部分,该脚本每天在构build此答复的计算机上运行。

  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文件),因为search限于旧式批处理(.BAT)文件的应用程序的生产脚本目录,只显示一个命令块。 由于申请已经进行了长时间的维修(意思是我没有积极参与支持),所以我不能说这是否是因为我不需要多于一条线路,或者我不能使它们工作。

不pipe,如果后者是真的,有一个简单的解决方法, 将多行移入单独的batch file或batch file子例程。 我知道后者在两种脚本中都有效。

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

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

(defghijklmnopqrstuvwx yz)DO(如果存在“%% b:\ Backup.cmd”%% b:&CALL“%% b:\ Backup.cmd”)%% b