Vergleich von 2 Werten

  • Moin,

    wiedereinmal melde ich mich zurück, was sicherlich wieder nur eine Kinderspiel ist. Dennoch sehe ich nicht wo mein Fehler liegt :sleeping:
    Ich wollte gerne einen Wert aus der Registry mit einem vorgegebenen vergleichen. Wenn sie übereinstimmen soll etwas in eine Datei geschrieben werden.

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>
    #include <File.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Global $auswertung = @ScriptDir & "\auswertung.csv"
    FileOpen ($auswertung , 1)
    Global $lpt = "winspool,LPT1:,15,45"
    For $i = 1 to 100
    $var = RegEnumVal("HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\PrinterPorts", $i);Liest den Schlüssel
    If @error <> 0 Then ExitLoop
    If $var = "Lexmark E240 (Kopie 1)" Then
    $wert = RegRead("HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\PrinterPorts", $var);Liest den Wert des Schlüssels
    ;MsgBox(4096, "Ordner für Programme:", $wert)
    If $wert = $lpt then
    FileWrite($auswertung, $var & ";" & "LPT1")
    EndIf
    EndIf
    next
    FileClose($auswertung)

    [/autoit]


    Passieren tut da nichts. Habe schon paar mal 2 Werte verglichen - aber diesmal kommt irgendwie nichts bei rum.

  • Sicher, dass beim RegRead nicht irgendwo noch Leerzeichen oder ähnliches drin sind?

    Btw.: Ist in AutoIt zwar egal, aber Werte vergleichen eigentlich mit ==


  • Nein, da gibts einen Unterschied, eins davon ist ein Stringvergleich, das andere ist ein Zahlenvergleich.


    Hab ich noch nie was von gemerkt:

    [autoit]

    $var="2"
    $var1=2
    If $var=$var Then ConsoleWrite("True 1"&@CRLF)
    If $var==$var Then ConsoleWrite("True 2"&@CRLF)
    If $var1=$var Then ConsoleWrite("True 3"&@CRLF)
    If $var1==$var Then ConsoleWrite("True 4"&@CRLF)

    [/autoit]
  • Nein, "=" kann man ja schließlich auch zum Stringvergleich verwenden... Laut Hilfe ist der "=" Operator für Zahlen- und Stringvergleiche geeignet, während der "==" Operator nur für Stringvergleiche verwendet werden sollte. Allerdings berücksichtigt "==" die Groß- und Kleinschreibnung, was "=" nicht macht ;).

  • Ich verwende zum Vergleich generell == vor allem weils in jeder normalen Programmiersprache so ist und hatte noch nie Probleme.

  • Zitat

    Sicher, dass beim RegRead nicht irgendwo noch Leerzeichen oder ähnliches drin sind?

    Btw.: Ist in AutoIt zwar egal, aber Werte vergleichen eigentlich mit ==

    Ja, bin ich mir sicher. Daher hatte ich ja erst die Messagebox eingebaut um das zu prüfen! Den Wert den ich vergleichen möchte bekomme ich ja.
    Mag es damit zusammenhängen dass darin ; und , drin vorkommen? If not funktioniert in dem Zusammenhang nämlich auch nicht.
    Habe sowohl = als auch == ausprobiert ;)

  • In ner MsgBox erkennst du aber eventuelle Leerzeichen schlecht/garnicht.
    Schreib doch mal beide Werte in eine .txt raus

  • Ich verwende zum Vergleich generell == vor allem weils in jeder normalen Programmiersprache so ist und hatte noch nie Probleme.

    Musst da aber aufpassen dass die implizite Stringumwandlung dir da nicht das Ergebnis verfälscht.
    Beispiel der Auswirkung auf Nicht-Stringtypen:

    Spoiler anzeigen
    [autoit]

    MsgBox(0,"einfaches =", 1000 = True)
    MsgBox(0,"doppeltes ==", 1000 == True)

    [/autoit]


    Auch wenn man z.B. Zahlenwerte als String vorliegen hat (z.B. aus der Registry oder ner Datei gelesen) dann wäre ein numerischer Vergleich wohl eher angebracht als ein Stringvergleich:

    Spoiler anzeigen
    [autoit]

    MsgBox(0,"einfaches =", 100.1 = "100.10")
    MsgBox(0,"doppeltes ==", 100.1 == "100.10")

    [/autoit]


    Der Grund für das ganze ist das AutoIt von der Syntax an BASIC angelehnt ist (was ich auch als "normale" Programmiersprache ansehe). Daher wurden auch die Operatoren entsprechend verwendet. AutoIt unterscheidet sich daher von den "normalen" Programmiersprachen weil BASIC sich von ihnen unterscheidet.
    Ansonsten frisst die Typumwandlung Rechenzeit, weswegen bei Nicht-Stringtypen das einfache = schneller ist (sicherlich ist die Dimension der Auswirkung aber zu vernachlässigen und das ganze krümelkackrig - aber messbar ;) :(

    Spoiler anzeigen
    [autoit]

    Global Const $N = 1000000
    Global $iT

    [/autoit] [autoit][/autoit] [autoit]

    $iT = TimerInit()
    For $i=1 To $N
    If 1000 = 1001 Then ConsoleWrite($i)
    Next
    $iT = TimerDiff($iT) / $N
    ConsoleWrite("Ausführungszeit einfaches = : " & Round($iT,4) & "ms" & @CRLF)

    [/autoit] [autoit][/autoit] [autoit]

    $iT = TimerInit()
    For $i=1 To $N
    If 1000 == 1001 Then ConsoleWrite($i)
    Next
    $iT = TimerDiff($iT) / $N
    ConsoleWrite("Ausführungszeit doppeltes == : " & Round($iT,4) & "ms" & @CRLF)

    [/autoit]

    Scritch
    Wie Milla schon schrieb solltest du den RegWert lieber mit Consolewrite ausgeben und diesen dann direkt per Copy & Paste in dein Skript eintragen.
    Alternativ könntest du noch StringInStr versuchen - damit wäre es egal ob irgendwo davor oder dahinter Steuerzeichen existieren.

    2 Mal editiert, zuletzt von AspirinJunkie (22. Dezember 2010 um 13:48)