Aufteilen eines Array-Index in 2 Werte

  • Hallo ihr Zwei,

    also bei meinem UseCase fällt das nicht so ins Gewicht. Da reden wir, nach meinen Tests auf den bei uns existierenden Rechnern, von
    unter hundert Bios-Optionen, sprich Einträgen.

    Aber ich gebe Bugfix recht, sollte jemand das für deutlich größere Datenmengen, bzw. Arrays einsetzen ist das sicherlich das bessere Vorgehen.

    Das Tool ist von meiner Seite aus fertig und somit auch dieser Post. Ich lasse ihn aber noch ein paar Tage offen falls wer noch Fragen hat oder weiter diskutieren möchte ;)

    Nochmals vielen herzlichen Dank an euch beide. Ihr wart mir wie immer eine große Hilfe und Bereicherung :klatschen:

  • SWbemServices.ExecQuery() gibt eine SWbemObjectSet Collection zurück, wenn man nicht das Flag wbemFlagForwardOnly setzt. Mit dem Flag soll es nach MS schneller gehen und weniger Speicher verbrauchen, andererseits verfügt die 'normale' Collection über eine Count Eigenschaft, die die Anzahl der Einträge liefert. Damit sollte sich das 'Array-Dim-Gehampel' erübrigen, weil die maximale Anzahl der Einträge feststeht. Wenn Leereinträge übersprungen werden sollen, kann man mitzählen und das Array zum Schluss passend eindampfen.

    AutoIt
        ...    
        $colItems = $objWMIService.ExecQuery("SELECT * FROM Lenovo_BiosSetting", "WQL", _
                    $wbemFlagReturnImmediately) ;  + $wbemFlagForwardOnly)
        MsgBox(0, "Anzahl der Einträge", $colItems.Count)
        ...
  • Wenn man nicht weiß, wieviel Einträge zu erwarten sind, legt man erst mal eine fiktive Größe von 1000 vor (kann auch 10.000 sein, tut niemandem weh). Und nach jeder Vergrößerung des Zählers prüft man, ob dieser Wert erreicht wurde. Wenn ja, wird an dieser Stelle ein ReDim mit Erweiterung des Array um die Blockgröße vorgenommen.

    Das mildert das Problem erheblich ist aber noch nicht ganz der Königsweg.
    Insbesondere bei großen Arrays sorgt die Blockgröße dann für eine immer noch hohe Anzahl an ReDims.

    Besser wäre es daher, wenn auch die Blockgröße dynamisch mit der Arraygröße wächst.

    Am allereinfachsten geht dies indem man die Arraygröße bei einem Resize schlicht verdoppelt (oder jeder andere beliebige Faktor).

    Das ist flotter als mit festen Blockgrößen zu hantieren wo sich der Schreiber erstmal um eine vernünftige Größe hierfür Gedanken machen muss aber Code-mäßig sogar noch simpler:

    Mal abgesehen davon, dass man dynamische Arrays nicht braucht, wenn man wie Velted schon schrieb, die Anzahl der Einträge auch einfach vorher abfragen kann.

    Zu der eigentlichen Thematik hier will ich mich eigentlich nicht äußern, da ich das bei mir selbst so nicht testen kann.
    Daher nur vielleicht mal als Gedankeneinwurf:
    Oben im Skript werden erst alle Einträge von Lenovo_BiosSetting abgefragt und dann hinterher geschaut ob der Wert CurrentSetting leer ist.

    Man kann jedoch, da es sich um WQL handelt, sich gleich bei der Abfrage nur die Elemente zurückgeben lassen, bei welchen CurrentSetting gesetzt ist:

    $objWMIService.ExecQuery('SELECT * FROM Lenovo_BiosSetting WHERE CurrentSetting <> ""' ...

  • Hallo Nochmal,

    ich muss das Proggi etwas anpassen, da die Abfrage bei Dell Rechnern etwas umfangreicher ist, d.h. ich muss mehrere Klassen abfragen.
    Eine davon ist die Klasse Bootorder. Damit habe ich ein Problem.

    Das objitem.BootOrder aus Zeile 13 gibt in dieser Form nur den Wert WindowsBootmanager zurück. Da sollten aber auf meinem TestDevice mind. 5 BootGeräte zurückgegeben werden.
    Der VBS-Code von WMI-Explorer sieht so aus: strBootOrder = Join(objItem.BootOrder, ","). Die Join Funktion schreibt kommagetrennt die Werte von objitem.BootOrder in die Variable strBootOrder.

    Kann mir jemand einen Tipp geben wie ich das in AutoIt umsetzen kann? Meine Zeile 13 war der klägliche Versuch das zu erreichen ;(