Wildcards in Suchstring bei _ArrayFindAll

  • Hallo Gemeinde,

    ich muss mit meinem Proggi ein Screenshot eines Fensters machen. Das Problem: Der Titel des Fensters ändert sich je nach eingestellter Sprache.
    Der Titel des Fenters ist immer gleich aufgebaut HWiNFO64 + Version + Rechnername + Systemzusammenfassung(oder System-Zusammenfassung oder System Summary).

    Jetzt dachte ich, ich erzeuge mit Winlist() zunächst ein Array mit allen Fenstern und suche mit ArrayFindAll den richtigen Fenstertitel raus. Die Frage:

    Kann ich den Suchstring für ArrayFindAll auch mit Wildcards machen? z.B. HWiNFO64 * System *. Dadurch würden die anderen Fenster die HWinFO im Titel haben oder auch System nicht angezeigt werden...
    Wenn ja wie schreibe ich das dann.


    Code
     ; hier funktioniert der Stern als Wildcard... so etwas dachte ich mir für ArrayFindAll
      _FileListToArray(@ScriptDir, 'UUID*.txt', 1)
    
    ; so geht es jedenfalls nicht:
    Local $aResult = _ArrayFindAll($aList, 'HWiNFO64*System*', Default, Default, Default, 1, Default, Default)
  • Zitat

    Kann ich den Suchstring für _ArrayFindAll auch mit Wildcards machen?

    Aus der Hilfe :

    Funktion _ArrayFindAll

    $iCompare [optional]
    0 Vergleich von Variablen zu dem gleichen Typ (Standard), "String" = 0, "" = 0 oder "0" = 0 passt (Wenn $iCase = 0)
    1 führt eine Teilsuche aus
    2 Vergleich passt, wenn die Variablen vom gleichen Typ sind und den gleichen Wert haben
        3 Vergleich verwendet einen durch $vValue bereitgestellten regulären Ausdruck

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."

  • Hallo Musashi,

    vielen lieben Dank wieder einmal. Verstehe ich das richtig, das ich in die Variable $vValue einen String mit Wildcards schreibe und die Option 3 wertet das dann aus?

    grüßle


    Hipfzwirgel

  • $vValue  muss einen regulären Ausdruck enthalten. Option 3 verwendet den dann zur Suche.

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."

  • Scheint aber mit Wildcards nicht zu gehen ;(

    Das ist das Ergebnis von WinList 3 Fenster mit HWiNFO und es gibt mehrere mit System im Titel:

    [105]|HWiNFO64 Pro v7.26-4800 @ LENOVO ThinkPad T480 - System-Zusammenfassung|0x000000000037119C

    [106]|HWiNFO_CommDlg|0x000000000015100A

    [108]|HWiNFO64 Pro v7.26-4800|0x0000000000290E58

    Ich müsste also einen Suchstring mit Wildcards bauen, der nur die Worte HWiNFO und System enthält. Alle anderen Angaben in Zeile 105 (Version, Rechnername oder das Wort Zusammenfassung) können sich ändern


    Code
        Local $vValue = 'HWiNFO64*System*'
    
        Local $aList = WinList()
        _ArrayDisplay($aList, "$aList")
        Local $aResult = _ArrayFindAll($aList, $vValue, Default, Default, Default, 3, Default, Default) ; so geht es leider nicht...
        _ArrayDisplay($aResult, "$aResult")
  • Versuche mal :

    Code
    #include <Array.au3>
    
    Local $aArray[5] = ["HWiNFO64 und System enthalten", "HWiNFO64 only", "System only", "SystemHWiNFO64", "  HWiNFO64 und System"]
    _ArrayDisplay($aArray, "Testarray")
    
    
    Local $sSearchPattern = "(HWiNFO)*.(System)"
    Local $aiResult = _ArrayFindAll($aArray, $sSearchPattern, Default, Default, Default, 3)
    _ArrayDisplay($aiResult, "Found")

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."

  • Hallo Musashi,

    es lag tatsächlich an der Variablen $vValue(in deinem Bsp. $sSearchPattern). Ich habe den Wert auf "(HWiNFO )*(- System)" geändert und jetzt zeigt er den einzigen Index an,
    indem der Fenstertitel drin steht. Damit komme ich weiter.

    Vielen lieben Dank und dir einen schönen Feierabend :theke:

  • Zitat

    Eine Frage zum Verständnis noch: Worin Besteht der Unterschied, bzw. warum die Klammern und was bewirken sie?

    Code
    'HWiNFO64*System*' <-> "(HWiNFO )*(- System)"

    (vereinfachte Antwort - die RegEx-Experten mögen Nachsicht walten lassen :) )

    Mit  ( )  werden Gruppen definiert.

    In Deinem Fall kann man die Klammern aber auch weglassen, also :

    $sSearchPattern = "HWiNFO64.*- System"

    -> findet das Muster HWiNFO64 0 oder mehr andere Zeichen - System

    -> dabei ist es egal ob vor oder nach dem Suchmuster etwas steht.


    Wichtig : als Quantifizierer für 0 oder mehr Zeichen,gierig musst Du .* verwenden, nicht nur * !

    Diese Syntax funktioniert also nicht : $sSearchPattern = "HWiNFO64*System"


    Es gibt, wie bei regulären Ausdrücken üblich, natürlich noch andere Varianten, aber das hier soll kein Tutorial werden ;) . Details findest Du z.B. in der Hilfe :

    Funktion StringRegExp


    Hier noch mal ein Skript zum Herumspielen ^^ :

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."

    Einmal editiert, zuletzt von Musashi () aus folgendem Grund: typo (Dank an Bitnugger, der wie gewohnt aufmerksam mitliest :) )