Войти

Показать полную графическую версию : Запуск process2 если process1 уже запущен и остановка.


qo_op
14-11-2019, 13:41
Товарищи, помогите пожалуйста, не могу решить задачу.

В чем заключается задача:

ClientStarter.exe - Программа за которой нужно следить.
start.exe - Программа запускает с параметрами "ffmpeg.exe"
ffmpeg.exe - процесс который, должен работать параллельно ClientStarter4.exe

Если работает ClientStarter.exe, нужно запустить файл start.exe (В свою очередь который запустит с параметрами ffmpeg.exe)
Если не работает ClientStarter.exe убить процесс start.exe и ffmpeg.exe

--------------------------------------------------------------------
Пробовал такой .bat, но проблема в том что у меня получаются дубли.
Я думал сделать 2 таких .bat, чтобы они друг другу помогали, но это слишком сложно.
@echo off
SETLOCAL EnableExtensions
set EXE=ClientStarter.exe
FOR /F %%x IN ('tasklist /NH /FI "IMAGENAME eq %EXE%"') DO IF %%x == %EXE% goto FOUND
start "D:\not-running\stop.exe"
goto FIN
:FOUND
start "D:\running\start.exe"
:FIN
pause

Может, другие варианты есть у вас, буду рад видеть их, абсолютно любые.
Даже если это vbs, ps1 или любой другой скрипт.
Спасибо за ранее всем.

DJ Mogarych
14-11-2019, 14:27
Powershell, что-то вроде того:

if ((Get-Process one.exe -ErrorAction SilentlyContinue) -and !(Get-Process two.exe -ErrorAction SilentlyContinue)) {Start-Process two.exe}
else {Stop-Process two.exe}

megaloman
14-11-2019, 16:26
qo_op, Если ONE.exe запущен »
(Грубо говоря, если работает ONE.exe то вместе с ним должен работать Two.exe Three.exe) »Если они уже работают, что делать? Убить и запускать процесс TWO.exe (Он запускает в свою очередь процесс Three.exe с параметрами и управляет им в течении его работы) » или ничего не делать?

qo_op
14-11-2019, 16:31
megaloman, Изменил тему, добавил информацию

megaloman
14-11-2019, 21:55
Exe1 = "winamp.exe"
Exe2 = "Notepad.exe"
Exe3 = "Calc.exe"

Path1 = "C:\Program Files\Winamp"
Path2 = "C:\Windows\System32"

Set WMI = GetObject("winMgmts:")

nExe1 = CountProc(WMI, Exe1, Proc1)
nExe2 = CountProc(WMI, Exe2, Proc2)
nExe3 = CountProc(WMI, Exe3, Proc3)

If Not (nExe1 = 1 And nExe2 = 1 And nExe3 = 1) Then
Call Killer(Proc2, nExe2)
Call Killer(Proc3, nExe3)

With CreateObject("WScript.Shell")
If nExe1 <> 1 Then
Call Killer(Proc1, nExe1)
.Exec Path1 + "\" + Exe1
WScript.Sleep 5000
End If
.Exec Path2 + "\" + Exe2
End With
End If
' ==================================

Function CountProc(WMI, Exe, Processes)
On Error Resume Next
Err.Number = 0

Set Processes = WMI.ExecQuery("SELECT * FROM Win32_Process Where Name=""" + Exe + """")
If Err.Number = 0 Then
CountProc = Processes.Count
Else
CountProc = -1
End If
On Error GoTo 0
End Function

Sub Killer(Processes, N)
If N < 1 Then Exit Sub
For Each Process In Processes
Process.Terminate
Next
End Sub
Файлы и пути пропишИте свои

zbeypepels
15-11-2019, 20:05
@echo off
SETLOCAL EnableExtensions
cd /d "%~dp0"
chcp 866 >nul

set "cs=ClientStarter.exe"
set "strt=D:\running\start.exe"

tasklist | findstr /i "%cs%" && set proc=exist||set proc=no >nul

if /i "%proc%"=="exist" ( start "" "%strt%" ) else ( goto :killPrc)
exit

:killPrc
rem убить start.exe и ffmpeg.exe
TASKKILL /IM start.exe
TASKKILL /IM ffmpeg.exe
pause
exit




© OSzone.net 2001-2012