Поскольку стандартная команда tasklist не изменяет значение переменной ERRORLEVEL, пришлось воспользоваться утилитой pslist из пакета PSTools (скачать пакет, почитать описание, если интересно кому ).
Не обязательно распаковывать весь пакет, достаточно файл PsList.exe достать из архива и поместить в папку с сервером и скриптом (...\FINAL).
rem *****************************************************
rem ** This script every 5 mins checks server's state **
rem ** and restarts server if need. **
rem ** System application error windows will be killed!**
rem *****************************************************
echo off
cls
:srv0
ping 127.0.0.1 -n 300 > nul
ill_all
pslist dwwin
goto dww%errorlevel%
:dww0
taskkill /f /im dwwin.exe
ping 127.0.0.1 -n 2 > nul
goto kill_all
:dww1
pslist newServer
goto srv%errorlevel%
:srv1
echo (%date% %time%) Starting DOA OL Server!
start newServer.exe
goto srv0
Особенности:
1. Частота проверки наличия процесса сервера в памяти уменьшена до раза в 5 минут.
2. Выяснилось, что dwwin.exe (Microsoft Application Error Reporting), создает в Temp два файла вида *.dmp (с дампом памяти) и *_appcompat.txt (с отчетом об ошибке, который он собирается отправить в Microsoft). После корректного завершения своей работы (нажатие на кнопку "Не отправлять" или после их отправки) эти файлы удаляются. Т.к. скрипт прибивает dwwin, эти файлы остаются, так что придется периодически их удалять (проще всего попасть в Temp, набрав %Temp% в командной строке).
3. Скрипт протестирован в Win XP x64 Pro, должен работать и в обычной 32-битной XP (однако есть данные, что в версии Home Edition могут частично отсутствовать файлы утилит командной строки, так что нужно убедиться, что требуемые команды будут выполняться). В Висте и Семерке скорей всего работать не будет (или будет неправильно) - там другой механизм обработки сбоев приложений.
P.S. Метка kill_all внешне попортилась из-за автозамены, там должно быть двоеточие в начале строки.