循环批处理不起作用

时间:2015-02-17 18:58:58

标签: batch-file batch-processing

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

如果服务器正在运行,将创建.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 
    ) 
)

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

1 个答案:

答案 0 :(得分:1)

@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子句。如果批量exitgoto s则不需要else - 如果goto / exit没有,则批量中的下一个语句将被执行发生了。

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

(当然没有经过测试......)