Aufteilen eines Array-Index in 2 Werte

  • Hallo Profis,

    mit der folgenden Schleife frage ich die Bios-Settings eines Lenovorechners ab


    Die Ausgabe für $aBiosArray[UBound($aBiosArray) - 1] =$objitem.CurrentSetting wäre z.B.


    Row|Col 0

    [1]|WakeOnLAN,ACOnly

    .

    .

    .

    [n] laber,bla


    Um die Ausgabe "lesefreundlich" zu machen hätte ich gerne den Wert des jeweiligen Index in 2 Werte aufgeteilt, nämlich
    "AttributeName: WakeOnLan " -- CurrentSetting: " ACOnly.

    Die Zeile $a_String = StringSplit($aBiosArray[UBound($aBiosArray) - 1], ",") erzeugt zwar ein Array mit den beiden Strings als jeweiligem Index
    aber es scheint so als ob $a_String immer wieder überschrieben wird.

    Hat jemand eine Idee wie ich die beiden Beispiel-Strings WakeOnLan und ACOnly als zwei Werte gespeichert bekomme?


  • Das er das ersetzt ist klar, denn du weist ihm ja zweimal exakt einen Wert zu.

    Das muss so etwas sein:

    AutoIt
    Redim($a_String[UBound($a_String)])
    $a_String[UBound($a_String - 1)] = StringSplit($aBiosArray[UBound($aBiosArray) - 1], ",")

    Bin da nun nicht ganz sicher, ich arbeite lieber mit Arrays und deren Größen als For $objItem In $colItems

  • Hallo Moombas,

    vielen lieben Dank für die Idee. ich musste deinen Code etwas korrigieren, aber leider klappt das nicht wie wir dachten


    erzeugt aber die folgende Ausgabe:


    Row|Col 0

    [0]|

    [1]|{Array}

    [2]|{Array}

    [3]|{Array}

    [4]|{Array}

    [5]|{Array}

    [6]|{Array}

    .

    .

    .


    Jetzt scheint der Stringsplit nicht zu gehen. ;(

  • AutoIt
    ; korrigierter String
    ReDim $a_String[UBound($a_String) + 1][2]
    $a_String[UBound($a_String) - 1][1] = StringSplit($aBiosArray[UBound($aBiosArray) - 1], ",")[1]
    $a_String[UBound($a_String) - 1][2] = StringSplit($aBiosArray[UBound($aBiosArray) - 1], ",")[2]
  • ;(;(;( geht auch nicht:


    Fehlermeldung von SciTE

    "E:\BiosDump.au3" (43) : ==> Array variable has incorrect number of subscripts or subscript dimension range exceeded.:

    $a_String[UBound($a_String) - 1][2] = StringSplit($aBiosArray[UBound($aBiosArray) - 1], ",")[2]

    ^ ERROR

    ich glaube so geht das ohnehin nicht, da Stringsplit ja ein komplettes Array erzeugt und wir versuchen das in eine Zeile zu Schreiben....

    das mit dem _Arrayadd scheint auch nicht zu gehen, da das _ArrayDisplay im Nachgang $a_String nicht anzeigt...

  • Versuch mal folgendes:


  • Hallo Moombas,

    jetzt sind wir auf jedenfall ein Stück weiter: Es wird ein 2 dimensionales Array erstellt. In Col 1 steht der erste Wert und in Col. 2 der 2. wert.
    Soweit so gut. Nur eins noch:

    Der _ArrayDelete löscht das ganze $a_String-Array.
    Hast du eine Idee zur Lösung?


    Die Zeilen

  • Probier mal so:

  • Hallo Bugfix,

    jetzt warst du schneller als ich. Werde deinen Versuch noch testen. Mein Versuch war auch erfolgreich:
    Ich habe einfach in die If-Abfrage meiner Zeile 20 ein Exitloop eingebaut. Damit hört die Schleife auf wenn der erste leere Wert auftaucht.

  • Hallo Moombas,

    so sieht das Array aus ohne den ExitLoop:

    Row|Col 0|Col 1

    [0]|0|

    [1]|WakeOnLAN|ACOnly

    [2]|WakeOnLANDock|Enable

    [3]|EthernetLANOptionROM|Enable

    [4]|IPv4NetworkStack|Enable

    [5]|IPv6NetworkStack|Enable

    [6]|UefiPxeBootPriority|IPv4First

    [7]|WirelessAutoDisconnection|Disable

    [8]|MACAddressPassThrough|Disable

    [9]|USBBIOSSupport|Enable

    [10]|AlwaysOnUSB|Enable

    [11]|TrackPoint|Automatic

    [12]|TouchPad|Automatic

    [13]|FnCtrlKeySwap|Disable

    [14]|FnSticky|Enable

    [15]|FnKeyAsPrimary|Enable

    [16]|BootDisplayDevice|ExternalDisplay

    [17]|SharedDisplayPriority|HDMI

    [18]|TotalGraphicsMemory|512MB

    [19]|BootTimeExtension|3

    [20]|SpeedStep|Enable

    [21]|AdaptiveThermalManagementAC|MaximizePerformance

    [22]|AdaptiveThermalManagementBattery|Balanced

    [23]|CPUPowerManagement|Automatic

    [24]|OnByAcAttach|Enable

    [25]|PasswordBeep|Disable

    [26]|KeyboardBeep|Disable

    [27]|HyperThreadingTechnology|Enable

    [28]|AMTControl|Disable

    [29]|USBKeyProvisioning|Disable

    [30]|WakeByThunderbolt|Enable

    [31]|ThunderboltSecurityLevel|NoSecurity

    [32]|PreBootForThunderboltDevice|Disable

    [33]|LockBIOSSetting|Disable

    [34]|MinimumPasswordLength|Disable

    [35]|BIOSPasswordAtUnattendedBoot|Enable

    [36]|BIOSPasswordAtReboot|Disable

    [37]|BIOSPasswordAtBootDeviceList|Disable

    [38]|PasswordCountExceededError|Disable

    [39]|FingerprintPredesktopAuthentication|Enable

    [40]|FingerprintReaderPriority|External

    [41]|FingerprintSecurityMode|Normal

    [42]|FingerprintPasswordAuthentication|Enable

    [43]|SecurityChip|Enable

    [44]|TXTFeature|Disable

    [45]|PhysicalPresenceForTpmClear|Enable

    [46]|BIOSUpdateByEndUsers|Enable

    [47]|SecureRollBackPrevention|Enable

    [48]|WindowsUEFIFirmwareUpdate|Enable

    [49]|DataExecutionPrevention|Enable

    [50]|VirtualizationTechnology|Enable

    [51]|VTdFeature|Enable

    [52]|EthernetLANAccess|Enable

    [53]|WirelessLANAccess|Enable

    [54]|WirelessWANAccess|Enable

    [55]|BluetoothAccess|Enable

    [56]|USBPortAccess|Enable

    [57]|MemoryCardSlotAccess|Enable

    [58]|SmartCardSlotAccess|Enable

    [59]|IntegratedCameraAccess|Enable

    [60]|MicrophoneAccess|Enable

    [61]|FingerprintReaderAccess|Enable

    [62]|ThunderboltAccess|Enable

    [63]|NfcAccess|Enable

    [64]|BottomCoverTamperDetected|Disable

    [65]|InternalStorageTamper|Disable

    [66]|ComputraceModuleActivation|Enable

    [67]|SecureBoot|Enable

    [68]|SGXControl|SoftwareControl

    [69]|DeviceGuard|Disable

    [70]|BootMode|Diagnostics

    [71]|StartupOptionKeys|Enable

    [72]|BootDeviceListF12Option|Enable

    [73]|BootOrder|USBCD:USBFDD:NVMe1:NVMe0:HDD0:USBHDD:PCILAN

    [74]|NetworkBoot|PCILAN

    [75]|BootOrderLock|Disable

    [76]|I8254ClockGating|Auto

    [77]|ThunderboltBIOSAssistMode|Disable

    [78]|ThunderboltBIOSAssistMode|Disable

    .

    .

    .

    [254]|ThunderboltBIOSAssistMode|Disable

    [255]|ThunderboltBIOSAssistMode|Disable


    Mit ExitLoop oder der Variante von Bugfix fallen die Zeilen ab Nr. 77 weg...


    :!::!::!: Nachtrag: Die Lösung mit ExitLoop ist nur suboptimal. Bei LenovoDesktop Rechnern kommen am Anfang und auch zwischen drin Leereinträge vor :!::!::!:


    Ich teste morgen die Bugfix-Variante auf Lenovo-Desktoprechner und berichte...

  • Wäre es nicht besser auch dieses Array dynamisch zu vergrößern anstatt einen fix-wert zu nutzen, der sich ja immer ändern kann?

    Bei Arrays, wo die finale Größe immer gleich ist mach ich das auch so aber bei welchen wie hier die unter bestimmten Bedingungen eine andere Größe haben können mag ich den dynamischen Gedanken wesentlich lieber.

  • Hallo Moombas,

    da muss ich dir Recht geben. Der Hintergrund meiner Anfrage ist die Entwicklung eines Tools um die gesetzten BIOS-Optionen, für die bei uns
    eingesetzten Computermodelle abzufragen. Da macht nur ein dynamisches Array Sinn. Die verschiedenen Hersteller haben ja unterschiedlich viele Bios-Optionen

    Könnt ihr mir in dem Zusammenhang sagen. wie ich die beiden Indizes des mit _ArrayAdd($a_String, $aBiosArray[UBound($aBiosArray) - 1], Default, ',') erzeugten Arrays
    in eine TextDatei hienein bekomme?

    ich habe es so versucht $s_aString += "AttributeName: " & $a_String[UBound($aBiosArray) - 1][1] & " -- CurrentSetting: " & $a_String[UBound($aBiosArray) - 1][2]
    aber in $s_aString wird nichts geschrieben ;(

  • Hallo Moombas,

    vielen lieben Dank für den Tipp. wird gleich getestet :thumbup:

    Ich bin noch eine Antwort bzgl. der Variante von Bugfix schuldig:

    Habe also eben auf Lenovo-Desktop getestet. Was soll ich sagen: :klatschen::party: 

    Funktioniert besser wie meine, da die Leerzeilen zwischendrin oder auch gleich die am Anfang weg gefiltert werden. Vielen leiben Dank dafür Bugfix :thumbup::thumbup::thumbup::thumbup:

  • Wäre es nicht besser auch dieses Array dynamisch zu vergrößern anstatt einen fix-wert zu nutzen, der sich ja immer ändern kann?

    Bei Arrays, wo die finale Größe immer gleich ist mach ich das auch so aber bei welchen wie hier die unter bestimmten Bedingungen eine andere Größe haben können mag ich den dynamischen Gedanken wesentlich lieber.

    Wenn viele Einträge zu erwarten sind, sollte man das kontinuierliche Vergrößern des Array (_ArrayAdd, ReDim) vermeiden. Jede dieser Aktionen braucht gefühlt mehr Zeit als der Rest des Skriptes.

    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. Somit sind die Vorteile von fixem Array und Dynamik vereint.

    Kann dann so aussehen:

  • Dauert das denn signifikannt länger?

    Was passiert beim ReDim:

    - Speicherplatz in neuer Größe anfordern

    - Daten vom alten Speicherplatz an den neuen Speicherplatz kopieren

    - alten Speicher freigeben

    D.h., mit jedem Element das hinzukommt, wird ein Element mehr kopiert beim ReDim. Für kleine Größen sicher nicht relevant, aber wenn das anwächst wird es spürbar.

    Und selbst wenn du es nicht unbedingt spürst, ist es für meinen Geschmack einfach unschön. (Und in Zeiten, wo man von Nachhaltigkeit spricht: Das kostet auch Energie. :whistling: )