批量循环不起作用

Loop in batch not working

我写了一个批处理文件来检查在任何给定时间是否只有一个服务器实例是 运行。服务器位于云上的共享文件夹中,多个用户可以访问它。

如果服务器是 运行,将创建一个 .txt 文件,只要它存在,就没有人可以启动服务器。当服务器关闭时,.txt 文件将被删除,另一个用户可以重新启动它。

minecraft_server.1.8.1.exe启动了一个Java进程javaw.exe,也就是我们需要监控的进程。

代码如下:

@echo off
IF EXIST *_RUNNING.txt (
    echo "ERROR, SERVER ALREADY RUNNING as %computername%"
    pause
    EXIT
) ELSE (
    copy NUL %computername%_RUNNING.txt 
    START /WAIT minecraft_server.1.8.1.exe
    tasklist /FI "IMAGENAME eq javaw.exe" 2>NUL | find /I /N "javaw.exe">NUL
:loop 
    IF "%ERRORLEVEL%"=="0" (
        TIMEOUT /t 60
        GOTO loop
    ) ELSE (
        del %computername%_RUNNING.txt
        echo "Server ended."
        pause
        EXIT 
    ) 
)

除循环外一切正常。它不断返回“)此时出乎意料”。 我是编写批处理文件的新手,所以请帮忙。

@echo off
IF EXIST *_RUNNING.txt (
echo "ERROR, SERVER ALREADY RUNNING as %computername%"
pause
EXIT
) 

copy NUL %computername%_RUNNING.txt 
START /WAIT minecraft_server.1.8.1.exe
:loop 
tasklist /FI "IMAGENAME eq javaw.exe" 2>NUL | find /I /N "javaw.exe">NUL
IF "%ERRORLEVEL%"=="0" (
TIMEOUT /t 60
GOTO loop
) 
del %computername%_RUNNING.txt
echo "Server ended."
pause
EXIT

实际上,您在原始代码块(带括号的语句序列)中有一个标签 :loop。标签终止块。

通过这些修改,删除了不必要的 else 子句。如果批处理 exits 或 gotos 则不需要 else - 如果 goto/exit 不需要,则批处理中的下一个语句将被执行不会发生。

请注意,您的标签 :loop 放错了位置。按照目前的情况,errorlevel 将在第一次也是唯一一次调用 tasklist 时建立。此后,如果在第一个实例中将其设置为 0,则循环将永远找到 errorlevel 0。将其移动到指示的位置将执行 tasklist/find,延迟 60 秒,直到 errorlevel 变为非零,此时将采用非转到路径终止该过程。

(当然没测试过。。。)