Что нового

Проблема с добавлением и поиском в массивах.

La2Angel

Новичок
Сообщения
156
Репутация
1
Сколько искал, но так и не смог сообразить...
Мне нужно завершать процессы, не восшедшие в файл proc.txt
Примеры видел в добавлением и созданием массивов, но когда делаю читать массив с файла, он все равно закрывает все процессы за подряд.... а нужно оставлять те, которые есть в файле.

Код:
#include <Array.au3>
#include <file.au3>

$myproc = ProcessList()



Dim $aRecords
If Not _FileReadToArray("proc.txt",$aRecords) Then
   MsgBox(4096,"Error", " Error reading log to Array     error:" & @error)
   Exit
EndIf



For $i =0 To UBound($aRecords[0])-1
  Do
  $iIndex = _ArraySearch($myproc,$aRecords[$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
 
Автор
L

La2Angel

Новичок
Сообщения
156
Репутация
1
Выше приведенный пример и взят от туда, просто я не могу вместо готового списка, сделать чтение из файла список.
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
La2Angel

Код:
$list=StringStripCR(FileRead(@ScriptDir&'\list.txt'))
$list = '|'&StringReplace($list, @LF, '|')&'|'
; $list='|'&StringRegExpReplace($list, '[\n]+','|')&'|'

$myproc = ProcessList()
For $i = 1 to $myproc[0][0]
	If Not StringInStr($list, '|'&$myproc[$i][0]&'|') Then ProcessClose($myproc[$i][0])
Next

; Создаём список процессов
; $myproc = ProcessList()
; $List=''
; For $i = 1 to $myproc[0][0]
	; $List&=$myproc[$i][0]&@CRLF
; Next

; $file = FileOpen(@ScriptDir&'\list.txt',2)
; FileWrite($file, $List)
; FileClose($file)
 
Автор
L

La2Angel

Новичок
Сообщения
156
Репутация
1
Пожалуйста, а можно по подробнее пример, рабочий... Буду очень признателен.
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
1-ая строка- читается файл и удаляются символы @CR
2-ая строка - символы @LF заменяются на '|' с добавлением по краям '|', получется текст типа "|start1.exe|start2.exe|"
Далее в цикле проверяем наличие "|start2.exe|" в списке "|start1.exe|start2.exe|", если находится, то закрываем этот процесс.

Снизу закоментированные строки для создания списка. Сначала создаём список, потом запускаем любые программы и скрипт закрывает только новые процессы.

PS: пример рабочий
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
La2Angel
Может интересен будет мой полный вариант:

Код:
#include <Array.au3>
$help='Поддерживаются ключи:'&@CRLF&'/g - получить список текущих процессов в файл'&@CRLF&'Полный путь или файл списка, который необходимо использовать'
If $CmdLine[0]>0 Then
	Switch $CmdLine[1]
		Case '/g'
			_CreateList()
		Case Else
			If FileExists($CmdLine[1]) Then
				_KillExcept($CmdLine[1])
			Else
				MsgBox(0, 'Сообщение', $help)
			EndIf
	EndSwitch
Else
	_KillExcept(@ScriptDir&'\ProcessList.txt')
EndIf

Func _KillExcept($PathList)
	Local $i, $list, $ProcessList
	If Not FileExists($PathList) Then
		If MsgBox(4+262144, 'Ошибка', 'Отсутствует файл-список.'&@CRLF&@CRLF&$help&@CRLF&@CRLF&'Желаете сейчас создать список текущих процессов?')=6 Then _CreateList()
		Exit
	EndIf
	$list=StringStripCR(FileRead($PathList))
	$list = '|'&StringReplace($list, @LF, '|')&'|'
	; $list='|'&StringRegExpReplace($list, '[\n]+','|')&'|'

	$ProcessList = ProcessList()
	For $i = 1 to $ProcessList[0][0]
		; If @AutoItPID=$ProcessList[$i][1] Then ContinueLoop
		If Not StringInStr($list, '|'&$ProcessList[$i][0]&'|') Then ProcessClose($ProcessList[$i][0])
	Next
EndFunc

Func _CreateList()
	Local $file, $i, $List, $Path, $ProcessList
	; Создаём список текущих процессов
	$ProcessList = ProcessList()
	$ProcessList=_ArrayUnique($ProcessList, 1, 1)
	_ArraySort($ProcessList, 0, 1)
	$List=''
	For $i = 1 to $ProcessList[0]
		$List&=$ProcessList[$i]&@CRLF
	Next
	$Path=_Path(@ScriptDir&'\ProcessList.txt')

	$file = FileOpen($Path, 2)
	FileWrite($file, StringTrimRight($List, 2))
	FileClose($file)
EndFunc

Func _Path($Path)
	Local $j, $Name, $NameE, $PathR, $Tmp, $Type
	If FileExists($Path) Then
		$NameE = StringTrimLeft($Path, StringInStr($Path, '\', 0, -1))
		$PathR = StringLeft($Path, StringInStr($Path, '\', 0, -1))
		If StringInStr($NameE, '.') Then
			$Tmp=StringInStr($NameE, '.', 0, -1)-1
			$Type = StringTrimLeft($NameE, $Tmp) ; получить расширение файла
			$Name = StringLeft($NameE, $Tmp) ; получить имя файла без расширения
		Else
			$Type = ''
			$Name = $NameE
		EndIf
		; цикл проверки одноимённых файлов
		$j = 0
		Do
			$j+=1
			If $j = 1 Then
				$Path=$PathR&$Name& ' Копия' & $Type
			Else
				$Path=$PathR&$Name & ' Копия (' & $j & ')' & $Type
			EndIf
		Until Not FileExists($Path)
	EndIf
	Return $Path
EndFunc


По умолчанию также закрывает лишние процессы (имя сменил на ProcessList.txt), а указав ключ /g можно получить список (для редактирования) или указав как ключ путь или файл иного списка выполняем иной вариант закрытия процессов.
 
Верх