Сворганил для себя костыль, и он работает. Это еще не окончательный вариант, каждый может подкрутить под себя.
Пинцип работы:
- проверяет, запущена ли зенка или нет
- если не запущена, запускает
- если запущена - проверяет сколько забито памяти
- если превышен предел - убивает процесс
- ждет 30 секунд (тут есть лаги)
- запускает версию зенки указанную в FORCE_VERSION
добавляете в планировщик, выполнение раз в 10 минут
@echo off
setlocal enabledelayedexpansion
chcp 1251 > nul
rem Фиксированный путь к ZennoPoster
set "ZP_BASE=C:\Program Files\ZennoLab\RU\ZennoPoster Pro V7"
rem Порог использования памяти в процентах
set "MEMORY_THRESHOLD=83"
rem Указать конкретную версию для запуска (например: 7.8.6.0) или оставить пустым для последней версии
set "FORCE_VERSION=7.8.6.0"
rem Путь к лог-файлу
set "LOG_FILE=%~dp0zennoposter_log.txt"
rem Запись в лог о начале работы
call :log "=========================================="
call :log "Запуск скрипта start_zennoposter.bat"
call :log "=========================================="
rem Проверяем, запущен ли уже ZennoPoster
call :log "Проверка запущен ли процесс ZennoPoster.exe..."
tasklist | find /i "ZennoPoster.exe" > nul
if errorlevel 1 (
call :log "Процесс ZennoPoster.exe не обнаружен"
echo ZennoPoster не запущен. Запускаем...
call :start_zennoposter
echo.
echo ZennoPoster успешно запущен!
call :log "ZennoPoster успешно запущен"
goto :end_script
)
rem ZennoPoster запущен - проверяем память
call :log "Процесс ZennoPoster.exe запущен"
echo ZennoPoster уже запущен.
echo.
echo Проверка текущего состояния памяти...
call :log "Начало проверки использования памяти..."
call :check_memory
if !errorlevel! equ 1 (
call :log "ВНИМАНИЕ! Использование памяти превысило порог !MEMORY_THRESHOLD!%%"
echo.
echo ВНИМАНИЕ! Использование памяти превысило порог !MEMORY_THRESHOLD!%%
echo Выполняется перезапуск ZennoPoster...
echo.
rem Завершаем процесс
echo Завершение процесса ZennoPoster...
call :log "Завершение процесса ZennoPoster.exe..."
taskkill /F /IM "ZennoPoster.exe" > nul 2>&1
call :log "Процесс ZennoPoster.exe завершён"
rem Ждем 30 секунд
echo Ожидание 30 секунд перед перезапуском...
call :log "Ожидание 30 секунд перед перезапуском..."
ping 127.0.0.1 -n 31 > nul
call :log "Ожидание завершено"
rem Запускаем снова
echo.
echo Перезапуск ZennoPoster...
call :log "Начало перезапуска ZennoPoster..."
call :start_zennoposter
echo.
echo Перезапуск завершён!
call :log "Перезапуск ZennoPoster завершён успешно"
) else (
call :log "Использование памяти в норме (не превышает порог !MEMORY_THRESHOLD!%%)"
echo.
echo Память в норме.
)
goto :end_script
rem ============================================
rem Функция запуска ZennoPoster
rem ============================================
:start_zennoposter
call :log "Функция :start_zennoposter - начало выполнения"
echo Проверка пути: "!ZP_BASE!"
call :log "Проверка базового пути: !ZP_BASE!"
if not exist "!ZP_BASE!" (
call :log "ОШИБКА: Путь не найден: !ZP_BASE!"
echo Путь не найден: "!ZP_BASE!"
goto :eof
)
call :log "Базовый путь существует"
rem Если указана конкретная версия
if defined FORCE_VERSION (
call :log "Используется принудительная версия: !FORCE_VERSION!"
set "zp_path=!ZP_BASE!\!FORCE_VERSION!\Progs\ZennoPoster.exe"
if exist "!zp_path!" (
call :log "Файл найден: !zp_path!"
echo Использование указанной версии: !FORCE_VERSION!
echo Запуск: "!zp_path!"
call :log "Запуск ZennoPoster версии !FORCE_VERSION!"
start "" "!zp_path!"
call :log "Команда запуска выполнена успешно"
goto :eof
) else (
call :log "ОШИБКА: Указанная версия !FORCE_VERSION! не найдена по пути: !zp_path!"
echo ОШИБКА: Указанная версия !FORCE_VERSION! не найдена!
echo Путь не существует: "!zp_path!"
goto :eof
)
)
rem Если версия не указана - ищем последнюю
call :log "Версия не указана, выполняется поиск последней версии"
echo Сканирование версий в папке: "!ZP_BASE!"
rem Временный файл для сохранения путей версий
set "temp_file=%TEMP%\zp_versions.txt"
if exist "!temp_file!" del "!temp_file!"
call :log "Создан временный файл для списка версий: !temp_file!"
rem Собираем все пути к версиям
call :log "Начало сканирования доступных версий..."
for /F "delims=" %%d in ('dir /B /AD "!ZP_BASE!\*.*.*.*" 2^>nul') do (
if exist "!ZP_BASE!\%%d\Progs\ZennoPoster.exe" (
call :log "Найдена версия: %%d"
echo %%d>>"!temp_file!"
)
)
if not exist "!temp_file!" (
call :log "ОШИБКА: Не найдены доступные версии ZennoPoster"
echo Не найдены доступные версии ZennoPoster.
goto :eof
)
rem Находим самую свежую версию
call :log "Начало поиска самой новой версии..."
set "highest_ver=0.0.0.0"
set "zp_path="
for /F "delims=" %%v in (!temp_file!) do (
call :compare_version "%%v" "!highest_ver!"
if !errorlevel! gtr 0 (
set "highest_ver=%%v"
set "zp_path=!ZP_BASE!\%%v\Progs\ZennoPoster.exe"
call :log "Обновлена кандидатская версия: %%v"
)
)
if defined zp_path (
call :log "Определена самая новая версия: !highest_ver!"
call :log "Путь к исполняемому файлу: !zp_path!"
echo Найдена самая новая версия: !highest_ver!
echo Запуск: "!zp_path!"
call :log "Запуск ZennoPoster версии !highest_ver!"
start "" "!zp_path!"
call :log "Команда запуска выполнена успешно"
) else (
call :log "ОШИБКА: Не удалось найти исполняемый файл ZennoPoster"
echo Не удалось найти исполняемый файл ZennoPoster.
)
rem Удаляем временный файл
if exist "!temp_file!" del "!temp_file!"
call :log "Временный файл удалён"
call :log "Функция :start_zennoposter - завершение выполнения"
goto :eof
rem ============================================
rem Функция проверки памяти
rem ============================================
:check_memory
call :log "Функция :check_memory - начало выполнения"
rem Получаем общий объем оперативной памяти и свободную память
call :log "Получение информации об объеме памяти через WMIC..."
for /f "skip=1 tokens=2 delims==" %%a in ('wmic OS get TotalVisibleMemorySize /value') do (
set "total_mem_raw=%%a"
set "total_mem_raw=!total_mem_raw: =!"
if defined total_mem_raw set /a total_mem=!total_mem_raw!
)
for /f "skip=1 tokens=2 delims==" %%a in ('wmic OS get FreePhysicalMemory /value') do (
set "free_mem_raw=%%a"
set "free_mem_raw=!free_mem_raw: =!"
if defined free_mem_raw set /a free_mem=!free_mem_raw!
)
call :log "Получено: total_mem=!total_mem! KB, free_mem=!free_mem! KB"
rem Проверяем корректность полученных данных
if not defined total_mem (
call :log "ОШИБКА: не удалось получить общий объем памяти"
echo Ошибка: не удалось получить общий объем памяти
exit /b 0
)
if not defined free_mem (
call :log "ОШИБКА: не удалось получить объем свободной памяти"
echo Ошибка: не удалось получить объем свободной памяти
exit /b 0
)
if !total_mem! lss 1 (
call :log "ОШИБКА: некорректное значение общей памяти"
echo Ошибка: некорректное значение общей памяти
exit /b 0
)
call :log "Данные корректны, начало расчётов..."
rem Вычисляем использованную память
set /a used_mem=total_mem-free_mem
rem Переводим в МБ для избежания переполнения при вычислении процента
set /a total_mem_mb=total_mem/1024
set /a used_mem_mb=used_mem/1024
call :log "Конвертация в MB: total=!total_mem_mb! MB, used=!used_mem_mb! MB"
rem Вычисляем процент использования памяти
set /a mem_usage=(used_mem_mb*100)/total_mem_mb
call :log "Рассчитан процент использования памяти: !mem_usage!%%"
echo Использование памяти: !mem_usage!%% (используется !used_mem_mb! MB из !total_mem_mb! MB)
call :log "Использование памяти: !mem_usage!%% (используется !used_mem_mb! MB из !total_mem_mb! MB)"
rem Проверяем, превышен ли порог
if !mem_usage! gtr !MEMORY_THRESHOLD! (
call :log "Порог !MEMORY_THRESHOLD!%% ПРЕВЫШЕН (текущее: !mem_usage!%%)"
call :log "Функция :check_memory - возврат кода 1 (превышение порога)"
exit /b 1
) else (
call :log "Порог !MEMORY_THRESHOLD!%% НЕ превышен (текущее: !mem_usage!%%)"
call :log "Функция :check_memory - возврат кода 0 (норма)"
exit /b 0
)
rem ============================================
rem Функция сравнения версий
rem ============================================
:compare_version
setlocal EnableDelayedExpansion
set "ver1=%~1"
set "ver2=%~2"
for /F "tokens=1-4 delims=." %%a in ("!ver1!") do (
set /a v1=%%a, v2=%%b, v3=%%c, v4=%%d
)
for /F "tokens=1-4 delims=." %%a in ("!ver2!") do (
set /a w1=%%a, w2=%%b, w3=%%c, w4=%%d
)
if !v1! gtr !w1! exit /b 1
if !v1! lss !w1! exit /b -1
if !v2! gtr !w2! exit /b 1
if !v2! lss !w2! exit /b -1
if !v3! gtr !w3! exit /b 1
if !v3! lss !w3! exit /b -1
if !v4! gtr !w4! exit /b 1
if !v4! lss !w4! exit /b -1
exit /b 0
:end_script
call :log "Завершение работы скрипта"
call :log "=========================================="
call :log ""
echo.
echo Окно закроется через 5 секунд...
timeout /t 5 /nobreak > nul
endlocal
exit /b
rem ============================================
rem Функция логирования
rem ============================================
:log
setlocal enabledelayedexpansion
set "message=%~1"
rem Получаем текущую дату и время
for /f "tokens=1-4 delims=/ " %%a in ('date /t') do (
set "log_date=%%a.%%b.%%c"
)
for /f "tokens=1-2 delims=: " %%a in ('time /t') do (
set "log_time=%%a:%%b"
)
rem Записываем в лог-файл
echo [%log_date% %log_time%] %message% >> "%LOG_FILE%"
endlocal
goto :eof