|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » VBS/WSH/JS - Завершение процессов кроме, определенных |
|
VBS/WSH/JS - Завершение процессов кроме, определенных
|
![]() Старожил Сообщения: 284 |
Подскажите как написать скрипт,который будет закрывать все процессы кроме мною указанных.
например: которые должны работать svchost.exe services.exe ctfmon.exe explorer.exe и тд А все остальные закрыть! |
|
Отправлено: 12:33, 28-03-2012 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать |
Отправлено: 16:19, 03-04-2012 | #41 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Ветеран Сообщения: 2196
|
Профиль | Отправить PM | Цитировать Подскажите, как поправить код, чтобы вывести процессы в 3 столбика и убрать их повторы?
@echo off SetLocal EnableDelayedExpansion For /F "tokens=1 delims=," %%p In ('tasklist /FO CSV^|sort') Do ( Set nam=%%p if %%p neq "Имя образа" ( Set /A nn +=1 set proc!nn!=%%p Echo !nn!. !nam:~1,-1! )) echo. set /p kill=Введите номер процесса, который нужно завершить: echo Выбран !proc%kill%!. Уверены? echo. pause taskkill /f /im !proc%kill%! /T pause>nul |
Отправлено: 08:44, 21-05-2012 | #42 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать sov44, зачем убирать повторы? Это ведь разные процессы.
|
Отправлено: 09:43, 21-05-2012 | #43 |
Ветеран Сообщения: 2196
|
Профиль | Отправить PM | Цитировать Цитата Iska:
|
|
Отправлено: 10:14, 21-05-2012 | #44 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать Тогда так:
Option Explicit Const adVarChar = 200 Const adInteger = 3 Dim strComputer Dim lngColumnsCount Dim objSWbemLocator Dim objSWbemServicesEx Dim collSWbemObjectSet Dim objSWbemObjectEx Dim objWshNetwork Dim strUserSID Dim strProcessUserSID Dim strProcessNumber4Terminate Dim i strComputer = "." lngColumnsCount = 3 Set objSWbemLocator = WScript.CreateObject("WbemScripting.SWbemLocator") Set objSWbemServicesEx = objSWbemLocator.ConnectServer(strComputer, "root\cimv2") Set collSWbemObjectSet = objSWbemServicesEx.ExecQuery("SELECT * FROM Win32_Process WHERE ProcessID <> " & CStr(GetScriptProcessID()) & "") Set objWshNetwork = WScript.CreateObject("WScript.Network") strUserSID = objSWbemServicesEx.Get("Win32_UserAccount.Domain='" & objWshNetwork.UserDomain & "',Name='" & objWshNetwork.UserName & "'").SID With WScript.CreateObject("ADOR.Recordset") With .Fields .Append "Name", adVarChar, 256 .Append "Handle", adInteger End With .Open .Sort = "Name ASC" For Each objSWbemObjectEx In collSWbemObjectSet If objSWbemObjectEx.GetOwnerSid(strProcessUserSID) = 0 Then If strUserSID = strProcessUserSID Then .AddNew Array("Name", "Handle"), Array(objSWbemObjectEx.Name, objSWbemObjectEx.Handle) End If End If Next .MoveFirst Do For i = 1 To lngColumnsCount If Not .EOF Then WScript.StdOut.Write "[" & CStr(.AbsolutePosition) & "] " & Left(.Fields.Item("Name").Value & Space(25), 25) & vbTab .MoveNext Else Exit Do End If Next WScript.StdOut.WriteLine Loop Do WScript.StdOut.WriteLine WScript.StdOut.Write "Введите номер процесса для удаления [1-" & CStr(.RecordCount) & "]:" strProcessNumber4Terminate = Trim(WScript.StdIn.ReadLine()) If Len(strProcessNumber4Terminate) <> 0 Then If IsNumeric(strProcessNumber4Terminate) Then If CLng(strProcessNumber4Terminate) >= 1 And CLng(strProcessNumber4Terminate) <= .RecordCount Then Exit Do Else WScript.StdOut.WriteLine "Введённый номер [" & strProcessNumber4Terminate & "] не соответствует ни одному процессу." End If Else WScript.StdOut.WriteLine "Введено не числовое значение." End If Else WScript.StdOut.WriteLine "Отсутствует ввод." End If Loop .AbsolutePosition = CLng(strProcessNumber4Terminate) Set objSWbemObjectEx = objSWbemServicesEx.Get("Win32_Process.Handle=" & CStr(.Fields.Item("Handle").Value) & "") If objSWbemObjectEx.Terminate() = 0 Then WScript.StdOut.WriteLine "Процесс [" & objSWbemObjectEx.Name & "] успешно удалён" Else WScript.StdOut.WriteLine "Не удалось удалить процесс [" & objSWbemObjectEx.Name & "]" End If Set objSWbemObjectEx = Nothing .Close End With Set objWshNetwork = Nothing Set collSWbemObjectSet = Nothing Set objSWbemServicesEx = Nothing Set objSWbemLocator = Nothing WScript.Quit 0 '============================================================================= '============================================================================= Function GetScriptProcessID() With WScript.CreateObject("WScript.Shell").Exec( _ """mshta.exe"" ""<HTML><HEAD><HTA:APPLICATION APPLICATIONNAME='GetParentPID' " & _ "WINDOWSTATE='minimize' SHOWINTASKBAR='no'</HEAD></HTML>""" _ ) GetScriptProcessID = objSWbemServicesEx.Get("Win32_Process.Handle='" & CStr(.ProcessID) &"'").ParentProcessID .Terminate End With End Function '============================================================================= |
Отправлено: 11:45, 21-05-2012 | #45 |
Ветеран Сообщения: 2196
|
Профиль | Отправить PM | Цитировать Iska, благодарю, но интересует реализация скрипта в bat.
VBS для меня пока ещё "лес дремучий" ![]() п.с. сорри, что запостил не в той теме. |
Последний раз редактировалось sov44, 21-05-2012 в 13:21. Отправлено: 12:36, 21-05-2012 | #46 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать |
Отправлено: 16:12, 21-05-2012 | #47 |
Ветеран Сообщения: 2196
|
Профиль | Отправить PM | Цитировать Вроде сделал, но пока не получается выстроить ровность столбцов. Нужна подсказка.
@echo off SetLocal EnableDelayedExpansion For /F "tokens=1 delims=," %%p In ('tasklist /FO CSV^|sort') Do ( Set nam=%%p if %%p neq "Имя образа" ( Set /A nn +=1 if !nn! LEQ 9 set "nn= !nn!" set proc!nn!=%%p set "sort=!nn!. !nam:~1,-1!" for /f "delims=*" %%a in ("!nn!. !nam:~1,-1!") do ( set "$a=%%a " Set /A Cnt += 1 set "$s=!$s!!$a!"& set/a $i+=1 if "!$i!"=="3" echo:!$s!& set "$s="& set/a $i=0 ))) echo. set /p kill=Введите номер процесса, который нужно завершить: echo Выбран !proc%kill%!. Уверены? echo. pause taskkill /f /im !proc%kill%! /T pause>nul |
Отправлено: 00:59, 22-05-2012 | #48 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать Дополнение справа пробелами Вы уже сделали. Просто обрезайте заданное количество символов, например:
|
Отправлено: 01:24, 22-05-2012 | #49 |
Старожил Сообщения: 415
|
Профиль | Отправить PM | Цитировать sov44, вот реализация на bat, столбцы ровные, с нумерацией, добавлен ведущий ноль, дубли процессов убраны. Слишком длинные имена обрезаются с добавлением троеточия, но когда скрипт запрашивает подтверждение на убийство процесса, его имя выводится полностью.
Сортировка выполнена через жопу, так пришлось сделать потому, что не хотелось отлавливать system и system idle из прошедшего вначале через sort списка. @Echo Off SetLocal EnableDelayedExpansion :Main Set ProcessList= rem Получаем список процессов без хлама, типа System и System Idle For /F "skip=3 tokens=1 delims=," %%P In ('tasklist /FO CSV /NH') Do ( rem Убираем повторы, составляем список Echo !ProcessList!|Find ":%%~P:">nul||( Set ProcessList=!ProcessList!:%%~P: Set %%~P=MarkForSorting ) ) Set ProcessNum=0&Set Row=0&Set RowData=&Set DisplayNum=0 rem Жуткий костыль с сортировкой, но по другому не вышло бы из-за skip в rem первом цикле For /F "tokens=1 delims==" %%P In ('Set^|Sort^|Find "MarkForSorting"') Do ( rem Назначаем номер процессу Set /A ProcessNum+=1&Set ProcessNum!ProcessNum!=%%P Set Process=%%P rem Добавление ведущего нуля If !ProcessNum! LSS 10 (Set DisplayNum=0!ProcessNum!) Else (Set DisplayNum=!ProcessNum!) rem Максимальная ширина столбца-1 If !Row! GTR 2 ( Echo !RowData! Set Row=1 Call :Autowidth " !DisplayNum! !Process!" Set RowData=!String! ) Else ( Set /A Row+=1 Call :Autowidth " !DisplayNum! !Process!" Set RowData=!RowData!!String! ) ) rem Вывод остатка строки Echo %RowData% rem Удаление ненужных переменных For /F "tokens=1 delims==" %%P In ('Set^|Find "MarkForSorting"') Do (Set %%P=) Echo. Set /P KillNum=Выберите номер процесса для завершения^> Echo. Echo Вы точно хотите убить процесс #%KillNum% !ProcessNum%KillNum%! ? Set /P Confirm=[Y\N]^> If /I %Confirm%==y ( TaskKill /F /IM "!ProcessNum%KillNum%!" rem Без этой задержки в списке иногда появлялись только что убитые процессы Ping -n 2 127.0.0.1>nul Echo.&Echo. GoTo Main ) Else ( Echo.&Echo. GoTo Main ) rem Автовыравнивание, обрезка длинного имени и добавление '...', если rem имя процесса не влазит в ширину столбца :Autowidth Set String=%~1 If Not "%String:~25%"=="" Set String=%String:~,22%... :Loop If "%String:~25%"=="" Set String=%String% &GoTo Loop Exit /B UPD: Сделал автовыравнивание не на табах, как у меня было, а воспользовался советом Iska и дополнил пробелами. |
Последний раз редактировалось Anonymоus, 22-05-2012 в 05:00. Отправлено: 03:10, 22-05-2012 | #50 |
![]() |
Участник сейчас на форуме |
![]() |
Участник вне форума |
![]() |
Автор темы |
![]() |
Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
.NET - Завершение не своих процессов на C# | ldcount | Программирование и базы данных | 4 | 29-07-2013 14:19 | |
CMD/BAT - Завершение процессов, не указанных в списке | Anonymоus | Скриптовые языки администрирования Windows | 4 | 05-08-2011 10:33 | |
Разное - Завершение нескольких процессов из CMD или программы | antikiller_bm | Microsoft Windows 2000/XP | 3 | 24-05-2009 23:39 | |
Заблокировать трафик, кроме определенных IP | noleiemit | Microsoft Windows NT/2000/2003 | 17 | 19-01-2009 21:51 | |
Разное - Неожиданное завершение службы Запуск серверных процессов DCOM | koresaram | Microsoft Windows 2000/XP | 3 | 25-07-2007 12:20 |
|