Hug*_*ing 90 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
Run Code Online (Sandbox Code Playgroud)
奇怪的是,当我运行批处理文件时,"GP管理器已启动"或"GP管理器已关闭"都不会被打印.
Cod*_*ray 129
您确实可以创建一个语句块以在条件之后执行.但是你的语法错了.括号必须完全按照所示使用:
if <statement> (
do something
) else (
do something else
)
Run Code Online (Sandbox Code Playgroud)
但是,我不认为else-if语句有任何内置语法.遗憾的是,您需要创建嵌套的if语句块来处理它.
其次,该%GPMANAGER_FOUND% == true测试对我来说看起来很可疑.我不知道环境变量的设置或设置方式,但我非常怀疑你展示的代码会产生你想要的结果.
以下示例代码适用于我:
@echo off
if ERRORLEVEL == 0 (
echo GP Manager is up
goto Continue7
)
echo GP Manager is down
:Continue7
Run Code Online (Sandbox Code Playgroud)
请注意我的示例代码的一些具体细节:
@echo off为不要在执行时看到打印到控制台的所有语句,而只是看到那些专门开头的语句的输出echo.ERRORLEVEL变量作为测试.在这里阅读更多小智 13
从逻辑上讲,Cody的答案应该有效.但是我不认为命令提示符在逻辑上处理代码块.对于我的生活,我不能用块内的任何一个命令来正常工作.在我的例子中,广泛的测试显示块中的所有命令都被缓存,并在块结束时同时执行.这当然不会产生预期的结果.这是一个简单的例子:
if %ERRORLEVEL%==0 (
set var1=blue
set var2=cheese
set var3=%var1%_%var2%
)
Run Code Online (Sandbox Code Playgroud)
这应该为var3提供以下值:
blue_cheese
Run Code Online (Sandbox Code Playgroud)
而是产量:
_
Run Code Online (Sandbox Code Playgroud)
因为在退出代码块时所有3个命令都被缓存并同时执行.
我能够通过重写if块来执行一个命令 - goto - 并添加一些标签来克服这个问题.它很笨重,我不太喜欢它,但至少它是有效的.
if %ERRORLEVEL%==0 goto :error0
goto :endif
:error0
set var1=blue
set var2=cheese
set var3=%var1%_%var2%
:endif
Run Code Online (Sandbox Code Playgroud)
小智 5
尝试使用与号 & 或双与号 &&(以错误级别 0 为条件)作为命令分隔符,而不是出现这种 goto 混乱。
我用这个技巧修复了一个脚本片段,总而言之,我有三个批处理文件,一个在找到外部备份驱动器已分配的字母后调用另外两个文件。我将第一个文件保留在主外部驱动器上,因此对其备份例程的调用工作正常,但对第二个文件的调用需要主动更改驱动器。下面的代码显示了我如何修复它:
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"
)
Run Code Online (Sandbox Code Playgroud)