Компьютерный форум 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=340269)

Gragl 26-04-2019 08:41 2869230

Батник отслеживающий и убивающий процесс
 
Доброго времени!
Есть программа, которая через некоторое время после старта запускает дополнительный процесс который отнимает время для загрузки в программу всяких ненужностей
Я хотел бы чтоб батник отследил запуск этого ненужного процесса убил бы его и закрыл бы свое окошко.

Я сделал вот такой вариант, но не могу отследить точное время когда запускается процесс, если не успеваю на три секунды убить процесс то он успевает подгрузить в программу ненужные мне вещи.


start "" "C:\Program Files (x86)\Matrix90\Matrix90.exe"
timeout /t 30
taskkill /f /im MatrixStartup.exe

Процесс начинает работать примерно с 25 по 30 секунды после старта программы Бывает и через 27 сек а бывает и ровно через 30.
Вот в этом интервале я хотел бы чтоб батник искал и пытался убить бы этот процесс через каждые 0.5 секунды.

Molchune 26-04-2019 09:21 2869234

а что мешает сделать цикл с запуском через 23 секунда и на протяжении 10 секунда убивать этот процесс?

Gragl 26-04-2019 10:02 2869243

Цикл и хотел бы сделать. Но мешает отсутствие знаний

Iska 26-04-2019 10:33 2869255

Gragl, можете просто переименовать исполняемый файл процесса, если он Вам не нужен? А так — WSH: Prevent a Process from Running.

Gragl 26-04-2019 10:47 2869260

Этот файл я решил удалить, но тогда загрузка программы прекращается. Соответственно переименование тоже не подходит.

Gragl 26-04-2019 11:08 2869265

Iska
По Вашей ссылке скрипт.
в батниках то мало чего понимаю..

Я конечно могу в батнике повторить 20 раз taskkill /f /im MatrixStartup.exe
Но это мне кажется совсем топорно.
помогите сделать изящный 10 секундный цикл пожалуйста :)

Molchune 26-04-2019 12:04 2869271

Изящество не обещаю.
Скрытый текст
Код:

start "" "C:\Program Files (x86)\Matrix90\Matrix90.exe"
timeout /t 23
for /l %%i in (1,1,10) do (
timeout /t 1
taskkill /f /im MatrixStartup.exe
)



Можно конечно раз в секунду искать есть такой процесс или нету, и при его наличии удалять его. Но если проще, то проще просто сразу килять его.

Gragl 26-04-2019 12:25 2869272

Большое спасибо Вам!
Вечером буду тестировать

Iska 26-04-2019 12:36 2869275

Цитата:

Цитата Gragl
По Вашей ссылке скрипт. … в батниках то мало чего понимаю.. »

Значит, пора учиться. Сохраните приведённый код в файл с расширением .vbs, указав в коде потребное имя процесса. Запускайте любым способом, хоть из автозагрузки.

Цитата:

Цитата Gragl
Этот файл я решил удалить, но тогда загрузка программы прекращается. Соответственно переименование тоже не подходит. »

Переименуйте. Скопируйте на его место какой-нибудь C:\Windows\System32\clip.exe, каковой переименуйте в потребное имя.

alpap 26-04-2019 14:00 2869287

Цитата:

Цитата Molchune
раз в секунду искать есть такой процесс или нету, и при его наличии удалять его »

да можно:
Код:

@echo off
set "p=process.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


Gragl 26-04-2019 15:39 2869305

Molchune, Ваш код работает!

alpap, Ваша идея прекрасна, но в код пытался внести свои значения но ничего не получилось. Код не отслеживает а убивает процесс только в тот момент когда я запускаю батник

@echo off
set "p=MatrixStartup.exe"
cmd /c for /l %%i in (1,1,10) do @tasklist /fi "MatrixStartup eq %p%"^|findstr /v :^&^& (taskkill /f /im "%p%"^& exit /b)^&^>nul timeout /t 1 /nobreak


Цитата:

Цитата Iska
Значит, пора учиться. »

А Вы научите ? ;)
C подменой файла и переименованием получилось. Этому я очень удивился!
Заинтересовал код из Вашей ссылки, я заменил имя процесса на свое и тоже сработало :)
А можно ли сделать так чтоб код запускал мою программу, отслеживал процес и когда бы его нашел и прикончил закрыл бы свое окошко и не висел бы в процессах?

Gragl 26-04-2019 16:45 2869310

пытаюсь стартануть прогу, но в третей сторке пишет что не может найти указанный файл

set WSShell = createobject("Wscript.Shell")
WSShell.CurrentDirectory="C:\Program Files (x86)\Matrix90\"
WSShell.run "C:\Program Files (x86)\Matrix90\Matrix90.exe",0

такой код в отдельном файле запускает прогу, но если его вставить в файл из Вашей ссылки то ошибка (переменная не определена)

Option Explicit
Dim wsh
Set wsh = WScript.CreateObject("WScript.Shell")
wsh.Run("""C:\Program Files (x86)\Matrix90\Matrix90.exe")
Set wsh = Nothing

Gragl 26-04-2019 17:08 2869312

Получилось :)

set WshShell = WScript.CreateObject("WScript.Shell")
WshShell.Run """C:\Program Files (x86)\Matrix90\Matrix90.exe""",1


strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")

Set colMonitoredProcesses = objWMIService. _
ExecNotificationQuery("select * from __instancecreationevent " _
& " within 1 where TargetInstance isa 'Win32_Process'")
i = 0

Do While i = 0
Set objLatestProcess = colMonitoredProcesses.NextEvent
If objLatestProcess.TargetInstance.Name = "MatrixStartup.exe" Then
objLatestProcess.TargetInstance.Terminate
End If
Loop

Теперь осталось научиться завершить процесс скрипта

alpap 26-04-2019 18:00 2869315

Цитата:

Цитата Gragl
в код пытался внести свои значения »

не надо этого было делать, это бесконечный цикл
Код:

cmd /c for /l %%i in () do ... (и далее с проверкой раз в секунду) ... timeout /t 1 /nobreak
Цитата:

Цитата Gragl
MatrixStartup eq ...»

вместо: "imagename eq ..."
это что за ..., не знаете синтаксиса или справку смотрите или спрашивайте или не трогайте
код должен быть запущен заранее (естественно), до появления процесса и как процесс появится, он будет отключен и код прекратит работу.

Gragl 26-04-2019 18:25 2869324

alpap,
Сейчас в Вашем коде я заменил только set "p=process.exe" на set "p=MatrixStartup.exe"
Запускаю батник с этим кодом, на мгновение появляется и исчезает окошко консоли. Потом запускаю прогу.
Стартует ненужный процесс MatrixStartup.exe работает и не прерывается.

Может быть я делаю что то не верно?

@echo off
set "p=MatrixStartup.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

Iska 26-04-2019 19:57 2869342

Цитата:

Цитата Gragl
А можно ли сделать так чтоб код запускал мою программу, отслеживал процес и когда бы его нашел и прикончил закрыл бы свое окошко и не висел бы в процессах? »

У него нет «окошка» (если только Вы не исполняете код под консольным cscript.exe). Можно:
Код:

Option Explicit

With WScript.CreateObject("WbemScripting.SWbemLocator").ConnectServer(".", "root\cimv2")
        .Get("Win32_Process").Create "c:\Windows\System32\notepad.exe", "c:\Windows\System32", Nothing, Empty
       
        .ExecNotificationQuery( _
                "SELECT * FROM __InstanceCreationEvent " & _
                "WITHIN 1 WHERE TargetInstance ISA 'Win32_Process' AND " & _
                "TargetInstance.Name = 'calc.exe'" _
        ).NextEvent.TargetInstance.Terminate
End With

WScript.Quit 0

В роли процесса, который нужно запустить — Блокнот, в роли процесса, который следует следом «прихлопнуть» — Калькулятор. Замените имена и пути на свои. Будет работать, только если всё происходит именно так, как Вы описали.

alpap 26-04-2019 22:18 2869355

Цитата:

Цитата Gragl
на мгновение появляется и исчезает окошко консоли »

а вот исчезать не должно, должно висеть пустое окно и ждать процесса, как появится процесс, пропадет и процесс и окно закроется
в вашем случае, вероятно, процесс "MatrixStartup.exe" все же уже запущен до запуска кода и он и код убивается, а следующий запущенный процесс "MatrixStartup.exe" уже некому убивать, процесс cmd уже отключился.

Gragl 27-04-2019 03:39 2869372

Iska,

Все сделал как Вы сказали :)
Просто супер!
Большое Вам спасибо!


alpap,
А Ваш код, к сожалению, не работает в режиме ожидания процесса.
Срабатывает только тогда, когда я его вызываю. Все также на мгновение появляется и исчезает окно, выполняя одну команду taskkill /f /im "%p%

Я попробовал протестировать его на примере калькулятора. Очень хотелось бы увидеть его в деле, но увы, результат тот же.

@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

Gragl 27-04-2019 17:57 2869423

Вложений: 1
Чтобы посмотреть что происходит в окне я добавил pause в файл с кодом расширения .bat
И увидел странный знак "■" в отчете

"■t" не является внутренней или внешней командой.
Откуда взялся этот знак не пойму.
Сохранял в кодировке ANSI и UTF-8

@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
pause

alpap 27-04-2019 22:23 2869440

Gragl,
явно с кодом вы что-то уже нахомутали так как в оригинале и с calc.exe все прекрасно работает:
Код:

@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
pause

скрины: 1 2 3 4
скрины 3 и 4 сделаны, когда в коде первой строкой: @echo on вместо @echo off
P.S.
а что за ОС у вас?
даже скопипастил выше ваш вариант, там отличие только в отсутствии @ перед tasklist что не имеет значение на работу кода - все работает как надо.
уже даже и в utf-8 попробовал запустить - нет проблем (скрин)
что ни пробовал, не смог смоделировать ситуацию как у вас на скрине.
похоже я догадываюсь откуда "ноги растут" у t и в чем дело. ОС у вас похоже XP и там нет timeout, так как нет, поэтому попробуйте в коде вместо окончания: >nul timeout /t 1 /nobreak, записать: >nul ping -n 2 127.0.0.1, вот так:
Код:

@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 ping -n 2 127.0.0.1
pause

только не надо utf-8 сохранять, сохраняйте в 1251 или лучше 866.

Gragl 28-04-2019 05:44 2869457

Моя рабочая система W8.1 (64)
На ней не работает Ваш код
Все другие батники на этой системе работают хорошо.


Проверил свой же код на W7 64 Прекрасно работает
Ваш оригинал тоже работает хорошо.


В чем же может быть причина неправильной работы на моей W8.1 (64) ?
Обработчик команд Windows C:\Windows\System32\cmd.exe

alpap 28-04-2019 11:07 2869475

Цитата:

Цитата Gragl
причина неправильной работы на моей W8.1 (64) ? »

и все же попробуйте с заменой на: >nul ping -n 2 127.0.0.1
может пиратка урезанная какая-то, там такой код что и нечему не работать просто.

Gragl 28-04-2019 13:48 2869488

Вложений: 1
не работает
Пишет что "■t" не является внутренней или внешней командой.
W8.1 64 корпоративная

Iska 28-04-2019 14:08 2869489

Gragl, упакуйте Ваш получившийся пакетный файл в архив, каковой выложите на DropMeFiles.com.

Gragl 28-04-2019 16:50 2869501

https://dropmefiles.com/y0tU4

Iska 28-04-2019 17:17 2869505

Gragl, это файлы именно с машины с Windows 8.1?

Gragl 28-04-2019 19:23 2869516

да, с этого компьютера.
проверял их на W7. там работают.

Iska 28-04-2019 19:50 2869519

Gragl, спасибо, ясно. Идей нет.

habib2302 28-04-2019 21:28 2869525

как вариант можно сделать на autoit'е с контролем и завершением процесса. При этом процесс опрашивается приблизительно каждые 250 миллисекунд. И потом добавить скрипт в планировщик заданий с запуском скрипта при старте системы

Iska 28-04-2019 22:33 2869535

habib2302, это уже есть в теме. Без использования сторонних средств, на WSH.

Gragl 29-04-2019 09:20 2869563

Благодарю всех за Вашу поддержку!
Буду пользоваться VBS by Iska

YuS_2 29-04-2019 16:24 2869601

Ну тогда ещё вариант на powershell, с возможностью слежения за несколькими процессами, с кнопкой на прекращение слежения (процесс powershell через батник запускается в скрытом режиме):
run.bat
Код:

@echo off
powershell -ex bypass -w hidden -c "&{.\script.ps1 'notepad.exe','win32calc.exe'}"

script.ps1
script.ps1
Код:

[cmdletbinding()]
param(
        # Список на выключение можно задать в командной строке:
        # .\script.ps1 'notepad.exe','win32calc.exe'
        # или здесь:
        [string[]]$process = ('example1.exe','win32calc.exe')
)
add-type -assembly system.windows.forms

function enable-watchevent {
        $query = new-object system.management.wqleventquery '__instancecreationevent', `
        (new-object timespan 0,0,1),'targetinstance isa "win32_process"'
        $processwatcher = new-object system.management.managementeventwatcher $query
        $action = {
                new-event 'powershell.processcreated' -sender $sender -eventarguments $eventargs.newevent.targetinstance
        }
        $script:name = 'watchevent'
        $script:id = 'powershell.processcreated'
        $script:job = register-objectevent -input $processwatcher -eventname `
        "eventarrived" -action $action -source $name

}
enable-watchevent


$form = new-object windows.forms.form
$form.autosize = $true
$form.autosizemode = [windows.forms.autosizemode]::growandshrink
$form.formborderstyle = [windows.forms.formborderstyle]::fixedtoolwindow
$form.controlbox = $false
$form.sizegripstyle = [windows.forms.sizegripstyle]::hide
$form.text = 'Продолжить слежение за процессом' + ' ' + $process + '?'
$form.showintaskbar = $false
$form.topmost = $true
$form.startposition = 'CenterScreen'


$btnyes = new-object windows.forms.button
$btnyes.text = 'Да'
$btnyes.location = new-object system.drawing.point(3,10)
$btnyes.dialogresult = [windows.forms.dialogresult]::ok
$form.controls.add($btnyes)

$btnno = new-object windows.forms.button
$btnno.text = 'Нет'
$btnno.location = new-object system.drawing.point(110,10)
$btnno.dialogresult = [windows.forms.dialogresult]::no
$form.controls.add($btnno)

do{
        wait-event $id|out-null
        if($process -contains ($a = (get-event $id).sourceargs.name)){
                write-host Запущен $a
                ps $($a -replace '\.[^\n\.]*$')|kill
                remove-event $id
                $res = $form.showdialog()
        } else {
                write-host Это не процесс из списка на выключение `((get-event $id).sourceargs.name`)
                remove-event $id
        }

} while ($res -ne 'No')
if(get-event $id -ea 0){remove-event $id}
get-job $job.name|remove-job -force


Iska 29-04-2019 16:29 2869602

YuS_2, «win32calc.exe» — это, случайно, не новое имя исполняемого файла старого доброго Калькулятора под ОС Windows 10?

YuS_2 29-04-2019 16:39 2869604

Цитата:

Цитата Iska
новое имя исполняемого файла старого доброго Калькулятора под ОС Windows 10? »

оно самое :)

Iska 29-04-2019 17:16 2869610

YuS_2, спасибо, ясно. А то я там на днях по привычке сделал Win-R, calc.exe, Enter и был неприятно удивлён результатом.

YuS_2 29-04-2019 18:35 2869613

Цитата:

Цитата Iska
А то я там на днях по привычке сделал Win-R, calc.exe, Enter и был неприятно удивлён результатом. »

calc.exe тоже присутствует, для обратной совместимости, но это только заглушка для запуска win32calc.exe
в общем, скучать индусы не дадут. :)

Iska 29-04-2019 20:28 2869630

YuS_2, стоп. Говоря «старый и добрый», я имел в виду обычный Калькулятор, а не его богомерзкую Modern (или как оно там нынче именуется) инкарнацию:
Скрытый текст

Получается — его больше нет?

YuS_2 29-04-2019 20:50 2869633

Цитата:

Цитата Iska
а не его богомерзкую Modern (или как оно там нынче именуется) инкарнацию »

не знаю... у меня такой:

Iska 29-04-2019 20:59 2869634

Хмм… Попробую завтра «пощупать».


Время: 22:44.

Время: 22:44.
© OSzone.net 2001-