Что нового

[Процессы] Корректное закрытие по PID

zergood

Новичок
Сообщения
24
Репутация
1
Как вот правильно закрыть оное?
Код:
$close = Run('cmd /c ping -t 127.0.0.1 >log.txt')
Sleep(3000)
ProcessClose($close)

Оно не закроется ибо лог ведет cmd а пинг другой процесс.
Пробовал так же заранее создать батник. К примеру батник с содержимым
'cmd /c ping -t 127.0.0.1 >log.txt' назовем его 1234.bat
Код:
$close = ShellExecute('1234.bat')
Sleep(3000)
ProcessClose($close)

Таким способом тоже не закроется.
Как быть? (только не предлагайте убить процесс ping.exe и т.п. ибо убьется всё, в т.ч. и то, что было запущенно позднее, к примеру)
 

sngr

AutoIT Гуру
Сообщения
1,010
Репутация
408
Код:
#include 'encoding.au3'
$s_Read = ''
$i_PID = Run('ping 127.0.0.1', '', @SW_HIDE, 6)
$tim=TimerInit()
While 1
	$s_Read &= StdoutRead($i_PID)
	If @error Then ExitLoop
	Select
		Case TimerDiff($tim)>2000
			ProcessClose($i_PID)
			ExitLoop
	EndSelect
	Sleep(1)
WEnd
MsgBox(32,'',_Encoding_OEM2ANSI($s_Read))
 
Автор
Z

zergood

Новичок
Сообщения
24
Репутация
1
@sngr,
Это не то, что мне надо было.
К тому же, с других окон не считывается. Нужно было именно >log.txt
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
zergood,
ИМХО, по PID @ComSpec можно найти все его дочерние процессы (функция _WinAPI_EnumChildProcess()) и закрыть их, а потом закрыть PID.
 

CreatoR

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

Код:
#include <WinAPIProc.au3>

_ProcessCloseTree(ProcessExists('MyProcess.exe'))

Func _ProcessCloseTree($iPID)
	If Not ProcessExists($iPID) Then
		Return SetError(1, 0, 0)
	EndIf
	
	Local $aChilds = _WinAPI_EnumChildProcess($iPID)
	
	If Not @error Then
		For $i = 1 To $aChilds[0][0]
			ProcessClose($aChilds[$i][0])
		Next
	EndIf
	
	Return ProcessClose($iPID)
EndFunc
 

DyadyaGenya

Знающий
Сообщения
300
Репутация
10
Я обычно для такого использую вот это
Около недели назад появился процесс, который не могу прибить пока ни одним способом. Процесс вроде как дублирует рабочую программу, но нигде, кроме списка процессов его найти не могу. После закрытия программы он продолжает висеть. Ваш вариант также не убивает его. Если пишу:
Код:
$pid = ProcessExists('proga.exe')
ConsoleWrite($pid)
ProcessClose($pid)

Тоже не помогает, хотя правильно определяет pid. 4 раза подряд ProcessClose("proga.exe")тоже не помогает.
Вот такой цикл вешает скрипт:
Код:
While ProcessExists("proga.exe")
    ProcessClose("proga.exe")
WEnd

Вот таким образом путь не виден
Код:
Local $iID = ProcessExists('proga.exe')
If $iID Then
    ConsoleWrite('path  ' & _WinAPI_GetProcessFileName($iID) & @CRLF)
 EndIf

Диспетчер задач его не видит. Проверял програмкой ProcessExplorer, она его видит, но показывает, что путь не найден ([Присоединенное к системе устройство не работает.]). Прибивать этой прогой пока не хочу. Хочу найти способ убить "автоматом" для будущего.
 

DyadyaGenya

Знающий
Сообщения
300
Репутация
10
Что за процесс такой? Возможно это сервис?
Нет, не сервис. Одна из рабочих программ. По крайней мере называется так же. Неделю назад обновляли без меня. Приезжали разработчики. Заметил не сразу, под конец дежурства. Работе вроде бы не мешает, но вот для скрипта на autoit, что я написал для уточнения/изменения отчетов, которые делает программа разрабов пришлось дописывать закрытие процесса основных разрабовских отчетов. Окошко закрывается. Закрывается один процес, а второй с таким же именем продолжает висеть. Знаю, что раньше не было, потому что сам отлавливал раньше для кода закрытия. И вот сколько висит в списке процессов, столько не меняется pid. Можно конечно перегрузить комп или попробовать убить с помощью ProcessExplorer, но это не выход. Вдруг в будущем опять такое вылезет.
 
Последнее редактирование:

DyadyaGenya

Знающий
Сообщения
300
Репутация
10
#RequireAdmin использовали?
Вот такие строки показывают, что я с админправами. Хотя я это и так знал )
Код:
#include <MsgBoxConstants.au3>
#RequireAdmin
If IsAdmin() Then MsgBox($MB_SYSTEMMODAL, "", "The script is running with admin rights.")

Как по другому использовать не знаю.
 

xXx

╚{■_■}╗
Меценат
Сообщения
248
Репутация
95
Как вариант:
Попробуйте так:
Код:
#RequireAdmin
$iPID = 1234
Run('taskkill.exe /F /PID ' & $iPID & ' /T', '', @SW_HIDE)
Или так:
Код:
#include <ProcessConstants.au3>
#include <WinAPIProc.au3>

$iPID = 1234
$bRet = _WinAPI_TerminateProcess(_WinAPI_OpenProcess($PROCESS_TERMINATE, 0, $iPID, True))
MsgBox(262144, Default, $bRet)
... хотя это вроде как противоречит данной теме.
 
Последнее редактирование:

DyadyaGenya

Знающий
Сообщения
300
Репутация
10
К сожалению ни один вариант не помог. Второй пишет 0 процессов
Сообщение автоматически объединено:

Что за процесс такой? Возможно это сервис?
Нашел одноименное оборудование, которого раньше не было. На скрине. В самом диспетчере устройств такого нет. Нет лишних дисковых устройств, сетевых и вообще ничего лишнего.
 

Вложения

  • Скриншот 23-12-2020 21.14.39-2.jpg
    Скриншот 23-12-2020 21.14.39-2.jpg
    54.2 КБ · Просмотры: 8
Последнее редактирование:

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
 
Верх