StringSplit innhalber einer Funktion, funktioniert nicht

  • Ich dachte da an sowas wie if-else, falls kein "." vorkommt....

    Ja, das ist auch ein vernünftiger Ansatz. Du solltest aber aufpassen, da bei einigen Strings mehrere Punkte vorkommen können und du dann die Sachen falsch splittest.

    Splitte nach dem Punkt und schau ob das gesplittete Array zwei Funde beinhaltet, wenn ja, dann kannst du damit weiterarbeiten, wenn nicht, musst du was anderes damit machen.

  • Ok, habe mich noch einmal versucht.

    Kann das jemand gegentesten und mir sagen, ob es Code-Technisch ok ist?

    Wenn ich "X751SA.705" verwende, wird mir jeweils X751SA und 705 ausgegeben.

    Wenn ich "X751SA705" verwende, wird mir jeweils X und XX ausgegeben.

    Wäre das dann so korrekt?

  • Hallo Sumale.my !

    Ich habe mein Skript mal etwas erweitert :

    siehe Kommentar im Skript -> ; ModelName und Version aus $sBIOSVersion ermitteln :

    Da hier kein Array durch StringSplit mehr im Spiel ist, kann es auch nicht zu Range-Fehler etc. kommen.

    Dieser Teil der Lösung ist in sofern etwas quick&dirty, da er voraussetzt, dass das Muster mind. einen Punkt enthält. Ansonsten wird $sBIOSVersion vollständig bei $sModelName eingetragen.

    An dieser Stelle können weitere Verbesserungen (z.B. mit RegEx) vorgenommen werden, aber möglicherweise langt es für Dich ja bereits aus ;).

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

  • Ich müsste dann aber "BIOSVersion(0)" mit "SMBIOSBIOSVersion" ersetzen, weil "SMBIOSBIOSVersion" immer "MODEL.VERSION" ausgibt.

    Das Problem bei den ASUS Geräten ist, dass ich die Bios Version nur mit "SMBIOSBIOSVersion" auslesen kann mittels "MODEL.BIOSVERSION"s Muster.

    Das Model kann man auch getrennt ausgeben und wäre in dem Fall mittels "wmic computersystem get model" möglich und würde dann "X751SA" ausgeben. Nur wie gesagt die Version, ist dabei nicht mit "BIOSVersion(0)" zu bekommen.

    Scheint zu klappen

    Ich gehe davon aus, dass ich vom Code-Technischen her, deins nehmen sollte oder?

    Jetzt bekomme ich natürlich bei allen Variablen, eine Fehlermeldung. Wie und wo, muss ich diese jetzt erst angeben?

    Einmal editiert, zuletzt von Sumale.my (19. Oktober 2017 um 19:45)

  • Hallo Sumale.my !

    Ich müsste dann aber "BIOSVersion(0)" mit "SMBIOSBIOSVersion" ersetzen, weil "SMBIOSBIOSVersion" immer "MODEL.VERSION" ausgibt.

    Das Problem bei den ASUS Geräten ist, dass ich die Bios Version nur mit "SMBIOSBIOSVersion" auslesen kann mittels "MODEL.BIOSVERSION"s Muster.

    Falls SMBIOSBIOSVersion die für deine Zwecke geeigneten Daten ausgibt, dann tue Dir keinen Zwang an ^^.

    Mein Skript sollte Dir ja nur ein Grundgerüst liefern. Solange Du also nicht wieder Variablen innerhalb einer Funktion mit Global deklarierst, kannst Du die Werte ändern oder erweitern wie Du möchtest ;).

    Die Beschreibung der Klasse Win32_BIOS findest Du, wie bereits beschrieben, unter folgendem Link :

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

    Ich gehe davon aus, dass ich vom Code-Technischen her, deins nehmen sollte oder?

    Also, es geht sicher eleganter, aber als Vorlage ist das Skript wohl ganz gut geeignet.

    Der Wert SMBIOSBIOSVersion ist Teil der Klasse, also kannst Du $sBIOSVersion überall durch $sSMBIOSBIOSVersion ersetzten, und $sSMBIOSBIOSVersion =$objItem.SMBIOSBIOSVersion schreiben.

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

  • Ok, super und ja, es hilft enorm um es etwas zu verstehen.

    Kannst du mir auch sagen wie und wo ich alle anderen Variablen nun mit "Dim, Local oder Global" setzen muss?

    Wo muss ich z.B "Dim $getModelName" einfügen, damit der der Fehler (und weitere) nicht mehr auftauchen:

    Zitat

    "C:\Users\Lenovo\Documents\ISN AutoIt Studio\Projects\Final Test Tools v3\functions.au3"(186,77) : warning: $getModelName: possibly used before declaration.

    $keydefus = @WorkingDir & "WTP\asus-wtp\bin\keydef\keydef" & $getModelName &

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^

    Oder dieser

    Zitat

    "C:\Users\Lenovo\Documents\ISN AutoIt Studio\Projects\Final Test Tools v3\fttgui.isf"(10,64) : warning: $ftt_gui possibly not declared/created yet

    $ftt_gui = GUICreate("Final Test Tools v3",517,208,-1,-1,-1,-1)

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^

  • Hallo Sumale.my !

    Ich sehe, dass Du deinen Beitrag gerade editiert und eine Fehlerliste beigefügt hast.

    Beispiel (nur Auszug) :

    "C:\Users\Lenovo\Documents\ISN AutoIt Studio\Projects\Final Test Tools v3\functions.au3"(186,77) : warning: $getModelName: possibly used before declaration. $keydefus = @WorkingDir & "WTP\asus-wtp\bin\keydef\keydef" & $getModelName &

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^ "C:\Users\Lenovo\Documents\ISN AutoIt Studio\Projects\Final Test Tools v3\functions.au3"(234,36) : warning: $getSerial: possibly used before declaration.

    $serial = StringStripWS($getSerial, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^

    $keydefus = @WorkingDir & "WTP\asus-wtp\bin\keydef\keydef" & $getModelName &

    usw.

    Das zeigt mir, dass Du NICHT deinen kompletten Code gepostet hast !!!

    Du hast wahrscheinlich die Anweisung :

    Opt('MustDeclareVars', 1) ; Variablen müssen vor der Verwendung mit Global, Local oder Dim deklariert werden

    übernommen, und die anderen Variablen in deinem Vollskript sind nicht durch Global/Local deklariert.

    Entferne daher mal diese Zeile, falls vorhanden !

    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 Sumale.my

    Ok, super und ja, es hilft enorm und es etwas zu verstehen.

    Kannst du mir auch sagen wie und wo ich alle anderen Variablen nun mit "Dim, Local oder Global" setzen muss?

    Wo muss ich z.B "Dim $getModelName" einfügen, damit der der Fehler (und weitere) nicht mehr auftauchen:

    Hast Du bei Dir die Anweisung Opt('MustDeclareVars', 1) eingebaut ?

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

  • Ich habe die Zeile nun entfernt, ich kann kompilieren und das Script ausführen. Aber erhalte noch diese Meldung beim Kompilieren. Musashi

  • Hallo Sumale.my !

    Ich werde die besagte Zeile mal entfernen. Danke für die Info.

    Die Anweisung Opt('MustDeclareVars', 1) hat grundsätzlich schon ihren Sinn. Wenn in einem langen Skript aber bisher keine Variablendeklarationen gemacht wurden, ist es recht nervig, das 'nachzurüsten'^^.

    Kannst du mir auch sagen wie und wo ich alle anderen Variablen nun mit "Dim, Local oder Global" setzen muss?

    Ja ! Dafür schlage ich aber vor, dass Du eine Konversation mit mir startest. Im Rahmen dieses Threads Ping-Pong mäßig sich überschneidende Beiträge 'rauszuhauen, ist nicht so produktiv. Innerhalb einer Konversation können wir das Thema in Ruhe besprechen. Falls dabei etwas herauskommt, das für die Allgemeinheit von Interesse sein könnte, kann man das Fazit hier posten.

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

  • Hier mal eine Version von mir...

    _GetBIOSInfo()
  • Hallo Bitnugger !

    Schönes Skript , mehr geht natürlich immer ;)!

    Die Zeilen :

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

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

    und

    _ArrayAddItem($aReturn, "SystemBiosMajorVersion", .SystemBiosMajorVersion)

    _ArrayAddItem($aReturn, "SystemBiosMinorVersion", .SystemBiosMinorVersion)

    werfen, zumindest bei mir, aber den Error : ==> The requested action with this object has failed.

    Laut Klassenbeschreibung sind das die uint8 Werte :

    uint8 EmbeddedControllerMajorVersion;

    uint8 EmbeddedControllerMinorVersion;

    uint8 SystemBiosMajorVersion;

    uint8 SystemBiosMinorVersion;


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

    • Offizieller Beitrag

    ==> The requested action with this object has failed.

    Dasselbe habe ich auch.

    Übrigens erhalte ich nur für 18 Parameter überhaupt einen Wert, 13 bleiben leer.

    Diese Werte werden befüllt:

    "Caption"

    "CurrentLanguage"

    "Description"

    "InstallableLanguages"

    "Manufacturer"

    "Name"

    "PrimaryBIOS"

    "ReleaseDate"

    "SerialNumber"

    "SMBIOSBIOSVersion"

    "SMBIOSMajorVersion"

    "SMBIOSMinorVersion"

    "SMBIOSPresent"

    "SoftwareElementID"

    "SoftwareElementState"

    "Status"

    "TargetOperatingSystem"

    "Version"

  • Hallo @Bitnugger !

    Vorab : Ich möchte dein Skript hier keinesfalls schlecht reden !!

    Es gibt aber einen Punkt, der für weniger versierte User kaum zu durchschauen ist :

    Bei : Global Enum $eBiosCharacteristics, $eBIOSVersion, ... , $eSizeOff

    wird $eSizeOff ja mit der Anzahl der Elemente der Aufzählung besetzt (hier 31).

    Kommentiert der User jetzt aber z.B. Zeilen wie :

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

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

    aus, dann wird bei :

    For $i = 0 To $eSizeOff - 1 Step 1

        ConsoleWrite(StringFormat('> %32s = %s\r', $g_aBIOSInfo[$i][0], $g_aBIOSInfo[$i][1]))

    Next

    trotzdem der Wert $eSizeOff=31 (Anzahl der Elemente der Aufzählung) verwendet. Das Array ist jetzt aber um 2 kürzer.
    Ergebnis : ==> Array variable has incorrect number of subscripts or subscript dimension range exceeded

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

    • Offizieller Beitrag

    Hier mal die Funktion von Bitnugger in einer von mir abgewandelten Version (Objektfehler werden abgefangen und das Array erst am Ende der Funktion erstellt: