【问题标题】:Why does Windows batch file processing exit on IF condition because of a syntax error?为什么由于语法错误,Windows 批处理文件处理在 IF 条件下退出?
【发布时间】: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


【解决方案1】:

if 语句中,如果要编写带有换行符的命令,则需要使用括号,如下所示:

IF 1==1 (
  FOO
) ELSE (
  BAR
)

所以我们需要:

  • 将括号添加到第一个 IF(ELSE 之前)
  • 关闭第一个 IF 的 ELSE(您似乎缺少一个 ')')
  • 最后一个 IF 必须固定为这种形式:IF 1==1 (FOO) ELSE (BAR)

代码,已修复:

@setlocal enableextensions enabledelayedexpansion
@echo off
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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-28
    • 2021-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-12
    相关资源
    最近更新 更多