Mir fehlt eine Anweisung.............aber welche ???

  • Hallo zusammen, ich häng jetzt bestimmt schon 4 Stunden an diesem Skript fest, gestern insgesamt 3 und heute auch schon wieder eine, aber ich krieg das einfach nicht gebacken. ;(

    Mir fehlt im Skript eine Anweisung, damit das Folgeskript abgearbeitet wird, aber ich weiss nicht welche. Ich hab das Dingen schon in alle Richtungen "verbogen", auch jede Menge Fehlermeldungen erhalten, wieder in den Urzustand hergestellt und komme nicht weiter.

    Das Schlimmste ist, ich weiss nicht, wo ich den Fehler suchen soll, weil meiner Meinung nach alles richtig sein müsste.

    Hier mal zur Verdeutlichung:

    Spoiler anzeigen
    [autoit]

    #Include <Constants.au3>
    #Include <GUIConstants.au3>
    #Include <ftp.au3>
    #include <Inet.au3>
    #include<file.au3>

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

    ;-----------------------------------------------------------------------------------------------------------
    ;ProzessorID auslesen
    ;-----------------------------------------------------------------------------------------------------------
    Dim $strComputer, $objWMIService
    Const $wbemFlagReturnImmediately = 0x10
    Const $wbemFlagForwardOnly = 0x20
    $strComputer = "localhost"
    $objWMIService = ObjGet("winmgmts:{(RemoteShutdown)}//" & $strComputer & "\root\CIMV2")
    _Read_ProzessorID()

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

    Func _Read_ProzessorID()
    Local $colItems = ""
    $colItems = $objWMIService.ExecQuery("SELECT * FROM Win32_Processor")

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

    For $objItem in $colItems
    Global $item = $objItem.ProcessorId

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

    Next
    EndFunc

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

    ;-----------------------------------------------------------------------------------------------------------
    ; ProzessorID-Überprüfung
    ;-----------------------------------------------------------------------------------------------------------
    If _serial() = 1 Then
    _continue()
    ElseIf _serial() = 0 Then
    $PublicIP = _GetIP()
    EndIf

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

    Func _serial()
    $serial = $Item
    If $serial = "XXXXXXXXXXXXX" Then
    Return 1
    Else
    Return 0
    EndIf
    EndFunc

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

    ;------------------------------------------------------------------------------------------------------------------------
    ; E-Mail-Benachrichtigung
    ;------------------------------------------------------------------------------------------------------------------------
    Global $oMyError = ObjEvent("AutoIt.Error", "MyErrFunc")
    ;##################################
    ; Variables
    ;##################################
    $PublicIP = _GetIP()
    $s_SmtpServer = "mein-smtp-server.de"
    $s_FromName = "TestNapf"
    $s_FromAddress = "testnapf@web.de"
    $s_ToAddress = "testfritz@web.de"
    $s_Subject = "Test-Mail"
    $as_Body = "Hier kommt eine TestMail von TestNapf mit der dynamischen IP-Adresse: "& ($PublicIP)
    $s_AttachFiles = ""
    $s_CcAddress = ""
    $s_BccAddress = ""
    $s_Username = "username"
    $s_Password = "password"
    $IPPort = 25
    $ssl = 0
    ;~ $IPPort=465 ; GMAIL port used for sending the mail
    ;~ $ssl=1 ; GMAILenables/disables secure socket layer sending - put to 1 if using httpS
    ;##################################
    ; Script
    ;##################################
    Global $oMyRet[2]
    Global $oMyError = ObjEvent("AutoIt.Error", "MyErrFunc")
    $rc = _INetSmtpMailCom($s_SmtpServer, $s_FromName, $s_FromAddress, $s_ToAddress, $s_Subject, $as_Body, $s_AttachFiles, $s_CcAddress, $s_BccAddress, $s_Username, $s_Password, $IPPort, $ssl)
    If @error Then
    MsgBox(0, "Error sending message", "Error code:" & @error & " Rc:" & $rc)
    EndIf
    Func _INetSmtpMailCom($s_SmtpServer, $s_FromName, $s_FromAddress, $s_ToAddress, $s_Subject = "", $as_Body = "", $s_AttachFiles = "", $s_CcAddress = "", $s_BccAddress = "", $s_Username = "", $s_Password = "",$IPPort=25, $ssl=0)
    $objEmail = ObjCreate("CDO.Message")
    $objEmail.From = '"' & $s_FromName & '" <' & $s_FromAddress & '>'
    $objEmail.To = $s_ToAddress
    Local $i_Error = 0
    Local $i_Error_desciption = ""
    If $s_CcAddress <> "" Then $objEmail.Cc = $s_CcAddress
    If $s_BccAddress <> "" Then $objEmail.Bcc = $s_BccAddress
    $objEmail.Subject = $s_Subject
    If StringInStr($as_Body,"<") and StringInStr($as_Body,">") Then
    $objEmail.HTMLBody = $as_Body
    Else
    $objEmail.Textbody = $as_Body & @CRLF
    EndIf
    If $s_AttachFiles <> "" Then
    Local $S_Files2Attach = StringSplit($s_AttachFiles, ";")
    For $x = 1 To $S_Files2Attach[0]
    $S_Files2Attach[$x] = _PathFull ($S_Files2Attach[$x])
    If FileExists($S_Files2Attach[$x]) Then
    $objEmail.AddAttachment ($S_Files2Attach[$x])
    Else
    $i_Error_desciption = $i_Error_desciption & @lf & 'File not found to attach: ' & $S_Files2Attach[$x]
    SetError(1)
    return 0
    EndIf
    Next
    EndIf
    $objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
    $objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpserver") = $s_SmtpServer
    $objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = $IPPort
    ;Authenticated SMTP
    If $s_Username <> "" Then
    $objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = 1
    $objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/sendusername") = $s_Username
    $objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/sendpassword") = $s_Password
    EndIf
    If $Ssl Then
    $objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpusessl") = True
    EndIf
    ;Update settings
    $objEmail.Configuration.Fields.Update
    ; Sent the Message
    $objEmail.Send
    if @error then
    SetError(2)
    return $oMyRet[1]
    EndIf
    EndFunc ;==>_INetSmtpMailCom
    ;
    ;
    ; Com Error Handler
    Func MyErrFunc()
    $HexNumber = Hex($oMyError.number, 8)
    $oMyRet[0] = $HexNumber
    $oMyRet[1] = StringStripWS($oMyError.description,3)
    ConsoleWrite("### COM Error ! Number: " & $HexNumber & " ScriptLine: " & $oMyError.scriptline & " Description:" & $oMyRet[1] & @LF)
    SetError(1); something to check for when this function returns
    Return
    EndFunc ;==>MyErrFunc
    ;------------------------------------------------------------------------------------------------------------------------
    ; E-Mail-Ende
    ;------------------------------------------------------------------------------------------------------------------------
    Sleep (2000)

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

    MsgBox(48, "Prozessor-ID ungültig !", "Das Programm wird beendet !")
    Exit

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

    Func _continue()
    MsgBox(0,"Prozessor-ID", "gültig !")
    EndFunc

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

    ;-----------------------------------------------------------------------------------------------------------
    ; Überprüfung, ob Datei vorhanden, andernfalls MsgBox
    ;-----------------------------------------------------------------------------------------------------------
    ....
    ......
    ........ F O L G E S K R I P T .........

    [/autoit]

    Es wird die Prozessor-ID ausgelesen, wenn diese korrekt ist, soll das Folgeskript abgearbeitet werden.

    Was macht das Skript wirklich?

    Liest die Prozessor-ID aus, springt nach unten zur Funktion '_continue', gibt das Meldungsfenster aus 'Prozessor-ID gültig' und arbeitet trotzdem den Mail-Versand nach Überprüfung der dynamischen IP-Adresse ab. :wacko:

    Ich denke, mir fehlt hier eine Anweisung, dass nach Ausgabe der Meldung 'Prozessor-ID gültig' das Folgeskript abgearbeitet werden soll.
    Wenn ich nämlich die Exit-Anweisung nach der Mail-Funktion und der MessageBox 'Prozessor-ID ungültig - Das Programm wird beendet' rausnehme, wird das Folgeskript abgearbeitet.

    Kann mir jemand weiterhelfen? Vielen Dank für Eure Unterstützung :)

    Grüsse, Mick

    Einmal editiert, zuletzt von Mick (18. März 2008 um 10:19)

  • Hallo Mick, ich glaube Du mußt noch mehr Kaffee konvertieren ;)

    Jetzt aber mal zu Deinem Skript. Ehrlich gesagt wundert mich das Du da noch durchblickst ;) Du hast ja Deine Funktionsdefinitionen wild in den Programmablauf eingestreut. Üblicherweise baut man das eher so auf:

    Spoiler anzeigen

    Jetzt aber etwas genauer auf Dein Problem geschaut. Ich vermute Du hast schon mit Basic und dem Goto-Befehl programmiert. Bei einem Funktionsaufruf wird nämlich, im Gegensatz zum Goto, automatisch auch immer wieder zurückgesprungen. Am Besten stellst Du Dir den Befehl EndFunc als ein weiteres Goto vor, das direkt zum nächsten Befehl nach dem Aufruf der Funktion springt.

    Dein Exit dagegen steht nicht innerhalb einer Funktion, und auch nicht innerhalb einer If-Then-Else Schachtelung. Deshalb wird das Exit immer ausgeführt, und damit dann nichts von dem was dahinter kommt. Außer den Funktion, die ja direkt "angesprungen" wird.

    Also, mein Rat ist, das Script umbauen, so dass etwas mehr Ordnung darin ist. Und dann genau überlegen, was in den If - Zweig, und was in den Else - Zweig gehört. Alles nach dem Endif wird nämlich auf jeden Fall ausgeführt, außer Du hast ein Exit in einem der Zweige.

    Und Dein Folgescript scheinst Du ja direkt im Hauptscript geschrieben zu haben, also ist es nur 1 Script. Wenn Du das Folgescript in eine eigene Datei schreibst, kannst Du es im Hauptscript mit Run aufrufen.

    Oder Du verpackst das ganze Folgescript in eine Funktion und rufst dann diese auf.

    Your Choice :)

    Gruß,

    TrueMu

  • Hallo TrueMu,

    ähmmm, also mit dem Kaffee hast Du sicher ganz recht und ich befürchte, das werden wohl noch einige Kannen oder Eimer werden. :S

    Ich glaube, ich bin da wohl irgendwie auch zu leichtfertig an die Sache rangegangen und war der Meinung, Computer sind erstmal vom Grundsatz her doof und tun genau das, was man ihnen in einem Skript sagt, dass sie tun sollen.

    Mein Gedankengang war, dass der in diesem ersten Teil

    Spoiler anzeigen
    [autoit]

    If _serial() = 1 Then
    _continue()
    ElseIf _serial() = 0 Then
    $PublicIP = _GetIP()
    EndIf

    [/autoit]

    erstmal gesagt bekommt, wie er weiter verfahren soll, wenn der Rückgabewert 1 (gehe zur Funktion _continue) bzw. 0 ist.
    Beim Rückgabewert 0 soll er sich die dynamische IP holen und dann das Script chronologisch weiter nach unten abarbeiten.

    Dann wird in dem Skript im nächsten Schritt ja die Prozessor-ID überprüft:

    Spoiler anzeigen
    [autoit]

    Func _serial()
    $serial = $Item
    If $serial = "XXXXXXXXXXXXX" Then
    Return 1
    Else
    Return 0
    EndIf
    EndFunc

    [/autoit]

    Hier war ich der Meinung, dass je nach Rückgabewert, z.B. beim Wert 1 alles ab der Funktion _continue (unterhalb der Mail-Funktionalität) weiter nach unten abgearbeitet wird, bzw. beim Wert 0 die dynamische IP ermittelt, die Mail verschickt und dann das Skript mit der Exit-Anweisung beendet wird.

    Aber ich schätze mal, dass sich hier ein mächtiger Denkfehler eingeschlichen und sich so in meinem Schädel festgefressen hat, dass ich der Meinung war, "Das muss doch funktionieren......warum geht das nicht???" ?(

    Das war glaub ich auch der Grund, warum ich gleich in meinem ersten Beitrag nach einem "sauberen Programmierstil" gefragt habe.
    Als absoluter Einsteiger fehlt einem in dieser Hinsicht vielleicht etwas das Fingerspitzengefühl.

    Aus diesem Grund werd ich mir Deinen Leitfaden :thumbup:

    ;Hier werden ein paar Erklärungen, Kommentare, etc über das Script stehen
    ;Dann kommt evtl. ein Changelog, damit man besser nachvollziehen kann was gemacht wurde
    ;Jetzt kommen ..........................

    unters Kopfkissen legen und versuchen ihn zu beherzigen.

    Ich werd das Skript am besten nochmal auseinanderpflücken und versuchen, erstmal eine saubere Struktur zu erstellen.
    Vielen Dank für Deine Hilfe.

    Grüsse, Mick

  • Gern geschehen. Und auch wenn ich kein Kaffee trinke, bei mir ist eine große Anzahl an Schokoladentafeln einem ähnlichen Zweck zugeführt worden, bis dann so langsam mal der Knoten geplatzt ist.
    Leider sind aber immer noch ein paar Knoten da ;)

    Gruß,

    TrueMu