我编写了一个批处理文件,用于检查在任何给定时间是否只有一个服务器实例正在运行。服务器位于云上的共享文件夹中,多个用户可以访问该文件夹。
如果服务器正在运行,将创建.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
)
)
除了循环外,一切都有效。它不断返回")此时出乎意料"。 我是编写批处理文件的新手,所以请帮忙。
答案 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
子句。如果批量exit
或goto
s则不需要else
- 如果goto
/ exit
没有,则批量中的下一个语句将被执行发生了。
请注意,您的标签:loop
位置错误。按照目前的情况,errorlevel
将被建立用于tasklist
的第一次和唯一的调用。此后,如果在第一个实例上将循环设置为0,则循环将永久地找到errorlevel
0。将其移动到指示的位置将执行tasklist/find
,延迟为60秒,直到errorlevel
变为非零,此时将采取终止该过程的非转到路径。
(当然没有经过测试......)