批处理 While 循环

Batch While loop

我正在尝试创建一个 While(server not reachable) 循环。批处理文件里没有while,但是用goto就可以了。所以我有一些代码正在检查服务器是否可以访问,如果不能访问,它将在 5 秒后重试。如果可以访问,它将重新启动服务器。

这是我尝试过的:

:loop
for /f "delims=" %a in ('curl -s -o /dev/null -w "%{http_code}" http://localhost:8080/project/html5/') do @set status=%a
if %status% == 404 (
    echo Server not reachable... trying again...
    timeout /T 5 /nobreak
    goto loop
) else (
    if %status% == 000 ( 
        echo Server offline... trying again...
        timeout /T 5 /nobreak
        goto loop
        echo GOTO NOT WORKING!
    ) else (
        echo Server reachable! SUCCESS!
    )
)

它总是打印 "GOTO NOT WORKING!" 但这怎么可能呢?我也试过 "goto :loop",但它也不起作用...

之后我尝试了一个简单的无限循环:

:loop
echo TEST
GOTO loop

这是有效的...为什么?!没有 If 表达式也一样...

也许试试:

:loop
for /f "delims=" %%a in ('curl -s -o /dev/null -w "%{http_code}" http://localhost:8080/project/html5/') do @set status=%%a
if not defined status echo Error, Check your Program && Pause>Nul
if %status% == 404 (
    echo Server not reachable... trying again...
    timeout /T 5 /nobreak
    goto loop
) else (
    if %status% == 000 ( 
        echo Server offline... trying again...
        timeout /T 5 /nobreak
        goto loop
        echo GOTO NOT WORKING!
    ) else (
        echo Server reachable! SUCCESS!
    )
)

我不知道你的 for 循环是否有问题,但没有它和一个空白变量它会工作。

:loop    
    for /f "delims=" %%a in ('
        curl -s -o nul -w "%%{http_code}"  http://localhost:8080/project/html5/
    ') do set "status=%%a"

    if "%status%"=="404" (
        echo Server not reachable... trying again...
    ) else if "%status%"=="000" (
        echo Server offline... trying again...
    ) else (
        echo Server reachable! SUCCESS!
        goto :continue
    )

    timeout /t 5 /nobreak
    goto :loop

:continue 

所做的更改:

  • 在批处理文件中,for 可替换参数需要双百分号,%a 用于命令行,%%a 在批处理文件中。
  • 在windows中写入nul设备/dev/nul没有用,只是nul
  • 在批处理文件中,与变量无关的百分号需要转义,加倍。必须为 `-w "%%{http_code}"
  • 以防万一 status 未定义,最好引用 if 条件中的值,或执行先前的检查 (if not defined status ...)