Prozesslisten (Arrays) vergleichen

  • Hallo,
    ich habe ein Problem mit dem Vergleich von zwei Prozesslisten als Arrays die vom der Funktion ProcessList() erstellt wurde. Ich brauche eigentlich nur eine Liste der hinzugekommenen bzw. entfernten Processe. Also den Unterschied zwischen den zwei Arrays.

    Gruß Ingo

  • Na zwei Arrays vergleichen ist glaube ich nicht so einfach. Ich müsste ja im ersten Schritt $aStart mit $aEnd vergleichen und dann $aEnd und $aStart.

    Ich hatte auch schon überlegt ob es eventuell besser ist die Arrays in Text zu konvertieren und dann nach Unterschieden zu suchen.

    Aber eventuell hat ja jemand bereits dafür eine Lösung gefunden bzw. erstellt. ;)

    Gruß Ingo

  • Brauchst 3 Schritte:
    1. Verbinde beide Arrays (a und b) zu einem Array (c1) mit allen Einträgen
    2. Benutze ArrayUnique bei Array (c1)
    2.1 Kopiere (c1) in (c2)
    3. Lösche alle Einträge aus Array (c1) die in Array (a) vorkommen -> (c1) = Liste 1
    3. Lösche alle Einträge aus Array (c2) die in Array (b) vorkommen -> (c2) = Liste 2
    (nimm am Besten PIDs damit es keine Namenskonflikte gibt)

  • oder ganz einfach mit einer verschachtelten For Schleife:

    [autoit]


    for $i = ubound($a)-1 to 0 Step -1
    for $ii = ubound($b)-1 to 0 Step -1
    if $a[$i] = $b[$ii] then
    _ArrayDelete($a,$ii)
    _ArrayDelete($b,$i)
    endif
    next
    next

    [/autoit]

    komplettes Bsp:

    Spoiler anzeigen
    [autoit]


    #include <Array.au3>

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

    Local $Array1[10]
    $Array1[0] = "JPM"
    $Array1[1] = "Holger"
    $Array1[2] = "Jon"
    $Array1[3] = "Larry"
    $Array1[4] = "Jeremy"
    $Array1[5] = "Valik"
    $Array1[6] = "Cyberslug"
    $Array1[7] = "Nutster"
    $Array1[8] = "JdeB"
    $Array1[9] = "Samba"

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

    Local $Array2[11]
    $Array2[0] = "JPM"
    $Array2[1] = "Yoga"
    $Array2[2] = "Jon"
    $Array2[3] = "Darth Vader"
    $Array2[4] = "Jeremy"
    $Array2[5] = "Valik"
    $Array2[6] = "Luke"
    $Array2[7] = "Nutster"
    $Array2[8] = "JdeB"
    $Array2[9] = "Tylo"
    $Array2[10] = "adsfasdf"

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

    if UBound($Array1)-1 > UBound($Array2)-1 then
    $a = $Array1
    $b = $Array2
    Else
    $b = $Array1
    $a = $Array2
    endif

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

    for $i = ubound($a)-1 to 0 Step -1
    for $ii = ubound($b)-1 to 0 Step -1
    if $a[$i] = $b[$ii] then
    _ArrayDelete($a,$ii)
    _ArrayDelete($b,$i)
    endif
    next
    next

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

    _ArrayDisplay($a)
    _ArrayDisplay($b)

    [/autoit]
  • Hallo vielen Dank für die Hinweise! Ich habe da mal etwas zusammengebaut. Aber leider scheitere ich schon daran, dass _ArrayUnique leider ein 1-dimensionales Array zurück gibt.

    Hat da jemand eine Idee?

    Gruß Ingo

    Spoiler anzeigen

    #include <Array.au3>

    Global $aListProcessStart
    Global $aListProcessEnd

    $aListProcessStart = ProcessList()
    Run(@WindowsDir & "\Notepad.exe", "", @SW_MAXIMIZE)
    $aListProcessEnd = ProcessList()

    _ArrayCompare2D($aListProcessStart, $aListProcessEnd, 1)

    Func _ArrayCompare2D(ByRef $aArrayA, ByRef $aArrayB, $iStartIndex=0)
    ;==================================================================================================
    ; Function Name: _ArrayCompare2D(ByRef $aArrayA, ByRef $aArrayB, $iStartIndex=0)
    ; Description:: Vergleich von 2 2D Arrays
    ; Parameter(s): $aArrayA das erste 2D Array
    ; $aArrayB das zweite 2D Array
    ; $iStartIndex Index ab dem der Vergleich begonnen werden soll
    ; Return Value(s): Erfolg 2D-Array mit den Unterschieden
    ; Fehler -1
    ; Note:
    ; Author(s): Donsen64
    ;==================================================================================================
    Local $aArrayAB
    Local $iArraysCols

    ;Beide Arrays zusammenführen
    $aArrayAB = $aArrayA
    $iArraysCols = UBound($aArrayB, 2)
    For $i=$iStartIndex To UBound($aArrayB)-1
    ReDim $aArrayAB[UBound($aArrayAB)+1][$iArraysCols]
    For $x=0 To $iArraysCols-1
    $aArrayAB[UBound($aArrayAB)-1][$x] = $aArrayB[$i][$x]
    Next
    Next
    $aArrayAB = _ArrayUnique($aArrayAB)

    _ArrayDisplay($aArrayA, "$aArrayA")
    _ArrayDisplay($aArrayB, "$aArrayB")
    _ArrayDisplay($aArrayAB, "$aArrayAB")

    EndFunc

  • Die verschachtelte For Methode müsste genau das gleiche Ergebnis liefern (und ist dabei mindestens 50x schneller).
    Da ArrayDelete auch 2D Arrays verdaut kann man ohne Probleme auch 2D Arrays benutzen (im Vergleich dann aber ein [0] oder ein [1] dranhängen, je nachdem ob du PID oder Name vergleichen willst)

  • Hallo,
    das hast du recht. Allerdings kommt es zu Problemen wenn ich zwischendurch etwas zu mache. ;)

    [autoit]

    #include <Array.au3>

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

    Global $aListProcessStart
    Global $aListProcessEnd

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

    $aListProcessStart = ProcessList()
    MsgBox(1, "Etwas starten/stoppen", "Bitte etwas Starten oder Stoppen")
    Run(@WindowsDir & "\Notepad.exe", "", @SW_MAXIMIZE)
    $aListProcessEnd = ProcessList()

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

    _ArrayCompare2D($aListProcessStart, $aListProcessEnd, 1)

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

    Func _ArrayCompare2D(ByRef $aArrayA, ByRef $aArrayB, $iStartIndex=0)
    ;==================================================================================================
    ; Function Name: _ArrayCompare2D(ByRef $aArrayA, ByRef $aArrayB, $iStartIndex=0)
    ; Description:: Vergleich von 2 2D Arrays
    ; Parameter(s): $aArrayA das erste 2D Array
    ; $aArrayB das zweite 2D Array
    ; $iStartIndex Index ab dem der Vergleich begonnen werden soll
    ; Return Value(s): Erfolg 2D-Array mit den Unterschieden
    ; Fehler -1
    ; Note:
    ; Author(s): Donsen64
    ;==================================================================================================
    Local $a
    Local $b

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

    if UBound($aArrayA)-1 > UBound($aArrayB)-1 then
    $a = $aArrayA
    $b = $aArrayB
    Else
    $b = $aArrayA
    $a = $aArrayB
    endif

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

    for $i = ubound($a)-1 to 0 Step -1
    for $ii = ubound($b)-1 to 0 Step -1
    if $a[$i][1] = $b[$ii][1] then
    _ArrayDelete($a,$ii)
    _ArrayDelete($b,$i)
    endif
    next
    next

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

    _ArrayDisplay($aArrayA, "$aArrayA")
    _ArrayDisplay($aArrayB, "$aArrayB")
    _ArrayDisplay($a, "$a")
    _ArrayDisplay($b, "$b")
    EndFunc

    [/autoit]