【发布时间】:2018-08-06 14:04:15
【问题描述】:
我正在运行一个检查服务器状态的批处理脚本,如果它启动,它会继续并重新启动另一台服务器。
我在那里放了一些 PAUSE 命令,因为我想看看它在哪里倒塌。似乎是第一次 ping,然后在 IF 语句上失败:
命令的语法不正确。
谁能告诉我哪里出错了?
@echo off
setlocal enableextensions enabledelayedexpansion
set ipaddr=10.2.17.24
:loop
set state=down
for /f "tokens=5,7" %%a in ('ping -n 1 !ipaddr!') do (
if "x%%a"=="xReceived" if "x%%b"=="x1," set state=up
)
echo.Link is !state!
ping -n 6 10.2.17.24 >nul: 2>nul:
PAUSE
IF "%state%" == "down"
GOTO:loop
else
(
echo.DB server back up
PAUSE
echo.Continuing to web server reboot
PAUSE
set Webipaddr=10.2.17.36
PAUSE
:loop
set Webstate=down
for /f "tokens=5,7" %%a in ('ping -n 1 !Webipaddr!') do (
if "x%%a"=="xReceived" if "x%%b"=="x1," set Webstate=up
)
echo.Link is !Webstate!
ping -n 6 10.2.17.36 >nul: 2>nul:
PAUSE
IF "%Webstate%" == "down"
GOTO:loop
else
echo "Both servers back up."
endlocal
【问题讨论】:
-
您不要在
NUL中使用冒号。您的IF ELSE语法不正确。打开 cmd 提示符并输入:IF /?帮助文件清楚地说明了使用IF ELSE的语法。 -
我看不到启用延迟扩展的具体原因。
-
if "x%%a"=="xReceived"中不需要x(空变量已被引号充分处理) -
命令 GOTO 和它的参数
loop或:loop之间也应该有一个空格,因此冒号不是必需的。GOTO:loop也可以,但这只是因为cmd.exe在解析命令行时自动纠错。在命令提示符窗口中运行goto /?以获取有关此命令的帮助,同时显示使用它的推荐语法。 -
Windows 命令处理器也不喜欢在以
(开头并以匹配)结尾的命令块中的:loop之类的标签。整个命令块在执行IF 命令之前被解析并且类似于子程序的处理。因此,标签在命令块中是有问题的。根本不需要 ELSE 命令块。IF "%state%" == "down" GOTO loop并删除else和(在这里绝对足够了,尤其是因为在发布的代码中缺少)以完成 ELSE 命令块。
标签: windows batch-file cmd