CMD/BAT - [решено] Bat-ик который постоянно проверяет запущен ли процесс и выполняет действия

Ответить
Аватара пользователя
Bastel

CMD/BAT - [решено] Bat-ик который постоянно проверяет запущен ли процесс и выполняет действия

Сообщение Bastel »

Всем привет. Есть у меня 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



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





PHP код:

Код: Выделить всё

@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

Re: CMD/BAT - [решено] Bat-ик который постоянно проверяет запущен ли процесс и выполняет действия

Сообщение Bastel »

Вот если кому нужен, помогли на другом форуме...



PHP код:

Код: Выделить всё

@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:GamesLeague of LegendsLeagueClient.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 



Ответить

Вернуться в «Скриптовые языки администрирования Windows»