Fehlermeldung seit Umstieg auf WINDOWS 8 64Bit

  • Guten Abend zusammen,

    ich habe da mal eine Frage an das Forum hier.

    Ich habe seit dem Umstieg auf Windows 8 bei meinem Backup Script den Effekt, dass eine Fehlermeldung zum Ende des Scripts auftaucht.

    Vorgeschichte:
    Das Script habe ich unter Win7 selbst 'gebaut'. Im Groben passiert folgfendes:
    Diverse Checks auf offene Dateine werden durchgefüht und ggf. geschlossen und wegkopiert.
    Ein Netzwerklaufwerk wird dismountet und letztlich ein Backup mittels eingebundenem ROBOCOPY auf einen externen Datenträger ausgeführt.
    Die letzte Aktion besteht darin, das robocopy log teilweise auszulesen und als Zusammenfassung in einer Messagebox anzuzeigen.
    (Anm: Auf der alten Win 7 32Bit Maschine funktioniert alles einwandfrei)

    Problem:
    Bei der Anzeige bzw. dem Berechnen der Messagebox kommt es jetzt zu der folgenden Fehlermeldung:

    Line 5762 (File "D:\.....")
    Error: Array variable has incorrect number of subscripts or subscript dimension range exceeded.

    Weiss ggf. jemand etwas dazu / kann es sein, dass eine Definition oder Parameter w/WIN8 64 Bit hinzugefügt werden muss ?

    Vielen Dank schon einmal im voraus
    mfg
    ugt100

    Zur Sicherheit hier der Script Snip dazu...

    Spoiler anzeigen


    x
    $file = FileOpen($cdeLogFile, 0)

    ;Check if file opened for reading OK
    If $file = -1 Then
    MsgBox(0, "Error", "Datei kann nicht geöffnet werden.")
    Exit
    EndIf

    ; File Actions
    ; count lines of log and calculate 10 lines up
    ; read 6th line for date (start) purposes + trim, read last line for date (end) purposes + trim
    ; calculate duration of the Script (Func _YourTimeStamp)

    $cdeCountLines = _FileCountLines($cdeLogFile)
    $cdeLast10Lines = $cdeCountLines - 10

    $cdeDateStart = FileReadLine($file,6)
    $cdeDateStart =StringMid($cdeDateStart, 13, 25)

    $cdeDateEnd = FileReadLine($file,-1)
    $cdeDateEnd = StringMid($cdeDateEnd, 12, 25)

    $cdeRunTime = "Duration : " & _DateDiff( 's',_YourTimeStamp($cdeDateStart), _YourTimeStamp($cdeDateEnd)) & " [sec]"
    FileClose($file)

    ;Array Actions (read log to array, create new array containing the last 11 lines)
    Local $aNewRecords[1]

    ;Delete Temp-File
    FileDelete(@Scriptdir & "\temp.txt")


    ;Open RobocopyLog and create Temp-File
    If Not _FileReadToArray($cdeLogFile, $aRecords) Then
    MsgBox(4096, "Fehler", "Fehler beim Einlesen der Datei in das Array Fehler:" & @error)
    Exit
    EndIf


    For $x = $cdeLast10Lines To $aRecords[0]
    _ArrayAdd($aNewRecords,StringStripWS($aRecords[$x], 3))
    _FileWriteFromArray(@Scriptdir & "\temp.txt",$aNewRecords)
    Next


    ;Adjust the file format
    _FileWriteToLine(@Scriptdir & "\temp.txt", 2," Total Copied Skipped Mismatch FAILED Extras", 1)
    FileClose(@Scriptdir & "\temp.txt")

    $cdeLine1 = FileReadLine(@Scriptdir & "\temp.txt", 1)
    $cdeLine2 = FileReadLine(@Scriptdir & "\temp.txt", 2)

    $cdeLine3 = FileReadLine(@Scriptdir & "\temp.txt", 3)
    $cdeLine3b = StringStripWS($cdeLine3, 4)
    $cdeLine3b = StringReplace($cdeLine3b, "Dirs : " & @TAB, "Dirs : ")
    $cdeLine3b = StringReplace($cdeLine3b, " ", @TAB)

    $cdeLine4 = FileReadLine(@Scriptdir & "\temp.txt", 4)
    $cdeLine4b = StringStripWS($cdeLine4, 4)
    $cdeLine4b = StringReplace($cdeLine4b, " ", @TAB)

    $cdeLine5 = FileReadLine(@Scriptdir & "\temp.txt", 5)
    $cdeLine5b = StringRegExpReplace($cdeLine5, "[m]", "")
    $cdeLine5b = StringRegExpReplace($cdeLine5b, "[g]", "")
    $cdeLine5b = StringRegExpReplace($cdeLine5b, "[k]", "")
    $cdeLine5b = StringStripWS($cdeLine5b, 4)
    $cdeLine5b = StringReplace($cdeLine5b, " ", @TAB)

    $cdeLine9 = FileReadLine(@Scriptdir & "\temp.txt", 9)
    $cdeLine9b = StringStripWS($cdeLine9, 4)
    $cdeLine9b = StringReplace($cdeLine9b, "Speed :", "Speed :" )
    $cdeLine9b = StringReplace($cdeLine9b, ":", ": " )

    $cdeLine10 = FileReadLine(@Scriptdir & "\temp.txt", 10) & @CRLF
    $cdeLine10b = StringStripWS($cdeLine10, 4)
    $cdeLine10b = StringReplace($cdeLine10b, "Speed :", "Speed : " & @TAB)

    $cdeLine11 = "Started : " & $cdeDateStart
    $cdeLine12 = "Ended : " & $cdeDateEnd
    $cdeLine13 = $cdeRunTime

    MsgBox(0,"Robocopy Log-Summary - " & $cdedateStart, $cdeLine2 & @CRLF & $cdeLine3b & @CRLF & $cdeLine4b & _
    @CRLF & $cdeLine5b & $cdeLine8 & @CRLF & $cdeLine9b & @CRLF & $cdeLine10b & @CRLF & $cdeLine11 &@CRLF & $cdeLine12 & @CRLF & $cdeLine13)
    ; $cdeLine1 & @CRLF & & @CRLF & $cdeLine6 & @CRLF & $cdeLine7

    FileDelete(@Scriptdir & "\temp.txt")
    WinActivate("Robocopy Log-Summary -", "")
    Exit


    ;Convert Date/Time of Start and End of Script
    Func _YourTimeStamp($sTimeStamp)
    Local $aTimeStamp = StringSplit($sTimeStamp, " :", 2)
    Local $sMon = ""
    Switch $aTimeStamp[1]
    Case "Jan"
    $sMon = "01"
    Case "Feb"
    $sMon = "02"
    Case "Mar"
    $sMon = "03"
    Case "Apr"
    $sMon = "04"
    Case "May"
    $sMon = "05"
    Case "Jun"
    $sMon = "06"
    Case "Jul"
    $sMon = "07"
    Case "Aug"
    $sMon = "08"
    Case "Sep"
    $sMon = "09"
    Case "Oct"
    $sMon = "10"
    Case "Nov"
    $sMon = "11"
    Case "Dec"
    $sMon = "12"
    EndSwitch
    Return StringFormat("%s/%s/%s %s:%s:%s", $aTimeStamp[6], $sMon, $aTimeStamp[2], $aTimeStamp[3], $aTimeStamp[4], $aTimeStamp[5])
    EndFunc ;~ ==>_YourTimeStamp4

    Einmal editiert, zuletzt von ugt100 (17. Januar 2013 um 10:56)

  • Sofern der Fehler wirklich im gezeigten Code Abschnitt entsteht würde ich mal in deiner Timestamp Funktion auf einen fehlerhaften Funktionsparameter prüfen. Du ermittelst den Timestamp durch auslesen aus der Logdatei, scheitert dies aus irgendwelchen gründen scheitert auch das Stringsplit innerhalb der Funktion, was letzten Endes beim Returnwert zu einer falschen Arrayadressierung führen kann.

    Zu prüfen wäre also konkret:

    - ist Stringsplit erfolgreich und liefert keinen Error Code
    - entspricht die Arraygröße (ubound) von $aTimeStamp dem letzten angesprochenen Index 6 +1 , also 7

    Wenn eines von beidem nicht der Fall ist solltest du dir den Wert des übergebenen Funktionsparameters $sTimeStamp in einer Fehlermeldung ausgeben lassen und ggf auch oben bevor die Funktion aufgerufen wird entsprechende Debugmeldungen einbauen.


    Ich würde im übrigen garnicht zeilenweise arbeiten. Lies doch einfach das ganze Logfile mit _filereadtoarray ein und arbeite dann mit arraysearch / arrayfindall oder geh das array in einer Schleife durch und nutzte stringinstr um die richtigen Zeilen zufinden. Etwas weiter unten liest du das Logfile ja sogar nochmal komplett ein wenn ich das recht gesehn habe, warum also nicht gleich so? Reduziert auch unnötige Lesezugriffe wenn man eine Datei nur einmalig einliest.

    Einmal editiert, zuletzt von misterspeed (4. Januar 2013 um 00:31)

  • Hallo Misterspeed,

    Danke schon mal für Deine prompte Antwort.
    Genau das was Du vorschlägst, habe ich mir auch vorgenommen (hoffe das ich es morgen schaffe und testen kann bzw. debuggen kann).
    Der Fehler kann eigentlich nur bei dieser Aktion anfallen, da alle anderen Schritte erfolgreich abgearbeitet werden (so z.B. das Schreiben des Timestamps in ein dafür vorgesehenes HTML File,
    welches dann auf einer Intranetseite veröffentlicht wird, oder auch die Checks auf offene Files usw...).
    Ich wundere mich nur über die Änderung als Solches, da - zumindest aus meinem Verständnis heraus - sich nichts geändert hat, wenn man mal von dem OS Wechsel (von Win7 auf Win8) absieht.

    Mal schauen - bei Interesse schreibe ich gerne von meinen Ergebnissen.

    mfg
    ugt100
    ugt100

  • Hallo Misterspeed,

    sorry für die etwas verspätete Antwort bzw. 'Report' den ich versprochen hatte ....

    Also das Problem ist gefixt und war im Nachgang betrachtet total simpel.
    Letztlich war der Effekt (Arrayvariablenfehler) dadurch bedingt, daß nach dem Umstieg auf Win8 (von Win7 kommend) auch ein Sprachenwechsel stattfand. Soll heissen
    das Win7 war ENGLISH und das WIN8 ist GERMAN. Somit ändert sich auch das robocopy Log in seinem Aufbau etwas - und das verursachte den 'Schmerz'.
    ich habe das jetzt angepasst und gut ist.

    DANKE nochmals für die Unterstützung.

    :rock::thumbup: