Показать полную графическую версию : Завершение процессов кроме, определенных
Данный скрипт открывает процесс в подпроцессе Winlogon…»
Нет. Скрипт тут не при чём. См. внимательно сопровождающий текст в #33 (http://forum.oszone.net/post-1891991-33.html).
а можно ли его переписать,что бы открывал как отдельный процесс?не в под процессах? »
Поясните Вашу мысль.
Подскажите, как поправить код, чтобы вывести процессы в 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
sov44, зачем убирать повторы? Это ведь разные процессы.
sov44, зачем убирать повторы? Это ведь разные процессы. »
Iska, в основном дублируются имена системных процессов(svchost.exe). Их сносить никто не собирается и нет смысла их дублировать. Задача - выловить запущенные пользовательские программы (процессы) и завершить их в случае необходимости.
Тогда так:
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
'=============================================================================
Запускать посредством хоста «cscript.exe».
Iska, благодарю, но интересует реализация скрипта в bat.
VBS для меня пока ещё "лес дремучий" ;)
п.с. сорри, что запостил не в той теме.
Iska, благодарю, но интересует реализация скрипта в bat. »
Как скажете. А Вы его пробовали?
п.с. сорри, что запостил не в той теме. »
Поскольку Ваш вопрос никак не связан с данной темой, стоило поместить его в отдельную.
Вроде сделал, но пока не получается выстроить ровность столбцов. Нужна подсказка.
@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
Дополнение справа пробелами Вы уже сделали. Просто обрезайте заданное количество символов, например:
@echo off
setlocal enableextensions enabledelayedexpansion
for %%i in ("Hello World" "Мама мыла раму" "Рабы не мы, мы не рабы") do (
set sValue=%%~i
set sOut=!sOut!!sValue:~0,20!
)
echo.%sOut%
endlocal
exit /b 0
Anonymоus
22-05-2012, 03:10
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 и дополнил пробелами.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.