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