Что нового

завершение процессов, не входящих в массив

antidog

Новичок
Сообщения
26
Репутация
2
Код:
#include <Array.au3>
$myproc = ProcessList ()
$i=1


Dim $spisok[14]
$spisok[0] = "Amoumain.exe"
$spisok[1] = "AVP.exe"
$spisok[2] = "CSRSS.exe"
$spisok[3] = "CTFMON.exe"
$spisok[4] = "EVEREST.BIN"
$spisok[5] = "EXPLORER.EXE"
$spisok[6] = "LSASS.EXE"
$spisok[7] = "RTHDCPL.EXE"			;массив с нужными процессами
$spisok[8] = "SERVICES.EXE"
$spisok[9] = "SMSS.EXE"
$spisok[10] = "SVCHOST.EXE"
$spisok[11] = "System"
$spisok[12] = "TASKMGR.EXE"
$spisok[13] = "WINLOGON.EXE"






For $i = 1 to UBound ($myproc)
	If Not _ArrayBinarySearch ( $spisok, $myproc[$i][0]) Then
		
		ProcessClose ($myproc[$i][0])
		EndIf
	Next




выдаёт ошибку Array variable has incorrect number of subscripts or subscript dimension range exceeded
что не так?
 

SyDr

Сидра
Сообщения
651
Репутация
158
Индекс последнего элемента на 1 меньше, чем размер массива. Нумерация начинается с 0
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
antidog
Я так делаю, чтобы потом не путаться:
Код:
Dim $aSpisok[15]
$aSpisok[0] = 14 ;кол-во элементов массива, начиная с 1-ого (не с 0-ого)
$aSpisok[1] = "Amoumain.exe"
$aSpisok[2] = "AVP.exe"
$aSpisok[3] = "CSRSS.exe"
$aSpisok[4] = "CTFMON.exe"
$aSpisok[5] = "EVEREST.BIN"
$aSpisok[6] = "EXPLORER.EXE"
$aSpisok[7] = "LSASS.EXE"
$aSpisok[8] = "RTHDCPL.EXE"
$aSpisok[9] = "SERVICES.EXE"
$aSpisok[10] = "SMSS.EXE"
$aSpisok[11] = "SVCHOST.EXE"
$aSpisok[12] = "System"
$aSpisok[13] = "TASKMGR.EXE"
$aSpisok[14] = "WINLOGON.EXE"
;и дальше
For $i = 1 To $aSpisok[0]
	;...
В Вашем случае лучше сделать так:
Код:
;...
For $i = 1 to $myproc[0][0]
;...
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Код:
#include <Array.au3>

$myproc = ProcessList()

Dim $spisok[14]
$spisok[0] = "Amoumain.exe"
$spisok[1] = "AVP.exe"
$spisok[2] = "CSRSS.exe"
$spisok[3] = "CTFMON.exe"
$spisok[4] = "EVEREST.BIN"
$spisok[5] = "EXPLORER.EXE"
$spisok[6] = "LSASS.EXE"
$spisok[7] = "RTHDCPL.EXE" ;массив с нужными процессами
$spisok[8] = "SERVICES.EXE"
$spisok[9] = "SMSS.EXE"
$spisok[10] = "SVCHOST.EXE"
$spisok[11] = "System"
$spisok[12] = "TASKMGR.EXE"
$spisok[13] = "WINLOGON.EXE"

For $i = 1 To $myproc[0][0]
	If Not _ArrayBinarySearch($spisok, $myproc[$i][0]) Then
		ProcessClose($myproc[$i][1])
	EndIf
Next


Я только не понял почему именно BinarySearch?
 
Автор
A

antidog

Новичок
Сообщения
26
Репутация
2
Всё равно чёт не работает. закрывается сразу, без ошибок, но процессы на месте, живые :blum:
OffTopic:
CreatoR - Репутация: 666 :rofl:
 

dronet

Знающий
Сообщения
46
Репутация
8
Или может так? даже писать меньше нужно ;D

Код:
; Вариант 1
Dim $spisok[14] = _
	[ _
	"Amoumain.exe", _ ; < Есть запятая!
	"AVP.exe", _
	"CSRSS.exe", _
	"CTFMON.exe", _
	"EVEREST.BIN", _
	"EXPLORER.EXE", _
	"LSASS.EXE", _
	"RTHDCPL.EXE", _  ;массив с нужными процессами
	"SERVICES.EXE", _
	"SMSS.EXE", _
	"SVCHOST.EXE", _
	"System", _
	"TASKMGR.EXE", _
	"WINLOGON.EXE" _ ; < Запятой нет!
	]

For $i = 0 to  UBound ($spisok) - 1
	MsgBox(0,'', $spisok[$i])
Next

#Cs
; Вариант 2
Dim $spisok[15] = _		;< 15 = На один больше!
	[14, _				;< 14 = Всего!
	"Amoumain.exe", _	;< Есть запятая!
	"AVP.exe", _
	"CSRSS.exe", _
	"CTFMON.exe", _
	"EVEREST.BIN", _
	"EXPLORER.EXE", _
	"LSASS.EXE", _
	"RTHDCPL.EXE", _  ;массив с нужными процессами
	"SERVICES.EXE", _
	"SMSS.EXE", _
	"SVCHOST.EXE", _
	"System", _
	"TASKMGR.EXE", _
	"WINLOGON.EXE" _ ; < Запятой нет!
	]

	; И тогда так!
For $i = 1 to $spisok[0]
	MsgBox(0,'', $spisok[$i])
Next
#Ce



Добавлено:
Сообщение автоматически объединено:

Всё равно чёт не работает. закрывается сразу, без ошибок, но процессы на месте, живые
Может дело в этом - обрати внимание на $myproc[$i][1] < зачем 1ца в конце? или я может туплю :whistle:
Код:
For $i = 1 To $myproc[0][0]
    If Not _ArrayBinarySearch($spisok, $myproc[$i][0]) Then
        ProcessClose($myproc[$i][1])
    EndIf
Next


Да! Если с моими примерами, то будет так:
Код:
$spisok[$i]


Добавлено:
Сообщение автоматически объединено:

Ааа! :-[ Дело в том что поменяй 0 на 1 может так тогда
If Not _ArrayBinarySearch($spisok, $myproc[$i][0]) Then = содержит имя а там нужен код
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
antidog [?]
процессы на месте
Судя по названию тему, нужно делать так:

Код:
#include <Array.au3>

Global $aProcList = ProcessList()

Global $aMyProcList = _
	StringSplit( _
		"Amoumain.exe|AVP.exe|CSRSS.exe|CTFMON.exe|EVEREST.BIN|EXPLORER.EXE|LSASS.EXE|" & _
		"RTHDCPL.EXE|SERVICES.EXE|SMSS.EXE|SVCHOST.EXE|System|TASKMGR.EXE|WINLOGON.EXE", _
	"|")

For $i = 1 To $aProcList[0][0]
	_ArrayBinarySearch($aMyProcList, $aProcList[$i][0], 1)
	
    If @error = 3 Then
		;ProcessClose($aProcList[$i][1])
		
		ConsoleWrite("! Close: " & @TAB & $aProcList[$i][0] & @LF)
	Else
		ConsoleWrite("+ Don't Close: " & @TAB & $aProcList[$i][0] & @LF)
    EndIf
Next
 

dronet

Знающий
Сообщения
46
Репутация
8
CreatoR У меня всегда показывает 'Don't Close' :'( Хотя я уверрен что должно было висветитса 'Close' для 8ми программ. Я делал так: записал все процессы которые были открыты в список, затем открыл ешё 8 программ и :'( не небыло того что я так хотел увидеть 'Close'.

Тут набросал сам небольшой примерчик... Да и осторожней с процессами ;D
Код:
#include <Array.au3>

Dim $aMyproc = ProcessList ()

Dim $aSpisok[14] = _
    [ _
    "Amoumain.exe", _ ; < Есть запятая!
    "AVP.exe", _
    "CSRSS.exe", _
    "CTFMON.exe", _
    "EVEREST.BIN", _
    "EXPLORER.EXE", _
    "LSASS.EXE", _
    "RTHDCPL.EXE", _  ;массив с нужными процессами
    "SERVICES.EXE", _
    "SMSS.EXE", _
    "SVCHOST.EXE", _
    "System", _
    "TASKMGR.EXE", _
    "WINLOGON.EXE" _ ; < Запятой нет!
    ]

If Not (_ArraySort($aSpisok) Or _ArraySort($aMyproc)) Then Exit ; Сортировка, Впринципе не обязательна

$aResult = ''
For $i = 0 to  UBound ($aSpisok) - 1
	Do  ; До '@Error = 6' Пока не кончатса одинаковые процессы - например как 'svchost.exe'
		$iResult = _ArraySearch($aMyproc, $aSpisok[$i]) ; Поиск.
		If @Error = 6 Then ExitLoop ; Закончились одинаковые процессы.
		If $iResult = -1 Then Exit Msgbox(0,'',' Произошло непредвиденное закрытие процесса.') ; В ходе работы Процесс кудато делся ???
		_ArrayDelete($aMyproc, $iResult)
		$aMyproc[0][0] -= 1 ; Уменшает число массива, чтоб не-было в дальнейшем путанници.
	Until @Error = 6
Next
	ConsoleWrite("Всего закрыть: " & @TAB & $aMyproc[0][0] & @LF)
For $i = 1 To $aMyproc[0][0]

;~ ProcessClose($aProcList[$i][1])
; Или
;~ ProcessWaitClose($aProcList[$i][1]) ; Ждет пока закроетса процесс.

ConsoleWrite("! Закрываем: " & @TAB & $aMyproc[$i][0] & @LF)
Next



Добавлено:
Сообщение автоматически объединено:

Или ProcessClose($aProcList[$i][0]) если ProcessClose($aProcList[$i][1]) не подойдёт :whistle:


Добавлено:
Сообщение автоматически объединено:

Или так

Код:
If Not (_ArraySort($aSpisok) Or _ArraySort($aMyproc)) Then Exit

$aResult = ''
For $i = 1 to  $aMyproc[0][0]
	$iResult = _ArraySearch($aSpisok, $aMyproc[$i][0]) ; Поиск.
	If @Error = 6 Then
;~ ProcessClose($aProcList[$i][1])
; Или
;~ ProcessWaitClose($aProcList[$i][1])
		ConsoleWrite("! Close: " & @TAB & $aMyproc[$i][0] & @LF)
	Else
		ConsoleWrite("+ Don't Close: " & @TAB & $aMyproc[$i][0] & @LF)
	EndIf
Next

; END
 

Guezt

Продвинутый
Сообщения
335
Репутация
82
Вроде так работает:
Код:
#include <Array.au3>

$myproc = ProcessList()

Dim $spisok[14]
$spisok[0] = "Amoumain.exe"
$spisok[1] = "AVP.exe"
$spisok[2] = "CSRSS.exe"
$spisok[3] = "CTFMON.exe"
$spisok[4] = "EVEREST.BIN"
$spisok[5] = "EXPLORER.EXE"
$spisok[6] = "LSASS.EXE"
$spisok[7] = "RTHDCPL.EXE"          ;массив с нужными процессами
$spisok[8] = "SERVICES.EXE"
$spisok[9] = "SMSS.EXE"
$spisok[10] = "SVCHOST.EXE"
$spisok[11] = "System"
$spisok[12] = "TASKMGR.EXE"
$spisok[13] = "WINLOGON.EXE"



For $i =0 To UBound($spisok)-1
  $ii = _ArraySearch($myproc,$spisok[$i])
  _ArrayDelete($myproc,$ii)
Next

For $i=0 To UBound($myproc)-1
	;ProcessClose($myproc[$i][1]) ; раскомментировать для завершения процессов
	ConsoleWrite('Завершили: '&$myproc[$i][0]&@CRLF)
Next



Добавлено:
Сообщение автоматически объединено:

p.s. если нужных процессов запущено больше чем 1 то не работает :whistle:


Добавлено:
Сообщение автоматически объединено:

Вот так правильнее будет:
Код:
#include <Array.au3>

$myproc = ProcessList()

Dim $spisok[14]
$spisok[0] = "Amoumain.exe"
$spisok[1] = "AVP.exe"
$spisok[2] = "CSRSS.exe"
$spisok[3] = "CTFMON.exe"
$spisok[4] = "EVEREST.BIN"
$spisok[5] = "EXPLORER.EXE"
$spisok[6] = "LSASS.EXE"
$spisok[7] = "RTHDCPL.EXE"          ;массив с нужными процессами
$spisok[8] = "SERVICES.EXE"
$spisok[9] = "SMSS.EXE"
$spisok[10] = "SVCHOST.EXE"
$spisok[11] = "System"
$spisok[12] = "TASKMGR.EXE"
$spisok[13] = "WINLOGON.EXE"


For $i =0 To UBound($spisok)-1
  Do
  $iIndex = _ArraySearch($myproc,$spisok[$i])
  _ArrayDelete($myproc,$iIndex)
  Until $iIndex <> 0
Next


For $i=0 To UBound($myproc)-1
	;ProcessClose($myproc[$i][1]) ; раскомментировать для завершения процессов
	ConsoleWrite('Завершили: '&$myproc[$i][0]&@CRLF)
Next
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
А зачем нужен ProcessList() и _ArraySearch()? Вроде и без этого работает:
Код:
HotKeySet('{Esc}', '_Exit')

Dim $aMyBadProcesses[3] = [2, 'notepad.exe', 'AkelPad.exe']
$iPause = 10 ;секунд
$iStart = TimerInit()
While 1
	If TimerDiff($iStart) >= $iPause * 1000 Then
		For $i = 1 To $aMyBadProcesses[0]
			If ProcessExists($aMyBadProcesses[$i]) Then
				$iCount = 0
				ConsoleWrite('---Есть ' & $aMyBadProcesses[$i] & @LF)
				While ProcessExists($aMyBadProcesses[$i])
					ProcessClose($aMyBadProcesses[$i])
					$iCount += 1
					Sleep(100)
				WEnd
				ConsoleWrite('---Закрыли ' & $iCount & ' ' & $aMyBadProcesses[$i] & @LF)
			EndIf
		Next
		$iStart = TimerInit()
	EndIf
	Sleep(100)
WEnd

Func _Exit()
	Exit
EndFunc   ;==>_Exit
 

Guezt

Продвинутый
Сообщения
335
Репутация
82
madmasles
так ему вроде те что нужны в списке процессов надо оставить а остальные закрыть, а у тебя закрывает как раз по списку, нет?! :-\


Добавлено:
Сообщение автоматически объединено:

потому и нужен массив потому что заранее не известен список процессов.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Guezt Gutsy
На мой взгляд проще запретить определенные процессы и закрывать их. Тот же массив системных процессов не всегда одинаков. Не предусмотрел их все в разрешенных и убил какой-нибудь нужный. ;)
 

Guezt

Продвинутый
Сообщения
335
Репутация
82
madmasles
так даже правильнее, но какой вопрос такое и решение, так что это к автору :smile:
 

Guezt

Продвинутый
Сообщения
335
Репутация
82
OffTopic:
AZJIO
а что мешает вирусу иметь имя совпадающее с системным ?! правильно, ничего. :smile:
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
dronet [?]
Я делал так: записал все процессы которые были открыты в список, затем открыл ешё 8 программ
А просто запустить пример и проверить нельзя было?
 

dronet

Знающий
Сообщения
46
Репутация
8
CreatoR
А просто запустить пример и проверить нельзя было?
Ааа! В том то и дело что запускал... Я ж писал
записал все процессы которые были открыты в список, затем открыл ешё 8 программ
естественно я запускал пример
не небыло того что я так хотел увидеть
Ну этих натписей по ConsoleWrite("! Close: " & @TAB & $aMyproc[$i][0] & @LF)
хотя для 8 програм должны были отработать.


Добавлено:
Сообщение автоматически объединено:

Сами попробуйте, Запешите в $aMyProcList = _ Все открытые процессы, запустите ешё хотябы 2 ну и скрипт затем... И каков результат?


Добавлено:
Сообщение автоматически объединено:

AZJIO
Вариант с StringInStr (работу не проверял, но думаю смысл ясен)
Не плохо :ok:
Как не пробовал а с _ArrayBinarySearch не работает :mad: Может у ково ешё не работает?
 

kzru_hunter

Осваивающий
Сообщения
144
Репутация
49
Потому что небольшая ошибка, надо так:
Код:
If _ArrayBinarySearch($spisok, $myproc[$i][0]) = -1 Then
 
Автор
A

antidog

Новичок
Сообщения
26
Репутация
2
ух ты! сколько вариантов :laugh: забрал последний от creator, работает так, как нужно.
скрипт нужен был для убивания всякой гадости (~20 процессов), которая вообще никаким образом не влияла на работу компа, а в автозагрузке не убирается :wacko:,
всем спасибо
 
Верх