2015-02-17 2 views
0

Я написал командный файл, который проверяет, работает ли только один экземпляр сервера в любой момент времени. Сервер находится в общей папке в облаке, где у нескольких пользователей есть доступ к ней.Петля в партии не работает

Если сервер запущен, будет создан .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
@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. После этого петля будет постоянно находить errorlevel 0, если в первом случае она была установлена ​​в 0. Перемещение его в указанное место выполнило бы tasklist/find с задержкой в ​​60 секунд до тех пор, пока errorlevel не станет ненулевым, если будет принят путь, не связанный с ходом для завершения процедуры.

(не проверено, конечно ...)

+0

Большое спасибо, он работал как шарм. Помещение списка задач за пределы цикла было ужасной ошибкой, не могу поверить, что я пропустил это. Что касается меток и блоков, я не знал этого. –

Смежные вопросы