StringSplit innhalber einer Funktion, funktioniert nicht

  • Ach wenn hier schon alle Skripte dazu posten dann will ich mal nicht so sein und auch eine Version anbieten:

    Einmal editiert, zuletzt von AspirinJunkie (20. Oktober 2017 um 14:51) aus folgendem Grund: Quellcode nun auf AutoIt

  • The requested action with this object has failed.

    Hm, da bin ich aber sehr erstaunt, dass auf einigen System nicht alle Properties unterstützt werden. Bei mir (Win 10 X64) sind sie alle verfügbar, aber wie bei BugFix sind einige davon nicht befüllt.

    Funktioniert denn die Version von AspirinJunkie bei euch?

    Hier der Ordnung halber noch mal meine Version mit Error-Handler...

    _GetBIOSInfo()

    Musashi

    In den meisten Funktionen kann man nicht nach Belieben irgendwelche Zeilen auskommentieren und dabei erwarten, dass sie ohne weitere Anpassungen funktionieren. Hier in diesem Fall müssten lediglich die entsprechenden Enum-Werte entfernt werden. Alternativ könnte man die Funktion auch umschreiben, dass sie nur die gewünschten Werte liefert... z.B.: _GetBIOSInfo('SMBIOSBIOSVersion', 'SMBIOSMajorVersion', 'SMBIOSMinorVersion', 'Version')

    Global Enum $eBiosCharacteristics, $eBIOSVersion, $eBuildNumber, $eCaption, $eCodeSet, $eCurrentLanguage, $eDescription, $eEmbeddedControllerMajorVersion, $eEmbeddedControllerMinorVersion, $eIdentificationCode, $eInstallableLanguages, $eInstallDate, $eLanguageEdition, $eListOfLanguages, $eManufacturer, $eName, $eOtherTargetOS, $ePrimaryBIOS, $eReleaseDate, $eSerialNumber, $eSMBIOSBIOSVersion, $eSMBIOSMajorVersion, $eSMBIOSMinorVersion, $eSMBIOSPresent, $eSoftwareElementID, $eSoftwareElementState, $eStatus, $eSystemBiosMajorVersion, $eSystemBiosMinorVersion, $eTargetOperatingSystem, $eVersion, $eSizeOff

    Global Enum $eBiosCharacteristics, $eBIOSVersion, $eBuildNumber, $eCaption, $eCodeSet, $eCurrentLanguage, $eDescription, $eIdentificationCode, $eInstallableLanguages, $eInstallDate, $eLanguageEdition, $eListOfLanguages, $eManufacturer, $eName, $eOtherTargetOS, $ePrimaryBIOS, $eReleaseDate, $eSerialNumber, $eSMBIOSBIOSVersion, $eSMBIOSMajorVersion, $eSMBIOSMinorVersion, $eSMBIOSPresent, $eSoftwareElementID, $eSoftwareElementState, $eStatus, $eSystemBiosMajorVersion, $eSystemBiosMinorVersion, $eTargetOperatingSystem, $eVersion, $eSizeOff


    ;_ArrayAddItem($aReturn, "EmbeddedControllerMajorVersion", .EmbeddedControllerMajorVersion)

    ;_ArrayAddItem($aReturn, "EmbeddedControllerMinorVersion", .EmbeddedControllerMinorVersion)

  • Hammer-cool AspirinJunkie (wie immer)

    Ja, direkt über die Eigenschaften und Methoden des Objektes zu gehen hat schon was ^^!

    Das Beispiel von Oscar ist aber auch nicht schlecht. Es ist zwar länger, für 'Normaluser' aber wahrscheinlich leichter zu verstehen und zu modifizieren.

    Fazit : Beides sehr gelungene Lösungswege :thumbup:

    Gruß Musashi

    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 Bitnugger !

    Funktioniert denn die Version von AspirinJunkie bei euch?

    Ja, sowohl die Version von AspirinJunkie , als auch die von Oscar ! (mein System : Win7 Pro SP1)

    In den meisten Funktionen kann man nicht nach Belieben irgendwelche Zeilen auskommentieren und dabei erwarten, dass sie ohne weitere Anpassungen funktionieren. Hier in diesem Fall müssten lediglich die entsprechenden Enum-Werte entfernt werden.

    Mir ist schon klar, dass man nicht nach Belieben irgendwelche Zeilen auskommentieren sollte !

    Trotzdem halte ich es hier, in gewisser Weise, schon für einen kleinen Designfehler. Die (Re)dimensionierung des Arrays erfolgt anhand der Aufrufe von _ArrayAddItem($aReturn,...). Dass jemand bestimmte Werte ggf. nicht benötigt, wäre nicht so exotisch. Da sich $eSizeOff aber nur nach der Anzahl der Enum-Werte (Global Enum ...) richtet, besteht die Gefahr, dass die Arraygrenze überschritten wird. Es ist für 'Normaluser' nur schwer zu erkennen, dass er auch die jeweiligen Enum-Werte entfernen muss (nur meine Meinung, keine Kritik ;)).

    Gruß Musashi

    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."

  • Die (Re)dimensionierung des Arrays

    Habe ich nun komplett entfernt und auch noch drei Fehler beseitigt. BiosCharacteristics, BIOSVersion und ListOfLanguages sind Arrays... die ich aber als String behandelt hatte.

    Es ist für 'Normaluser' nur schwer zu erkennen, dass er auch die jeweiligen Enum-Werte entfernen muss

    Tja, und was bitte soll ich daran ändern?

    _GetBIOSInfo
  • Hallo Bitnugger !

    Tja, und was bitte soll ich daran ändern?

    Du kannst und musst natürlich gar nichts daran ändern !

    Ich wollte lediglich einen Punkt ansprechen, der sich nicht allen Usern auf den ersten Blick erschließt, das habe ich getan;). Jeder der den Thread bis hier aufmerksam verfolgt hat weiß jetzt, was gemacht werden muss. Es lag nie in meiner Absicht, die Qualität deines Skriptes grundsätzlich in Zweifel zu ziehen !!

    Zudem gibt es mittlerweile mehrere Lösungswege, aus denen ein User nach seinen Bedürfnissen auswählen kann.

    Also nichts für ungut :)!

    Gruß Musashi

    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."

  • Musashi

    Falls ein "Normaler User" die Funktion ändern möchte und damit nicht klar kommt, kann er ja hier im Forum um Hilfe bitten. Konstruktive Kritik an mir oder meinen Scripten ist immer willkommen! Wenn du dir meine letzte Version anschaust, wirst du auch sehen, dass ich deinen Hinweis bezüglich des "Design-Problems" umgesetzt habe. Generell denke ich, dass Scripte von helfenden Usern (vor allem in der Rubrik "Hilfe & Unterstützung") nicht als Endlösung, sondern als Vorlage und Inspiration angesehen werden sollten.

    Die Funktion von Oscar (hier fehlt noch die Auswertung der Arrays und eine Korrektur für den Wert ".CurrentLanguage") und AspirinJunkie (wieder was gelernt!) sind beide sehr schön, letztere ist allerdings ohne Error-Handler...

    ; Row|Col 0|Col 1

    ; [0]|BiosCharacteristics|{Array}

    ; [1]|BIOSVersion|{Array}

    ; [13]|ListOfLanguages|{Array}

    ".CurrentLanguage" liefert bei mir mehrere Werte, die mit einem "|" getrennt sind - identisch mit dem Inhalt des Arrays ".ListOfLanguages". Die Funktion _StringSplit2D gibt davon nur den ersten Wert zurück.

    Einmal editiert, zuletzt von Bitnugger (21. Oktober 2017 um 00:26)

    • Offizieller Beitrag

    und AspirinJunkie (wieder was gelernt!) sind beide sehr schön, letztere ist allerdings ohne Error-Handler

    Die Version von AspirinJunkie benötigt keinen Error-Handler, weil er die verfügbaren Properties ausliest und davon dann die Werte ermittelt. Übrigens: Gute Idee, AspirinJunkie!

  • Hallo Bitnugger !

    Wenn du dir meine letzte Version anschaust, wirst du auch sehen, dass ich deinen Hinweis bezüglich des "Design-Problems" umgesetzt habe.

    Einwandfrei :thumbup:!

    Durch die Dimensionierung des Arrays ($aReturn[$eSizeOff][2] ) in _GetBIOSInfo() kann man jetzt problemlos nicht benötigte Werte auskommentieren.

    Generell denke ich, dass Scripte von helfenden Usern (vor allem in der Rubrik "Hilfe & Unterstützung") nicht als Endlösung, sondern als Vorlage und Inspiration angesehen werden sollten.

    Da bin ich völlig deiner Meinung (obwohl ich den Begriff 'Endlösung' in unseren politisch korrekten Zeiten wohl gemieden hätte ^^). Falls man es unbedingt darauf anlegt, wird man quasi in jedem Skript ein Haar in der Suppe finden können.

    Nebenbei :

    Wenn ich manchmal von 'Normalusern' oder 'Gelegenheitsusern' spreche, dann ist das nie abwertet gemeint. Zu einem nicht unerheblichen Teil zähle ich mich selbst auch dazu ;).

    Ich denke, damit können wir, zumindest diesen Teilaspekt des Threads, abschließen.

    Gruß Musashi

    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."

  • Zum Thema Errorhandler:

    So wie ich es verstehe habt ihr diesen eingerichtet für die Fälle das Eigenschaften abgerufen werden, welche gar nicht in der Klasse existieren.
    Der Errohandler soll hierbei dafür sorgen dass das Skript sich nicht mit einem Fehler verabschiedet - richtig?

    Meine Variante sollte auch bisschen als Hinweis dafür verstanden werden wie man es alternativ auch machen könnte.
    Der Fall hier dass einfach alle möglichen Werte einer Klasse in ein Array geklatscht werden sollen ist so praxisnah sicherlich nicht.
    Aber die Möglichkeit alle vorhandenen Properties zu ermitteln gibt uns die Mittel dies einmalig durchzuführen und dann einfach vorher abzufragen bevor wir auf eine Eigenschaft zugreifen wollen.
    Also grundsätzlich z.B. so:

    So kann man auch den Fehler verhindern dass auf Eigenschaften zugegriffen wird ohne dass diese existieren.

    • Offizieller Beitrag

    Der Errohandler soll hierbei dafür sorgen dass das Skript sich nicht mit einem Fehler verabschiedet - richtig?

    Genau!

    Ohne den Errorhandler würde das Script mit einer Fehlermeldung abbrechen.

    Die Fehler kamen, weil einige Properties erst ab Windows10 existieren.

    Meine Variante sollte auch bisschen als Hinweis dafür verstanden werden wie man es alternativ auch machen könnte.

    Finde ich sehr gut!

    So ist das viel besser umzusetzen. Die beste Art eine Fehlermeldung zu bearbeiten, ist es, den Fehler erst gar nicht auftreten zu lassen. ;) :thumbup:

  • So wie ich es verstehe habt ihr diesen eingerichtet für die Fälle das Eigenschaften abgerufen werden, welche gar nicht in der Klasse existieren.

    Lt. Spezifikation der Win32_BIOS-Klasse : https://msdn.microsoft.com/en-us/library/…7(v=vs.85).aspx

    sind die Properties, die den Fehler verursachen, aber vorhanden :

    Laut Klassenbeschreibung sind das die uint8 Werte :


    uint8 EmbeddedControllerMajorVersion;

    uint8 EmbeddedControllerMinorVersion;

    uint8 SystemBiosMajorVersion;

    uint8 SystemBiosMinorVersion;

    Ich habe mir die Beschreibung zu diesen vier Properties jetzt aber mal genauer angesehen. Dort steht bei allen :

    (hier exemplarisch EmbeddedControllerMajorVersion genommen)

    EmbeddedControllerMajorVersion
    Data type: uint8Access type: Read-onlyQualifiers: MappingStrings

    The major release of the embedded controller firmware.

    This value comes from the Embedded Controller Firmware Major Release member of the BIOS Information structure in the SMBIOS information.

    Windows Server 2012 R2, Windows 8.1, Windows Server 2012, Windows 8, Windows Server 2008 R2, Windows 7, Windows Server 2008, and Windows Vista: This property is not supported before Windows 10 and Windows Server 2016 Technical Preview.


    Der Satz 'This property is not supported before Windows 10 and Windows Server 2016 Technical Preview.' macht mich nun doch etwas stutzig :/.

    Edit : Oscar hat gerade meinen Verdacht bestätigt.

    Gruß Musashi

    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."