Что нового

Изменения массива скрипта через внешний файл txt, ini и т.д.

tarasov.evgeny

Новичок
Сообщения
13
Репутация
0
Есть скрипт, который убивает процессы. Процессы заданы в массиве. Проверка на наличие такого процесса происходит через определенный промежуток времени.

Хочется добавить к скрипту возможность изменять список процессов, не меняя сам скрипт.
Т.е. скрипт, должен брать из какого-то файла ini, txt и т.д. данные.
Он должен этот файл как-то разбирать по строчкам и подставлять в массив

Код:
Dim $Array [2]
$Array [0]="notepad.exe"
$Array [1]="calc.exe"
For $i=1 to 3 
For $temp in $Array
If ProcessExists($temp) Then ProcessClose ($temp)
Next
Sleep (30000)
$i=1
Next
exit
 

SECTOR

Продвинутый
Сообщения
399
Репутация
59
tarasov.evgeny

Я бы сделал так:
Код:
#include <File.au3>
#include <Array.au3>

Global $sListFile = @ScriptDir&"\Process.txt" ; Расположения списка процессов
Global $iSleep = 5 ; Время паузы в секундах

Global $hTimer = TimerInit()

If Not FileExists($sListFile) Or _FileCountLines($sListFile) < 1 Then
	MsgBox(16,"Ошибка!","Список процессов пустой!")
	Exit
EndIf

While 1
	If TimerDiff($hTimer)/1000 >= $iSleep Then _ProcessKill()
	Sleep(50)
WEnd

Func _ProcessKill()

	Local $aLine[1] = [0], $n, $iPE
	_FileReadToArray($sListFile,$aLine)

	If Not IsArray($aLine) Or $aLine[0] = 0 Then Exit(1)

	For $n = 1 To $aLine[0]
		Do
			$iPE = ProcessExists($aLine[$n])
			If $iPE Then ProcessClose($iPE)
		Until Not $iPE
	Next

	$hTimer = TimerInit()

EndFunc


Пример содержимого файла Process.txt
Код:
calc.exe
cmd.exe
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
SECTOR
Запустите 3 калькулятора.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Можно еще так попробовать:
Код:
#NoTrayIcon

Global $sListFile = @ScriptDir & "\Process.txt" ; Расположения списка процессов
Global $iSleep = 5 ; Время паузы в секундах
Global $hFile, $sText, $aProcessKill, $i, $j, $iEnd, $aListProcess, $hTimer

$hFile = FileOpen($sListFile)
$sText = FileRead($hFile)
FileClose($hFile)
$aProcessKill = StringRegExp($sText, '([а-яА-Яa-zA-Z0-9]{1,20}.exe)', 3)
If Not IsArray($aProcessKill) Then
	MsgBox(16, "Ошибка!", "Ошибка получения списка процессов.")
	Exit
EndIf
$iEnd = UBound($aProcessKill) - 1
$hTimer = TimerInit()
While 1
	If TimerDiff($hTimer) / 1000 >= $iSleep Then
		For $i = 0 To $iEnd
			If ProcessExists($aProcessKill[$i]) Then
				$aListProcess = ProcessList($aProcessKill[$i])
				For $j = 1 To $aListProcess[0][0]
					ProcessClose($aListProcess[$j][0])
				Next
			EndIf
		Next
		$hTimer = TimerInit()
	EndIf
	Sleep(50)
WEnd
Процессы в файле Process.txt должны быть отделены друг от друга любыми символами кроме букв и цифр (proc1.exe\proc2.exe,проц3.exe) и длина названия процесса (без .exe) не больше 20 букв(цифр).
 

SECTOR

Продвинутый
Сообщения
399
Репутация
59
[quote author=madmasles]Можно еще так попробовать[/quote]

Зато в моём примере, в файле Process.txt можно указать PID ;)

И ещё в вашем примере чтение списка происходит один раз, а у меня в цикле;
т.е. список можно изменять во время работы скрипта, в вашем же случае, скрипт придется перезапускать.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
SECTOR
т.е. список можно изменять во время работы скрипта
С этим частично согласен. Только при пользователе, которому Вы будете убивать процессы не надо этот список редактировать. :smile:
Зато в моём примере, в файле Process.txt можно указать PID
Интересно, какие PID`ы Вы будете в файле указывать? :rofl:
 

SECTOR

Продвинутый
Сообщения
399
Репутация
59
madmasles сказал(а):
Зато в моём примере, в файле Process.txt можно указать PID
Интересно, какие PID`ы Вы будете в файле указывать? :rofl:

Да это я так :laugh: на всякий случай :laugh: :idiot:

OffTopic:
Я думаю, автор темы сдесь больше не появится! :smile:
 
Автор
T

tarasov.evgeny

Новичок
Сообщения
13
Репутация
0
Всем привет. Спасибо за ответы. Вот мои потуги :smile:
Код:
#NoTrayIcon
#include <Array.au3>
#include <File.au3>
Global $aData
Global $sFilePath = 'c:\AdminSMSecr\Data\BlockProcess.txt'
_FileReadToArray ($sFilePath, $aData)
Dim $aData
While 1
	For $temp in $aData
	If ProcessExists($temp) Then ProcessClose ($temp)
	Next
Sleep (30000)
WEnd


Далее этот exe файл устанавливался как служба
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
tarasov.evgeny
1. В вашем варианте будет закрываться только один найденный процесс. Смотрите наши ответы выше.
2. Если Вы ошибетесь и случайно в файле BlockProcess.txt, например, напечатаете пробел, то этот процесс закрываться не будет.
3. ИМХО, не лучший вариант хранить список убиваемых процессов на компьютере пользователя, у которого их будете убивать. На мой взгляд их лучше объявить прямо в скрипте, а при необходимости, добавить новые и скомпилировать новый exe-шник.
 
Автор
T

tarasov.evgeny

Новичок
Сообщения
13
Репутация
0
Вот вроде закрывает все процессы
Код:
#NoTrayIcon
#include <Array.au3>
#include <File.au3>
Global $aData
Global $sFilePath = 'c:\AdminSMSecr\Data\BlockProcess.txt'
_FileReadToArray ($sFilePath, $aData)
Dim $aData
While 1
	For $temp in $aData
	while ProcessExists($temp) 
		ProcessClose ($temp)
	WEnd
	Next
Sleep (30000)
WEnd
 
Верх