Показать полную графическую версию : [решено] Батник отслеживающий и убивающий процесс
Доброго времени!
Есть программа, которая через некоторое время после старта запускает дополнительный процесс который отнимает время для загрузки в программу всяких ненужностей
Я хотел бы чтоб батник отследил запуск этого ненужного процесса убил бы его и закрыл бы свое окошко.
Я сделал вот такой вариант, но не могу отследить точное время когда запускается процесс, если не успеваю на три секунды убить процесс то он успевает подгрузить в программу ненужные мне вещи.
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
а что мешает сделать цикл с запуском через 23 секунда и на протяжении 10 секунда убивать этот процесс?
Цикл и хотел бы сделать. Но мешает отсутствие знаний
Gragl, можете просто переименовать исполняемый файл процесса, если он Вам не нужен? А так — WSH: Prevent a Process from Running (https://gallery.technet.microsoft.com/scriptcenter/7bbecb60-e360-47dd-8aae-bf91c6d58df6).
Этот файл я решил удалить, но тогда загрузка программы прекращается. Соответственно переименование тоже не подходит.
Iska
По Вашей ссылке скрипт.
в батниках то мало чего понимаю..
Я конечно могу в батнике повторить 20 раз taskkill /f /im MatrixStartup.exe
Но это мне кажется совсем топорно.
помогите сделать изящный 10 секундный цикл пожалуйста :)
Molchune
26-04-2019, 12:04
Изящество не обещаю.
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
)
Можно конечно раз в секунду искать есть такой процесс или нету, и при его наличии удалять его. Но если проще, то проще просто сразу килять его.
Большое спасибо Вам!
Вечером буду тестировать
По Вашей ссылке скрипт. … в батниках то мало чего понимаю.. »
Значит, пора учиться. Сохраните приведённый код в файл с расширением .vbs, указав в коде потребное имя процесса. Запускайте любым способом, хоть из автозагрузки.
Этот файл я решил удалить, но тогда загрузка программы прекращается. Соответственно переименование тоже не подходит. »
Переименуйте. Скопируйте на его место какой-нибудь C:\Windows\System32\clip.exe, каковой переименуйте в потребное имя.
раз в секунду искать есть такой процесс или нету, и при его наличии удалять его »
да можно:
@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
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
Значит, пора учиться. »
А Вы научите ? ;)
C подменой файла и переименованием получилось. Этому я очень удивился!
Заинтересовал код из Вашей ссылки, я заменил имя процесса на свое и тоже сработало :)
А можно ли сделать так чтоб код запускал мою программу, отслеживал процес и когда бы его нашел и прикончил закрыл бы свое окошко и не висел бы в процессах?
пытаюсь стартануть прогу, но в третей сторке пишет что не может найти указанный файл
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
Получилось :)
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
Теперь осталось научиться завершить процесс скрипта
в код пытался внести свои значения »
не надо этого было делать, это бесконечный цикл
cmd /c for /l %%i in () do ... (и далее с проверкой раз в секунду) ... timeout /t 1 /nobreak
MatrixStartup eq ...»
вместо: "imagename eq ..."
это что за ..., не знаете синтаксиса или справку смотрите или спрашивайте или не трогайте
код должен быть запущен заранее (естественно), до появления процесса и как процесс появится, он будет отключен и код прекратит работу.
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
А можно ли сделать так чтоб код запускал мою программу, отслеживал процес и когда бы его нашел и прикончил закрыл бы свое окошко и не висел бы в процессах? »
У него нет «окошка» (если только Вы не исполняете код под консольным 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
В роли процесса, который нужно запустить — Блокнот, в роли процесса, который следует следом «прихлопнуть» — Калькулятор. Замените имена и пути на свои. Будет работать, только если всё происходит именно так, как Вы описали.
на мгновение появляется и исчезает окошко консоли »
а вот исчезать не должно, должно висеть пустое окно и ждать процесса, как появится процесс, пропадет и процесс и окно закроется
в вашем случае, вероятно, процесс "MatrixStartup.exe" все же уже запущен до запуска кода и он и код убивается, а следующий запущенный процесс "MatrixStartup.exe" уже некому убивать, процесс cmd уже отключился.
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
Чтобы посмотреть что происходит в окне я добавил 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
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 (https://drive.google.com/open?id=1F2TZMdb0vteYDw9HW0ykJPiv1Q132w6v) 2 (https://drive.google.com/open?id=1n52e30mUygpEzIrj2El5gWE7Gh4B2dIM) 3 (https://drive.google.com/open?id=1eNDdzFvYFMwguE7RG9gwKvJYcFdqMISe) 4 (https://drive.google.com/open?id=1srsF--gDsaiYhLkc3o1XJbWNJG6YLDlU)
скрины 3 и 4 сделаны, когда в коде первой строкой: @echo on вместо @echo off
P.S.
а что за ОС у вас?
даже скопипастил выше ваш вариант, там отличие только в отсутствии @ перед tasklist что не имеет значение на работу кода - все работает как надо.
уже даже и в utf-8 попробовал запустить - нет проблем (скрин (https://drive.google.com/open?id=1IjowygdktxDMwBXJCIH8jfD0sPJG17cN))
что ни пробовал, не смог смоделировать ситуацию как у вас на скрине.
похоже я догадываюсь откуда "ноги растут" у 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.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.