在DOS批处理文件中,如果语句体只能有1行?我想我找到了一个地方,我可以使用()
作为if块,就像C语言编程语言中使用的{}
一样,但是当我尝试这个时它不会执行语句。也没有错误消息。这是我的代码:
if %GPMANAGER_FOUND%==true(echo GP Manager is up
goto Continue7
)
echo GP Manager is down
:Continue7
奇怪的是,当我运行批处理文件时,“GP管理器已启动”或“GP管理器已关闭”都无法打印。
答案 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