Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Остановка программы (http://forum.oszone.net/showthread.php?t=328802)

idenchik1488@vk 02-08-2017 11:46 2755699

Остановка программы
 
Нужно что-бы при появлении определённого процесса программа останавливалась, а если процесс пропадёт-запускалась

Iska 02-08-2017 12:09 2755704

Цитата:

Цитата idenchik1488@vk
определённого процесса »

Имя процесса?

Цитата:

Цитата idenchik1488@vk
программа »

Имя программы?

Цитата:

Цитата idenchik1488@vk
останавливалась »

Завершалась?

idenchik1488@vk 02-08-2017 13:48 2755721

Цитата:

Цитата Iska
Имя процесса? »

process.exe
Цитата:

Цитата Iska
Имя программы? »

taskmgr.exe
Цитата:

Цитата Iska
Завершалась? »

Да

Iska 02-08-2017 14:35 2755733

Процесс:
Цитата:

Цитата idenchik1488@vk
process.exe »

— может быть запущен более чем в одном экземпляре?

idenchik1488@vk 02-08-2017 14:49 2755739

Цитата:

Цитата Iska
— может быть запущен более чем в одном экземпляре? »

Нет, только в 1

alpap 03-08-2017 11:01 2755955

вот отдельно
Код:

@echo off
set "p=calc.exe"
:: Появился процесс - прибить его (или не его) и закрытся
cmd/c for /l %%i in () do @tasklist /fi "imagename eq %p%"^|findstr/v :^&^& (taskkill /f /im "%p%"^& exit/b)^&^>nul timeout /t 1 /nobreak
:: Пропал процесс - выполнить команду и закрытся
cmd/c for /l %%i in () do @tasklist /fi "imagename eq %p%"^|findstr/v :^|^| (echo Команда^& exit/b)^&^>nul ping -n 2 127.0.0.1


Iska 04-08-2017 12:58 2756269

idenchik1488@vk, с учётом изложенного Вами примерно так (WSH, VBScript):
Скрытый текст
Код:

Option Explicit

Dim strProcess4Waiting
Dim strProcess4Running


Dim objSWbemServicesEx
Dim objSWbemObjectEx

Dim lngProcessID


strProcess4Waiting = "calc.exe"
strProcess4Running = "taskmgr.exe"

Set objSWbemServicesEx = WScript.CreateObject("WbemScripting.SWbemLocator").ConnectServer(".", "root\cimv2")

Do
        With objSWbemServicesEx.ExecNotificationQuery("SELECT * FROM __InstanceCreationEvent WITHIN 1 WHERE TargetInstance ISA 'Win32_Process' AND TargetInstance.Name = '" & strProcess4Waiting & "'")
                With .NextEvent.TargetInstance
                        WScript.Echo "Detect starting process [" & .Name & "], PID: [" & .ProcessID & "]."
                       
                        For Each objSWbemObjectEx In objSWbemServicesEx.ExecQuery("SELECT * FROM Win32_Process WHERE Name = '" & strProcess4Running & "'")
                                If objSWbemObjectEx.Terminate() = 0 Then
                                        WScript.Echo "Process [" & objSWbemObjectEx.Name & "], PID: [" & objSWbemObjectEx.ProcessID & "] terminated successfully."
                                Else
                                        WScript.Echo "Process [" & objSWbemObjectEx.Name & "], PID: [" & objSWbemObjectEx.ProcessID & "] terminate failure."
                                End If
                        Next
                       
                        With objSWbemServicesEx.ExecNotificationQuery("SELECT * FROM __InstanceDeletionEvent WITHIN 1 WHERE TargetInstance ISA 'Win32_Process' AND TargetInstance.Handle = '" & .ProcessID & "'")
                                With .NextEvent.TargetInstance
                                        WScript.Echo "Detect finishing process [" & .Name & "], PID: [" & .ProcessID & "]."
                                       
                                        If objSWbemServicesEx.Get("Win32_Process").Create(strProcess4Running, Null, Null, lngProcessID) = 0 Then
                                                WScript.Echo "Process [" & strProcess4Running & "], PID: [" & lngProcessID & "] started successfully."
                                        Else
                                                WScript.Echo "Process [" & strProcess4Running & "] start failure."
                                        End If
                                End With
                        End With
                End With
        End With
Loop

Set objSWbemServicesEx = Nothing

WScript.Quit 0


В роли «process.exe» в примере выступает Калькулятор. Запускать скрипт посредством cscript.exe.

Raymans 24-10-2017 19:07 2773112

мне этот скрипт очен понравился но можно ли поменять путь C:\Windows\System32\calc.exe на другое например C:\Windows\calc.exe и как это сделать ?

Iska 24-10-2017 20:52 2773132

Raymans, где Вы собираетесь «поменять путь», если последний нигде в скрипте не используется?

Raymans 28-10-2017 10:01 2773924

не совсем понял тоесть поменять путь не возможно что ли?

Iska 28-10-2017 11:01 2773931

Цитата:

Цитата Raymans
не совсем понял »

Вы пишете:
Цитата:

Цитата Raymans
можно ли поменять путь C:\Windows\System32\calc.exe на другое »

В коде вообще не используется путь. Как Вы собираетесь менять то, чего нет?! Поясните.

Raymans 28-10-2017 14:07 2773974

ааа вот теперь понятно .просто если я по этому пути писаю программу например C:\Windows\System32\Progexe у меня всё работает а в другом например рабочий стол нет я подумал что прописан путь к C:\Windows\System32 .а вообще можно ли укать путь C:\Windows или ещё какой ?сама идея понравилась .

Iska 28-10-2017 14:17 2773975

[Iska аккуратно бьётся головой апстену]

Ткните пальцем в код, где Вы хотите указать путь. Я вижу лишь одно место — метод «.Create()» (не проверялось):
Скрытый текст
Код:

Option Explicit

Dim strProcess4Waiting
Dim strProcess4Running
Dim strPath2Process4Running

Dim objSWbemServicesEx
Dim objSWbemObjectEx

Dim lngProcessID


strProcess4Waiting = "calc.exe"
strProcess4Running = "taskmgr.exe"
strPath2Process4Running = "c:\Мой любимый путь"

Set objSWbemServicesEx = WScript.CreateObject("WbemScripting.SWbemLocator").ConnectServer(".", "root\cimv2")

Do
        With objSWbemServicesEx.ExecNotificationQuery("SELECT * FROM __InstanceCreationEvent WITHIN 1 WHERE TargetInstance ISA 'Win32_Process' AND TargetInstance.Name = '" & strProcess4Waiting & "'")
                With .NextEvent.TargetInstance
                        WScript.Echo "Detect starting process [" & .Name & "], PID: [" & .ProcessID & "]."
                       
                        For Each objSWbemObjectEx In objSWbemServicesEx.ExecQuery("SELECT * FROM Win32_Process WHERE Name = '" & strProcess4Running & "'")
                                If objSWbemObjectEx.Terminate() = 0 Then
                                        WScript.Echo "Process [" & objSWbemObjectEx.Name & "], PID: [" & objSWbemObjectEx.ProcessID & "] terminated successfully."
                                Else
                                        WScript.Echo "Process [" & objSWbemObjectEx.Name & "], PID: [" & objSWbemObjectEx.ProcessID & "] terminate failure."
                                End If
                        Next
                       
                        With objSWbemServicesEx.ExecNotificationQuery("SELECT * FROM __InstanceDeletionEvent WITHIN 1 WHERE TargetInstance ISA 'Win32_Process' AND TargetInstance.Handle = '" & .ProcessID & "'")
                                With .NextEvent.TargetInstance
                                        WScript.Echo "Detect finishing process [" & .Name & "], PID: [" & .ProcessID & "]."
                                       
                                        If objSWbemServicesEx.Get("Win32_Process").Create(strPath2Process4Running & "\" & strProcess4Running, strPath2Process4Running, Null, lngProcessID) = 0 Then
                                                WScript.Echo "Process [" & strProcess4Running & "], PID: [" & lngProcessID & "] started successfully."
                                        Else
                                                WScript.Echo "Process [" & strProcess4Running & "] start failure."
                                        End If
                                End With
                        End With
                End With
        End With
Loop

Set objSWbemServicesEx = Nothing

WScript.Quit 0


Raymans 28-10-2017 15:07 2773981

ух ты круто ;) спасибо тебе милый человек дай бог тебе здоровья !


Время: 06:51.

Время: 06:51.
© OSzone.net 2001-