Prozesse aus INI in einer MsgBox auflisten

  • Hallo,

    ich möchte verhindern das mein Script startet wenn Prozesse laufen die in einer INI hinterlegt wurden.

    z.B. INI

    Spoiler anzeigen
    Code
    [prozesse]
    notepad.exe=Notepad
    calc.exe=Rechner
    mspaint.exe=Paint
    ;können auch mehr als 3 sein

    Wie kann ich es überreden, dass er mir die laufenden Prozesse in einer MsgBox wiedergibt? Habe das hier bisher zusammen gebastelt...

    Spoiler anzeigen
    [autoit]


    Global $ini = @ScriptDir & "\prozesse.ini"
    Global $aToCheck = IniReadSection($ini,"prozesse")

    [/autoit] [autoit][/autoit] [autoit]

    For $i = 1 to $aToCheck[0][0]
    if ProcessExists($aToCheck[$i][0]) Then
    $tmp = MsgBox(64+1,"Info","Folgende Eintraege verhindern den Programmstart " & @CRLF & @CRLF & $aToCheck[$i][1] & @CRLF & @CRLF & "Mit OK alle Prozesse schliessen und Programm starten" & @CRLF & "Mit ABBRECHEN spaeter erneut versuchen")
    Switch $tmp
    Case 1 ; OK
    ProcessClose($aToCheck[$i][0])
    Case 2 ; CANCEL
    Exit
    EndSwitch
    EndIf
    Next

    [/autoit]


    ...da wird aber für jeden Prozess eine MsgBox angezeigtund ggf. geschlossen. Denke mal MsgBox und Switch müssten dann raus aus der Schleife, aber wie kann man das Ergebnis der Schleife "zwischenspeichern" um es in der MsgBox wiederzugeben? Geht sowas überhaupt? Danke schonmal im Voraus!

  • Spoiler anzeigen
    [autoit]


    Global $ini = @ScriptDir & "\prozesse.ini"
    Global $aToCheck = IniReadSection($ini, "prozesse")
    Global $aProcesses[1] = [0]
    Global $sBlockingProcesses = ""

    [/autoit] [autoit][/autoit] [autoit]

    If IsArray($aToCheck) = 1 Then
    For $i = 1 To $aToCheck[0][0]
    If ProcessExists($aToCheck[$i][0]) Then
    $aProcesses[0] += 1 ; Anzahl der laufenden Prozesse erhöhen
    ReDim $aProcesses[$aProcesses[0] + 1] ; Array entsprechend um eins vergrößern
    $aProcesses[$aProcesses[0]] = $aToCheck[$i][0] ; Name des aktuell getesteten Prozesses hinzufügen
    EndIf
    Next
    If $aProcesses[0] <> 0 Then ; Wenn ein oder mehrere Prozesse blocken
    For $i = 1 To $aProcesses[0] ; Alle Prozesse in einen String mit Leerzeilen-Trennung schreiben
    $sBlockingProcesses &= $aProcesses[$i] & @CRLF
    Next
    $tmp = MsgBox(64 + 1, "Info", "Folgende Eintraege verhindern den Programmstart:" & @CRLF & @CRLF & $sBlockingProcesses & @CRLF & "Mit OK alle Prozesse schliessen und Programm starten" & @CRLF & "Mit ABBRECHEN spaeter erneut")
    Switch $tmp
    Case 1 ; OK
    For $i = 1 To $aProcesses[0] ; Blockende Prozesse schließen.
    ProcessClose($aProcesses[$i])
    Next
    Case 2 ; CANCEL
    Exit
    EndSwitch
    EndIf
    Else
    MsgBox(64, "Error", 'Keine "prozesse.ini" vorhanden.')
    EndIf

    [/autoit]

    So, das ganze habe ich grade per Handy getippt, also ist es sicher nicht perfekt und es können Fehler drin sein (vor allem von der Formatierung her) vom Prinzip her habe ich es dir aber mal so aufgebaut, wie ich es lösen würde ;)

    Und jetzt gute Nacht, liebe AutoIt'ler ;)
    Joriktos

    Edit: Hab's jetzt mit dem PC nochmal überarbeitet => So läuft es.

    Da es hier doch einige falsch machen:

    Zitat von einem User dieses Forums

    Die Standard-Standart eines Flamingos ist einbeinig. ;)

    Einmal editiert, zuletzt von Joriktos (17. Februar 2013 um 12:07)

  • Vielleicht helft dir das:
    Alle Prozesse:

    Spoiler anzeigen
    [autoit]

    $list = ProcessList() for $i = 1 to $list[0][0]

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    msgbox(0, $list[$i][0], $list[$i][1])

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    next

    [/autoit]

    Falls du es mit aktiven Fenstern machen willst dann ersetze ProcessList -> WindowList
    Du kannt auch in der Klammer einzelne Prozesse schreiben.

    Einmal editiert, zuletzt von butter (17. Februar 2013 um 18:59)

  • Wie genau meinst du das mit es beendet die Prozesse nicht?
    Also bei mir hat es einwandfrei funktioniert :) (Habe es mit calc.exe und Paint probiert)

    Edit: Theoretisch kannst du's auch mal mit ProcessKill() statt ProcessClose() probieren, was aber nicht immer 'gesund' ist ;)

    Da es hier doch einige falsch machen:

    Zitat von einem User dieses Forums

    Die Standard-Standart eines Flamingos ist einbeinig. ;)

  • Sry, hatte es geändert, damit es Notepad und nicht notepad.exe anzeigt...

    Spoiler anzeigen
    [autoit]


    ...
    $aProcesses[$aProcesses[0]] = $aToCheck[$i][1] ; Name des aktuell getesteten Prozesses hinzufügen
    ;^ hatte ich von 0 auf 1 gesetzt
    ...

    [/autoit]


    Was es nicht macht, alle Prozesse mit dem gleiche Namen zu schliessen - z.B. wenn notepad.exe 3x am laufen ist, wird es nur 1x geschlossen.

  • Okay, dann schreib' ich dir des heute Mittag um ;)

    Da es hier doch einige falsch machen:

    Zitat von einem User dieses Forums

    Die Standard-Standart eines Flamingos ist einbeinig. ;)

  • Hab im Internet mal gesucht wie man mit AutoIT noch alle Prozesse schliessen kann und bin auf den Taskkill gestossen. Funktionieren tut es, aber was meint Ihr dazu ?( Haben ältere und neuere BS als Win7 auch die Taskkill-Funktion?

    Spoiler anzeigen
    [autoit]


    ...
    For $i = 1 To $aProcesses[0] ; Blockende Prozesse schließen.
    RunWait(@ComSpec & " /c taskkill /f /im " & $aProcesses[$i], @SystemDir, @SW_HIDE)
    Next
    ...

    [/autoit]


    Wie dieme Namen anstatt namen.exe angezeigt werden hab ich auch noch nicht so recht rausbekommen :(

  • Sorry, hatte voll vergessen, das ganze fertig zu machen... :/
    Probier es mal so ;)

    [autoit]


    For $i = 1 To $aProcesses[0] ; Blockende Prozesse schließen
    $Instances = ProcessList($aProcesses[$i]) ; Einige Infos zum Prozess mit dem angegebenen Namen
    While $Instances[0][0] <> 0 ; Solange bis alle Instanzen geschlossen sind (Anzahl der Prozesse mit dem Namen <> 0
    ProcessClose($aProcesses[$i])
    $Instances = ProcessList($aProcesses[$i]) ; Neue Anzahl auslesen
    WEnd
    Next

    [/autoit]

    Leider wieder mit dem Handy, was heißt => keine Formatierung, nicht getestet.

    Edit: Habe es nun mit dem PC neu formatiert ;)

    Da es hier doch einige falsch machen:

    Zitat von einem User dieses Forums

    Die Standard-Standart eines Flamingos ist einbeinig. ;)

    Einmal editiert, zuletzt von Joriktos (24. Februar 2013 um 11:38)

  • Schöne, das Lüppt... :thumbup: Hatte es auch schon mit ner While Schleife probiert, die war etwas kürzer und funktionierte nicht :rofl:

    [autoit]


    ...
    For $i = 1 To $aProcesses[0] ; Blockende Prozesse schließen.
    While ProcessExists($aProcesses[$i])
    ProcessClose($aProcesses[$i])
    WEnd
    Next
    ...

    [/autoit]