Kopieren mit Processbar

  • Hallo,

    nach dem ich in der Suche schon einiges in Sachen Kopieren von Dateien mit Processbar finden konnte komme ich doch nicht so richtig klar damit. Ich habe ein Beispielscript hier aus dem Forum in mein Script mit eingebaut. Leider bekomme ich den Fehler "Variable used withount being declared". Die Variablen sind aber gesetzt. Vielleicht kann mir einer von eich sagen wo mein Fehler ist. Hier mal der Teil von meinem Script wo ich den Fehler vermute

    [autoit]


    $Folder1 = "C:\Temp\gis-test"
    $Folder2 = "C:\test"

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

    Func CopyFolder($Folder1, $Folder2)
    Local $ProcID
    $ProcID = Run(@ComSpec & ' /c xcopy /e /h /y "' & $Folder1 & '" "' & $Folder2 & '"', "", @SW_HIDE)

    ProgressOn("Progress Meter", "")

    $origfilesize = DirGetSize($Folder1)
    Do

    $copyfilesize = DirGetSize($Folder2)

    $MBcopy = dirGetSize($Folder2) / 1024 / 1024

    $percent = $copyfilesize / $origfilesize * 100

    $decimalplace = Round ($percent)
    $decimalplaceMBcopy = Round ($MBcopy)

    ProgressSet ($percent, $decimalplace & "% " & "(" & _
    $decimalplaceMBcopy & ") Mb has been copied.")

    Sleep(500)
    Until NOT ProcessExists($ProcID)

    ProgressOff ()

    $copyfilesize = DirGetSize($Folder2)
    $MBorig = dirGetSize($Folder1) / 1024 / 1024
    $decimalplaceMBorig = Round ($MBorig)

    If $origfilesize = $copyfilesize then
    Msgbox(0,"Backup Complete", "All " & $decimalplaceMBcopy & " Mb of files and folders were copied successfully.")
    Else
    Msgbox(0,"Error", "The backup did not complete successfully. Only " & $decimalplaceMBcopy & " Mb of " & $decimalplaceMBorig & " Mb copied successfully.")
    EndIf

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

    EndFunc

    [/autoit]

    Der Fehler tritt in Zeile 7 auf.

    Danke für die Hilfe.
    Grüße
    Sebastian

  • Entschuldige ^^
    Meine Antwort war Falsch !
    Ich schau mir das Problem nochmal an. :D

    Edit:
    Bei mir funktioniert es, wenn du ein Global jeweils vor das deklarieren der Variablen setzt.

    [autoit]

    Global $Folder1 = "C:\Test"

    [/autoit]
  • Hallo,

    danke für die Hilfe aber auch damit klappt es nicht. Was allerdings komisch ist wenn ich nur diesen einen Teil des Scripts teste dann funktioniert es ?( Hier mal der komplette Code. Ich möchte eigentlich nur ein paar Datei als Update für ein Programm kopieren und dies soll der Anwender selbst bestimmen, da die Dateien insgesammt 200 MB groß sind.

    Spoiler anzeigen
    [autoit]


    #include<String.au3>
    #include<WindowsConstants.au3>
    #include<Misc.au3>

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

    #include <GUIConstantsEx.au3>
    #include <GUIConstants.au3>
    #include<string.au3>
    #include<Constants.au3>
    #include <GuiButton.au3>
    #include<String.au3>
    #Include <File.au3>
    #include<Process.au3>
    Opt('MustDeclareVars', 1)
    Opt("GUIOnEventMode", 1)
    Global $ExitID

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

    _Main()

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

    Func _Main()
    ;Initialize variables
    Local $GUIWidth = 300, $GUIHeight = 140
    Local $Button_1

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

    GUICreate("Update", $GUIWidth, $GUIHeight)
    GUICtrlCreateLabel ("Es wird nun ein Update auf Ihrem Computer installiert. Eine eventuell vorhandene Installation wird überschrieben",20, 20, 260, 60)
    $Button_1 = GUICtrlCreateButton ("Update starten" , 20, 90, 125, 20, 0)
    GUICtrlSetOnEvent($Button_1, "CopyFolder")
    $ExitID = GUICtrlCreateButton("cancel", 180, 90, 70, 20)
    GUICtrlSetOnEvent($ExitID, "onexit")

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

    GUISetOnEvent($GUI_EVENT_CLOSE, "onexit")

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

    GUISetState() ; display the GUI

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

    While 1
    Sleep(1000)
    WEnd
    EndFunc ;==>_Main

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

    Global $Folder1 = "C:\Temp\gis-test"
    Global $Folder2 = "C:\test"

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

    Func CopyFolder($Folder1, $Folder2)
    Local $ProcID
    $ProcID = Run(@ComSpec & ' /c xcopy /e /h /y "' & $Folder1 & '" "' & $Folder2 & '"', "", @SW_HIDE)

    ProgressOn("Progress Meter", "")

    $origfilesize = DirGetSize($Folder1)
    Do

    $copyfilesize = DirGetSize($Folder2)

    $MBcopy = dirGetSize($Folder2) / 1024 / 1024

    $percent = $copyfilesize / $origfilesize * 100

    $decimalplace = Round ($percent)
    $decimalplaceMBcopy = Round ($MBcopy)

    ProgressSet ($percent, $decimalplace & "% " & "(" & _
    $decimalplaceMBcopy & ") Mb has been copied.")

    Sleep(500)
    Until NOT ProcessExists($ProcID)

    ProgressOff ()

    $copyfilesize = DirGetSize($Folder2)
    $MBorig = dirGetSize($Folder1) / 1024 / 1024
    $decimalplaceMBorig = Round ($MBorig)

    If $origfilesize = $copyfilesize then
    Msgbox(0,"Backup Complete", "All " & $decimalplaceMBcopy & " Mb of files and folders were copied successfully.")
    Else
    Msgbox(0,"Error", "The backup did not complete successfully. Only " & $decimalplaceMBcopy & " Mb of " & $decimalplaceMBorig & " Mb copied successfully.")
    EndIf

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

    EndFunc

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

    Func onexit()

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

    Exit
    EndFunc ;==>OnExit

    [/autoit]

    Wenn du da noch mal drüber schauen könntest irgendwie bin ich blind und finde den Feher nicht.
    Vielen Dank.
    Sebastian

    Einmal editiert, zuletzt von Munsi1 (22. Oktober 2009 um 09:18)

  • Habe mal einiges geändert versuch das mal so...

    [autoit]

    #include<String.au3>
    #include<WindowsConstants.au3>
    #include<Misc.au3>

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

    #include <GUIConstantsEx.au3>
    #include <GUIConstants.au3>
    #include<string.au3>
    #include<Constants.au3>
    #include <GuiButton.au3>
    #include<String.au3>
    #Include <File.au3>
    #include<Process.au3>
    ;Opt('MustDeclareVars', 1)
    ;Opt("GUIOnEventMode", 1)
    Global $ExitID

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

    Global $Folder1 = 'C:\Temp\gis-test'
    Global $Folder2 = 'C:\test'

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

    ;Initialize variables
    Local $GUIWidth = 300, $GUIHeight = 140
    Local $Button_1

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

    GUICreate("Update", $GUIWidth, $GUIHeight)
    GUICtrlCreateLabel ("Es wird nun ein Update auf Ihrem Computer installiert. Eine eventuell vorhandene Installation wird überschrieben",20, 20, 260, 60)
    $Button_1 = GUICtrlCreateButton ("Update starten" , 20, 90, 125, 20, 0)
    ;GUICtrlSetOnEvent($Button_1, '_CopyFolder', $Folder1, $Folder2)
    $ExitID = GUICtrlCreateButton("cancel", 180, 90, 70, 20)

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

    GUISetState(@SW_SHOW) ; display the GUI

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit

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

    case $Button_1
    _CopyFolder($Folder1, $Folder2)
    EndSwitch
    WEnd

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

    Func _CopyFolder($Folder1, $Folder2)
    Local $ProcID
    $ProcID = Run(@ComSpec & ' /c xcopy /e /h /y "' & $Folder1 & '" "' & $Folder2 & '"', "", @SW_HIDE)

    ProgressOn("Progress Meter", "")

    $origfilesize = DirGetSize($Folder1)
    Do

    $copyfilesize = DirGetSize($Folder2)

    $MBcopy = dirGetSize($Folder2) / 1024 / 1024

    $percent = $copyfilesize / $origfilesize * 100

    $decimalplace = Round ($percent)
    $decimalplaceMBcopy = Round ($MBcopy)

    ProgressSet ($percent, $decimalplace & "% " & "(" & _
    $decimalplaceMBcopy & ") Mb has been copied.")

    Sleep(500)
    Until NOT ProcessExists($ProcID)

    ProgressOff ()

    $copyfilesize = DirGetSize($Folder2)
    $MBorig = dirGetSize($Folder1) / 1024 / 1024
    $decimalplaceMBorig = Round ($MBorig)

    If $origfilesize = $copyfilesize then
    Msgbox(0,"Backup Complete", "All " & $decimalplaceMBcopy & " Mb of files and folders were copied successfully.")
    Else
    Msgbox(0,"Error", "The backup did not complete successfully. Only " & $decimalplaceMBcopy & " Mb of " & $decimalplaceMBorig & " Mb copied successfully.")
    EndIf

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

    EndFunc

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

    Func onexit()

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

    Exit
    EndFunc

    [/autoit]

    lg SubZero ;)
    ==========================================================================

    "Der Computer ist die logische Weiterentwicklung des Menschen: Intelligenz ohne Moral."

  • Hey,
    so weit ich weiss kann man bei :

    [autoit]

    GUICtrlSetOnEvent

    [/autoit]


    kein parameter übergeben konnte nichts finden aber ich bin ja auch nicht so fit ;)

    lg SubZero ;)
    ==========================================================================

    "Der Computer ist die logische Weiterentwicklung des Menschen: Intelligenz ohne Moral."

  • Versuchs mal so:

    Spoiler anzeigen
    [autoit]

    #include<String.au3>
    #include<WindowsConstants.au3>
    #include<Misc.au3>

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

    #include <GUIConstantsEx.au3>
    #include <GUIConstants.au3>
    #include<string.au3>
    #include<Constants.au3>
    #include <GuiButton.au3>
    #include<String.au3>
    #Include <File.au3>
    #include<Process.au3>
    Opt('MustDeclareVars', 1)
    Opt("GUIOnEventMode", 1)
    Global $ExitID, $Folder1, $Folder2

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

    _Main()

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

    Func _Main()
    ;Initialize variables
    Local $GUIWidth = 300, $GUIHeight = 140
    Local $Button_1

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

    GUICreate("Update", $GUIWidth, $GUIHeight)
    GUICtrlCreateLabel ("Es wird nun ein Update auf Ihrem Computer installiert. Eine eventuell vorhandene Installation wird überschrieben",20, 20, 260, 60)
    $Button_1 = GUICtrlCreateButton ("Update starten" , 20, 90, 125, 20, 0)
    GUICtrlSetOnEvent($Button_1, "_CallCF")
    $ExitID = GUICtrlCreateButton("cancel", 180, 90, 70, 20)
    GUICtrlSetOnEvent($ExitID, "onexit")

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

    GUISetOnEvent($GUI_EVENT_CLOSE, "onexit")

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

    GUISetState() ; display the GUI

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

    While 1
    Sleep(1000)
    WEnd
    EndFunc ;==>_Main

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

    Func _CallCF()
    $Folder1 = "C:\Temp\gis-test"
    $Folder2 = "C:\test"
    CopyFolder($Folder1, $Folder2)
    EndFunc
    Func CopyFolder($Folder1, $Folder2)
    Local $ProcID, $origfilesize, $copyfilesize, $MBcopy, $percent, $decimalplace, $decimalplaceMBcopy, $MBorig, $decimalplaceMBorig
    $ProcID = Run(@ComSpec & ' /c xcopy /e /h /y "' & $Folder1 & '" "' & $Folder2 & '"', "", @SW_HIDE)

    ProgressOn("Progress Meter", "")

    $origfilesize = DirGetSize($Folder1)
    Do

    $copyfilesize = DirGetSize($Folder2)

    $MBcopy = dirGetSize($Folder2) / 1024 / 1024

    $percent = $copyfilesize / $origfilesize * 100

    $decimalplace = Round ($percent)
    $decimalplaceMBcopy = Round ($MBcopy)

    ProgressSet ($percent, $decimalplace & "% " & "(" & _
    $decimalplaceMBcopy & ") Mb has been copied.")

    Sleep(500)
    Until NOT ProcessExists($ProcID)

    ProgressOff ()

    $copyfilesize = DirGetSize($Folder2)
    $MBorig = dirGetSize($Folder1) / 1024 / 1024
    $decimalplaceMBorig = Round ($MBorig)

    If $origfilesize = $copyfilesize then
    Msgbox(0,"Backup Complete", "All " & $decimalplaceMBcopy & " Mb of files and folders were copied successfully.")
    Else
    Msgbox(0,"Error", "The backup did not complete successfully. Only " & $decimalplaceMBcopy & " Mb of " & $decimalplaceMBorig & " Mb copied successfully.")
    EndIf

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

    EndFunc

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

    Func onexit()

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

    Exit
    EndFunc ;==>OnExit

    [/autoit]

    Ich habe einfach (neben ein paar zusätzlichen variablendeklarationen) einfach eine Funktion erstellt, die CopyFolder mit parametern aufruft. Da du guictrlsetonevent nicht selbst mit parametern benutzen kannst, musst du ein bisschen erfinderisch werden ;)

    Edit: musste noch Folder1 und folder2 in die _CallCF schreiben - sonst klappts ja nich ^^

  • also was mal definitiv falsch ist:

    [autoit]


    $Folder1 = "C:\Temp\gis-test"
    $Folder2 = "C:\test"

    [/autoit]

    gehört viel weiter oben hin, weil du sonst '' nach '' kopiert und das dauert immer^^


    bei
    Func _CopyFolder($Folder1, $Folder2)

    brauchst du egtl die beiden parameter nicht. diese _CopyFolder() denk ich reicht in deinem fall. wenn du parameter willst oder brauchst musst du den getmessage mode oder den umweg wie seubo beschrieben hat nehmen.

    deine funktion selber läuft bei mir auch nicht. ich glaube das das kopieren mit FileCopy wesentlich leichter wäre. aber da kenn ich mich wahrscheinlich zu wenig aus

  • Was hälst du von der version die ich für dich gemacht habe die funktioniert?

    lg SubZero ;)
    ==========================================================================

    "Der Computer ist die logische Weiterentwicklung des Menschen: Intelligenz ohne Moral."

  • Hallo,

    vielen Dank für die schnelle Hilfe. Es gehen beide Version von subzero007 und SEuBo. Danke euch beiden für euere Mühe. Ich werd mir das ganze jetzt nochmal in Ruhe zur Gemüte führen um zu Verstehen wie ihr es gemacht habt. Bin ja noch nicht so fit in Sachen AutoIt.

    Grüße
    Sebastian

  • also was mal definitiv falsch ist:

    [autoit]


    $Folder1 = "C:\Temp\gis-test"
    $Folder2 = "C:\test"

    [/autoit]

    gehört viel weiter oben hin, weil du sonst '' nach '' kopiert und das dauert immer^^


    Jo is mir dann auch ein paar minütchen nach dem posten aufgefallen. Also entweder packt man die deklaration noch in die Funktion, oder man macht es direkt beim globalen deklarieren in zeile 15.
    Existieren bei dir auch Folder1 und Folder2 auf der festplatte? weil wenn nicht, bleibt der balken bei mir auch stehen. Hat aber nachdem ich die Ordner erstellt habe dann auch funktioniert...

    @Munsi1: Gerne doch :D Dafür ist das Forum ja da.
    Gruß

  • Zitat

    Existieren bei dir auch Folder1 und Folder2 auf der festplatte? weil wenn nicht, bleibt der balken bei mir auch stehen. Hat aber nachdem ich die Ordner erstellt habe dann auch funktioniert...

    Ja die Ordner existieren. Das er der Balken dann stehen bleibt habe ich schon bemerkt als ich vergessen hatte die Ordner für einen Test anzulegen. Trotzdem Danke für den Hinweis. Ich werde jetz mal versuchen die Processbar auch beim löschen von Dateien anzuziegen. Müßte ja im Prinzip das gleiche sein wie beim kopieren?

    Grüße
    Sebastian


  • Ja die Ordner existieren...

    War eigentlich an subzero007 gerichtet :P

    Naja egal,
    Hier - ich hab übrigens langeweile gehabt - jetzt hast du auch die abfrage eingabeut ob das Verzeichniss zum kopieren vorhanden ist.

    Wenns beim löschen probleme gibts kannste dich ja melden ^^

    Spoiler anzeigen
    [autoit]

    #include<String.au3>
    #include<WindowsConstants.au3>
    #include<Misc.au3>
    #include <Process.au3>
    #include <GUIConstantsEx.au3>
    #include <GUIConstants.au3>
    #include<string.au3>
    #include<Constants.au3>
    #include <GuiButton.au3>
    #include<String.au3>
    #Include <File.au3>
    #include<Process.au3>
    Opt('MustDeclareVars', 1)
    Opt("GUIOnEventMode", 1)
    Global $ExitID, $Folder1, $Folder2

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

    _Main()

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

    Func _Main()
    ;Initialize variables
    Local $GUIWidth = 300, $GUIHeight = 140
    Local $Button_1

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

    GUICreate("Update", $GUIWidth, $GUIHeight)
    GUICtrlCreateLabel ("Es wird nun ein Update auf Ihrem Computer installiert. Eine eventuell vorhandene Installation wird überschrieben",20, 20, 260, 60)
    $Button_1 = GUICtrlCreateButton ("Update starten" , 20, 90, 125, 20, 0)
    GUICtrlSetOnEvent($Button_1, "_CallCF")
    $ExitID = GUICtrlCreateButton("cancel", 180, 90, 70, 20)
    GUICtrlSetOnEvent($ExitID, "onexit")

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

    GUISetOnEvent($GUI_EVENT_CLOSE, "onexit")

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

    GUISetState() ; display the GUI

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

    While 1
    Sleep(1000)
    WEnd
    EndFunc ;==>_Main

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

    Func _CallCF()
    $Folder1 = "C:\Temp\gis-test"
    $Folder2 = "C:\test"
    CopyFolder()
    EndFunc
    Func CopyFolder()
    Local $err, $ProcID, $origfilesize, $copyfilesize, $MBcopy, $percent, $decimalplace, $decimalplaceMBcopy, $MBorig, $decimalplaceMBorig

    $err = _RunDOS("dir " & $Folder1);schau ob das verzeichnis existiert
    If $err = 0 then ; wenn ja, fahre fort.

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

    $ProcID = Run(@ComSpec & ' /c xcopy /e /h /y "' & $Folder1 & '" "' & $Folder2 & '"', "", @SW_HIDE)
    ProgressOn("Progress Meter", "")
    $origfilesize = DirGetSize($Folder1)

    Do
    $copyfilesize = DirGetSize($Folder2)
    $MBcopy = dirGetSize($Folder2) / 1024 / 1024
    $percent = $copyfilesize / $origfilesize * 100

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

    $decimalplace = Round ($percent)
    $decimalplaceMBcopy = Round ($MBcopy)

    ProgressSet ($percent, $decimalplace & "% " & "(" & _
    $decimalplaceMBcopy & ") Mb has been copied.")

    Sleep(500)
    Until NOT ProcessExists($ProcID)

    ProgressOff ()

    $copyfilesize = DirGetSize($Folder2)
    $MBorig = dirGetSize($Folder1) / 1024 / 1024
    $decimalplaceMBorig = Round ($MBorig)

    If $origfilesize = $copyfilesize then
    Msgbox(0,"Backup Complete", "All " & $decimalplaceMBcopy & " Mb of files and folders were copied successfully.")
    Else
    Msgbox(0,"Error", "The backup did not complete successfully. Only " & $decimalplaceMBcopy & " Mb of " & $decimalplaceMBorig & " Mb copied successfully.")
    EndIf
    Else ;Wenn nicht..
    MsgBox(48,"Error","Updater could not find the folder to copy."&@CRLF&"Please make sure you did succesfully"&@CRLF&"download the update and try again.")
    EndIf
    EndFunc

    [/autoit]
  • Hallo,

    danke SEuBo für Abfrage. Ich denke die werde ich auch mit übernehmen. Kann ja doch mal passieren das der Ordner nicht exisitiert. Das mit dem löschen habe ich recht einfach gelöst. Ich schmeiß die alten Dateien einfach in den Papierkorb. Ist die schnellste Möglichkeit die ich kenne um 245 MB zu beseitigen. Hab dazu diesen Befehl genutzt

    [autoit]


    FileRecycle("C:\test")

    [/autoit]

    Danach lass ich einfach einen neuen Ordner anlegen. Ist vielleicht nicht ganz sauber aber mir viel nichts besser ein um die Wartezeit für den Anwender gering zu halten. Ein richtiges löschen dauert ja leider recht lang (zumindest die Befehler die ich kenne).

    Grüße
    Sebastian

  • Hallo!

    Dein Fehler ist, dass du das MustDeclareVars-Flag setzt.
    Heißt der Compiler oder Interpreter achtet darauf, dass alle Variablen, die du benutzt, deklariert sind.
    Lösche einfach die Zeile

    [autoit]

    Opt("MustDeclareVars", 1)

    [/autoit]

    aus deinem Skript, und gut ist.
    Außerdem solltest du die beiden Variablen zuvor als Global definieren.

    Viel Erfolg!

  • Hallo,

    danke für die Info, damit konnte ich das Löschen beschleunigen und die Dateien lungern nicht im Papierkorb rum :D

    Grüße
    Sebastian