PDA

Показать полную графическую версию : [решено] Bat-ик который постоянно проверяет запущен ли процесс и выполняет действия


Bastel
15-01-2017, 19:11
Всем привет. Есть у меня 2-а процесса(файла):

1) D:\Games\League of Legends\LeagueClient.exe
2) D:\Games\League of Legends\RADS\solutions\lol_game_client_sln\releases\0.0.1.158\deploy\League of Legends.exe

Задачи:
1) Мне нужно что бы была постоянная проверка(1-2 секунды).
2) Если запущен процесс 2, то закрыть процесс 1.
3)1 запущен 2 не запущен - нечего не делать; 2 запущен 1 не запущен - нечего не делать; 1 не запущен 2 не запущен - запустить 1

Один человек на другом форуме помог мне придти к такому коду:

@echo off
set "p1=D:\Games\League of Legends\LeagueClient.exe"
set "p2=League of Legends.exe"
call :parse "%p1%" exe1 p1

:loop
set /a is_p1=0,is_p2=0
:: мне нужно что бы была постоянная проверка(1-2 секунды)

>nul timeout /t 2 /nobreak
for /f "tokens=1-2 delims=. " %%a in ('tasklist /fo table /nh /fi "imagename eq %p1%"') do if /i "%%a.%%b" equ "%p1%" set /a is_p1+=1
for /f "tokens=1-3 delims=. " %%a in ('tasklist /fo table /nh /fi "imagename eq %p2%"') do if /i "%%a %%b.%%c" equ "%p2%" set /a is_p2+=1

:: Если запущен процесс 2, то закрыть процесс 1

if %is_p2% equ 1 >nul taskkill /im "%exe1" /f /t

:: Если не запущены процессы 1 или 2, то запустить процесс 1

if %is_p2% equ 0 (if %is_p1% equ 0 2>nul start "" "%exe1%")
goto:loop
____________________________________________________________________

:parse
setlocal
set "t=%~1"
set "t="%t:\=" "%""
for %%v in (%t%) do set "t=%%~v"
endlocal & set "%2=%~1" & set "%3=%t%" exit /b 0

Bastel
16-01-2017, 22:36
Вот если кому нужен, помогли на другом форуме...
@echo off
:: %p1% %p2% полный путь и имя процесса!!!

set "p1=D:\Games\League of Legends\LeagueClient.exe"
set "p2=League of Legends.exe"

call :parse "%p1%" exe1 p1

:: здесь:
:: %exe1% - полный путь и имя процесса 1,
:: т.е.= D:\Games\League of Legends\LeagueClient.exe
:: %p1% - ТОЛЬКО имя процесса 1,
:: т.е. = LeagueClient.exe
:loop
set /a is_p1=0,is_p2=0

:: мне нужно что бы была постоянная проверка(1-2 секунды)

>nul timeout /t 2 /nobreak
for /f "tokens=1 delims=." %%a in ('tasklist /fo table /nh /fi "imagename eq %p1%"') do if /i "%%a.exe" equ "%p1%" set /a is_p1+=1
for /f "tokens=1 delims=." %%a in ('tasklist /fo table /nh /fi "imagename eq %p2%"') do if /i "%%a.exe" equ "%p2%" set /a is_p2+=1

:: Если запущен процесс 2, то через 5 секунд закрыть процесс 1.

if %is_p2% equ 1 (
>nul timeout /t 5 /nobreak
>nul 2>nul taskkill /im "%p1%" /f /t
)

:: изменённая постановка задачи
:: 1 запущен 2 не запущен - нечего не делать
:: 2 запущен 1 не запущен - нечего не делать
:: 1 не запущен 2 не запущен - запустить 1
::
:: получается такая таблица истинности,
:: !!для одного состояния действие НЕ специфицировано
:: в постановке задачи
:: +-----------+-----------+---------------------+
:: | процесс 1 | процесс 2 | действие |
:: +-----------+-----------+---------------------+
:: | 0 | 0 | запустить процесс 1 |
:: +-----------+-----------+---------------------+
:: | 0 | 1 | ничего не делать |
:: +-----------+-----------+---------------------+
:: | 1 | 0 | ничего не делать |
:: +-----------+-----------+---------------------+
:: | 1 | 1 | ??? |
:: +-----------+-----------+---------------------+

if %is_p2% equ 0 (if %is_p1% equ 0 >nul 2>nul start "" "%exe1%")
goto:loop
____________________________________________________________________

:parse
setlocal
set "t=%~1"
set "t="%t:\=" "%""
for %%v in (%t%) do set "t=%%~v"
endlocal & set "%2=%~1" & set "%3=%t%" exit /b 0




© OSzone.net 2001-2012