Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » как убить дерево процессов ?

Ответить
Настройки темы
как убить дерево процессов ?

Старожил


Сообщения: 440
Благодарности: 12

Профиль | Отправить PM | Цитировать


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

Код: Выделить весь код
While FileExists(@ScriptDir & '\settings.ini')
	; MsgBox(4096, 'pause',$Wait )
	Sleep($Wait)
Wend

MsgBox(4096, "END" ,'')
Run(@ComSpec & " /c " &'taskkill /t /f /PID ' & $exe,'','')
MsgBox(4096, "END" ,'')
ProcessClose($exe) в свою очередь всегда работает нормально , но он не убивает все дерево.

Отправлено: 20:29, 12-02-2012

 

Аватара для Creat0R

Must AutoIt


Сообщения: 3054
Благодарности: 1009

Профиль | Сайт | Отправить PM | Цитировать


Что содержится в переменной $exe?

Цитата mitiya:
ProcessClose($exe) в свою очередь всегда работает нормально , но он не убивает все дерево. »
Вот функция для убийства дерева процесса:

Код: Выделить весь код
_ProcessCloseTree("Test.exe")

Func _ProcessCloseTree($iPID)
    If IsString($iPID) Then
        $iPID = ProcessExists($iPID)
    EndIf

    If Not $iPID Then
        Return SetError(-1, 0, $iPID)
    EndIf

    Local Const $TH32CS_SNAPPROCESS = 0x00000002

    Local $a_tool_help = DllCall("Kernel32.dll", "long", "CreateToolhelp32Snapshot", "int", $TH32CS_SNAPPROCESS, "int", 0)

    If Not IsArray($a_tool_help) Or $a_tool_help[0] = -1 Then
        Return SetError(1, 0, $iPID)
    EndIf

    Local $tagPROCESSENTRY32 = _
        DllStructCreate( _
            "dword dwsize;" & _
            "dword cntUsage;" & _
            "dword th32ProcessID;" & _
            "uint th32DefaultHeapID;" & _
            "dword th32ModuleID;" & _
            "dword cntThreads;" & _
            "dword th32ParentProcessID;" & _
            "long pcPriClassBase;" & _
            "dword dwFlags;" & _
            "char szExeFile[260]")

    DllStructSetData($tagPROCESSENTRY32, 1, DllStructGetSize($tagPROCESSENTRY32))

    Local $p_PROCESSENTRY32 = DllStructGetPtr($tagPROCESSENTRY32)
    Local $a_pfirst = DllCall("Kernel32.dll", "int", "Process32First", "long", $a_tool_help[0], "ptr", $p_PROCESSENTRY32)

    If Not IsArray($a_pfirst) Then
        Return SetError(2, 0, $iPID)
    EndIf

    Local $a_pnext, $i_child_pid, $i_parent_pid
    $i_child_pid = DllStructGetData($tagPROCESSENTRY32, "th32ProcessID")

    If $i_child_pid <> $iPID Then
        $i_parent_pid = DllStructGetData($tagPROCESSENTRY32, "th32ParentProcessID")

        If $i_parent_pid = $iPID Then
            _ProcessCloseTree($i_child_pid)

            If @error <> 0 Then
                ProcessClose($i_child_pid)
            EndIf
        EndIf
    EndIf

    While 1
        $a_pnext = DllCall("Kernel32.dll", "int", "Process32Next", "long", $a_tool_help[0], "ptr", $p_PROCESSENTRY32)

        If IsArray($a_pnext) And $a_pnext[0] = 0 Then
            ExitLoop
        EndIf

        $i_child_pid = DllStructGetData($tagPROCESSENTRY32, "th32ProcessID")

        If $i_child_pid <> $iPID Then
            $i_parent_pid = DllStructGetData($tagPROCESSENTRY32, "th32ParentProcessID")

            If $i_parent_pid = $iPID Then
                _ProcessCloseTree($i_child_pid)

                If @error <> 0 Then
                    ProcessClose($i_child_pid)
                EndIf
            EndIf
        EndIf
    WEnd

    DllCall("Kernel32.dll", "int", "CloseHandle", "long", $a_tool_help[0])

    Return 1
EndFunc

-------
“Сделай так просто, как возможно, но не проще этого.”... “Ты никогда не решишь проблему, если будешь думать так же, как те, кто её создал.”

Альберт Эйнштейн

P.S «Не оказываю техподдержку через ПМ/ICQ, и по email - для этого есть форум. ©»

http://creator-lab.ucoz.ru/Images/Icons/autoit_icon.png Русское сообщество AutoIt | http://creator-lab.ucoz.ru/Images/Ic...eator_icon.png CreatoR's Lab | http://creator-lab.ucoz.ru/Images/Icons/oac_icon.png Opera AC Community


Отправлено: 23:42, 12-02-2012 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Старожил


Сообщения: 440
Благодарности: 12

Профиль | Отправить PM | Цитировать


что-то не работает. (по крайней мере на win7 64) , но мне в любом случае надо бы чтоб везде работало.

Отправлено: 13:59, 13-02-2012 | #3


Старожил


Сообщения: 440
Благодарности: 12

Профиль | Отправить PM | Цитировать


подумал что в моем случае логичней убивать не дерево, а просто процессы путь в которым ведет на флэшку.
для получения буквы диска я хотел использовать примерно следующий код, только в цикле.

Дак вот он работает только с теми приложениями у которых удается корректно получить путь. Путь к explorer.exe почему-то выдается как А , и в той части где происходит выделение из пути диска происходит ошибка.

Мне надо как-то отфильтровать неподходящие значения перед передачей в _PathSplitByRegExp , но в случае вообще пустых значений пути у меня не получилось.

Код: Выделить весь код
#include <File.au3>
#include <Array.au3>
#include <GUIListView.au3>

Local $PID = ProcessExists("explorer.exe")

MsgBox(0, '', '-' & $PID & '-')

Local $path = _ProcessGetLocation($PID)

MsgBox(0, '1$path', '|' & $path & '|')

MsgBox(0, '', VarGetType($path))

MsgBox(0, '2', $path)

Local $drive = _PathSplitByRegExp($path)

MsgBox(0, '2', $drive[1])




;===============================================================================
; Function Name:    _PathSplitByRegExp()
; Description:      Split the path to 8 elements.
; Parameter(s):     $sPath - Path to split.
; Requirement(s):  
; Return Value(s):  On seccess - Array $aRetArray that contain 8 elements:
;                   $aRetArray[0] = Full path ($sPath)
;                   $aRetArray[1] = Drive letter
;                   $aRetArray[2] = Path without FileName and extension
;                   $aRetArray[3] = Full path without File Extension
;                   $aRetArray[4] = Full path without drive letter
;                   $aRetArray[5] = FileName and extension
;                   $aRetArray[6] = Just Filename
;                   $aRetArray[7] = Just Extension of a file
;
;                   On failure - If $sPath not include correct path (the path is not splitable),
;                   then $sPath returned.
;                   If $sPath not include needed delimiters, or it's emty,
;                   then @error set to 1, and returned -1.
;
; Note(s):          The path can include backslash as well (exmp: C:/test/test.zip).
;
; Author(s):        G.Sandler a.k.a CreatoR (MsCreatoR) - Thanks to amel27 for help with RegExp
;===============================================================================
Func _PathSplitByRegExp($sPath)
    If $sPath = "" Or (StringInStr($sPath, "\") And StringInStr($sPath, "/")) Then Return SetError(1, 0, -1)
   
    Local $aRetArray[8], $pDelim = ""
   
    If StringRegExp($sPath, '^(?i)([A-Z]:|\\)(\\[^\\]+)+$') Then $pDelim = "\"
    If StringRegExp($sPath, '(?i)(^.*:/)(/[^/]+)+$') Then $pDelim = "//"
   
    If $pDelim = "" Then $pDelim = "/"
    If Not StringInStr($sPath, $pDelim) Then Return $sPath
    If $pDelim = "\" Then $pDelim &= "\"
   
    $aRetArray[0] = $sPath ;Full path
    $aRetArray[1] = StringRegExpReplace($sPath,  $pDelim & '.*', $pDelim) ;Drive letter
    $aRetArray[2] = StringRegExpReplace($sPath, $pDelim & '[^' & $pDelim & ']*$', '') ;Path without FileName and extension
    $aRetArray[3] = StringRegExpReplace($sPath, '\.[^.]*$', '') ;Full path without File Extension
    $aRetArray[4] = StringRegExpReplace($sPath, '(?i)([A-Z]:' & $pDelim & ')', '') ;Full path without drive letter
    $aRetArray[5] = StringRegExpReplace($sPath, '^.*' & $pDelim, '') ;FileName and extension
    $aRetArray[6] = StringRegExpReplace($sPath, '.*' & $pDelim & '|\.[^.]*$', '') ;Just Filename
    $aRetArray[7] = StringRegExpReplace($sPath, '^.*\.', '') ;Just Extension of a file
   
    Return $aRetArray
EndFunc


Func _ProcessGetLocation($iPID)
     Local $aProc = DllCall('kernel32.dll', 'hwnd', 'OpenProcess', 'int', BitOR(0x0400, 0x0010), 'int', 0, 'int', $iPID)
     If $aProc[0] = 0 Then Return SetError(1, 0, '')
     Local $vStruct = DllStructCreate('int[1024]')
     DllCall('psapi.dll', 'int', 'EnumProcessModules', 'hwnd', $aProc[0], 'ptr', DllStructGetPtr($vStruct), 'int', DllStructGetSize($vStruct), 'int_ptr', 0)
     Local $aReturn = DllCall('psapi.dll', 'int', 'GetModuleFileNameEx', 'hwnd', $aProc[0], 'int', DllStructGetData($vStruct, 1), 'str', '', 'int', 2048)
     If StringLen($aReturn[3]) = 0 Then Return SetError(2, 0, '')
     Return $aReturn[3]
EndFunc

Отправлено: 01:33, 24-02-2012 | #4



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » как убить дерево процессов ?

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
VBS/WSH/JS - [решено] Открыть привод, корректно убить процесс, закрыть привод и снова убить процесс - как? Nun-Nun Скриптовые языки администрирования Windows 8 31-10-2011 15:25
Вирус,связанный с Брандмауэром windows -как такое может быть,и как его убить? illusionmgs Лечение систем от вредоносных программ 2 28-10-2008 14:02
[решено] как в PHP удалить сразу целое дерево папок? Vlad Drakula Вебмастеру 2 24-06-2006 13:57
Как убить IE serega100 Хочу все знать 13 27-11-2004 22:18
Как убить LILO? Himera Общий по Linux 12 20-11-2002 20:25




 
Переход