CMD Robocopy

  • hallo Zusammen,

    ich habe eine Frage und hoffe auf Hilfe. Ich hoffe auch, dass man dieses lösen kann.

    Ich habe ein Tool geschrieben, welches ganz banal einen Ordner in einen anderen Ordner kopiert.
    Dieses mit Hilfe von Robocopy.

    Hier der Befehl:

    $rob = RunWait("robocopy " & chr(34) & $quelle &chr(34) & " " & chr(34) & $ziel & chr(34) & " /MIR /R:3 /W:10", "" ,@SW_HIDE)

    Nun läuft alles super :)

    Nun meine Frage: Kann ich nun abfragen, was der liebe Robocopy gerade für eine Datei in der Hand hält und bearbeitet?
    Ich stelle mir das in meiner GUI folgendermaßen vor: Ich habe ein Textfeld und da drin wird immer reingeschrieben,
    welche Datei oder Ordner der gerade behandelt. Zum Beispiel "Kopiere gerade: autoit.exe" usw.

    Ginge das? Das wäre super hilfreich.

    Vielen Dank schonmal im Voraus,


    P.S: Ich habe mir auch schon die Funktion StdoutRead durchgelsen, aber habe keine Ahnung, wie ich so etwas in meinem Fall benutzen kann oder muss. ;(

    Die Anna :*

    "Wo kämen wir hin, wenn jeder sagte wo kämen wir hin, und niemand ginge, um zu sehen, wohin wir kämen, wenn wir gingen..." :wacko:

    3 Mal editiert, zuletzt von AnnaM (6. August 2011 um 14:42)

  • Hallo "name22",

    leider brauche ich runwait für die Zeile, weil danach erst das Programm weiter gehen soll. :( Tut mir Leid ....

    Die Anna :*

    "Wo kämen wir hin, wenn jeder sagte wo kämen wir hin, und niemand ginge, um zu sehen, wohin wir kämen, wenn wir gingen..." :wacko:

  • Zitat

    leider brauche ich runwait für die Zeile, weil danach erst das Programm weiter gehen soll. :( Tut mir Leid ....


    Dann geht das aber gar nicht, weil das Script komplett pausiert wird bis das Programm bereits fertig mit dem Kopiervorgang ist. :S

  • Achso, verstehe. Autoit wartet so lange, bis das cmd geschlossen wird. hmmm. Kann man das nicht manuell abfragen und prüfen, ob ein cmd geschlossen ist und fertig ist? oder geht das wiederum nicht? Explizit robocopy hat doch verschiedene Endstadien. bzw. cmd wird ja geschlossen, wenn robocopy fertig ist, oder nicht? ohnein, alles ist wieder sooooo kompliziert. :-/

    Es kommen 4 weitere Ordner bei mir hinzu mit dem gleichen Befehl.
    Ich stelle mir das dann so vor:

    robocopy geht los

    abfrage, ob robocopy noch läuft, wenn nicht, dann

    robocopy geht los

    usw...

    Die Anna :*

    "Wo kämen wir hin, wenn jeder sagte wo kämen wir hin, und niemand ginge, um zu sehen, wohin wir kämen, wenn wir gingen..." :wacko:

  • Naja, wenn ich es so aufrufe, was du einmal gerne bei dir auf probieren kannst, gibt es mir pro Zeile die Datei an, die er gerade bearbeitet und dann kommt am Schluss eine Zusammenfassung, die man glaube ich auch mit Attributen ausschalten kann. Aber mehr weiß ich nun auch nicht. Ob uns das hilft? *ggg*

    Die Anna :*

    "Wo kämen wir hin, wenn jeder sagte wo kämen wir hin, und niemand ginge, um zu sehen, wohin wir kämen, wenn wir gingen..." :wacko:

  • Zitat

    Naja, wenn ich es so aufrufe, was du einmal gerne bei dir auf probieren kannst, gibt es mir pro Zeile die Datei an, die er gerade bearbeitet und dann kommt am Schluss eine Zusammenfassung, die man glaube ich auch mit Attributen ausschalten kann. Aber mehr weiß ich nun auch nicht. Ob uns das hilft? *ggg*


    :D. Naja, man kann eigentlich ja auch überprüfen ob der Prozess noch existiert. Ich werd mal sehen ob ich sowas hinbekomm...

  • Theoretisch kann man mit Autoit den kompletten Pfad selber durchgehen und dann die Dateien einzeln mit Robocopy kopieren. Dann hätte man die Dateien, die er gerade kopiert.
    Aber dann könnte man sich den Robycopy sparen :) Und ich glaueb auch, dass Robocopy mit threads arbeitet. Das wäre dann auch weg und es wäre langsamer ... *ggggg* :)

    ja, ich bin gespannt, was du mir schönes strickst ^^


    P.S.: Wenn man überprüft, ob der Prozess noch läuft, könnte man ausversehen den falschen cmd.exe meinen. Also d.h. wenn der User eine andere Konsole gerade schließt meint Autoit, Robocopy hat die geschlossen ^^
    Aber ich glaube, wenn man den runwait Befehl ausführt, den ich oben hingeschrieben habe, heißt der Prozess "Robocopy.exe". Das wäre schon besser. *gg* :thumbup:

    Die Anna :*

    "Wo kämen wir hin, wenn jeder sagte wo kämen wir hin, und niemand ginge, um zu sehen, wohin wir kämen, wenn wir gingen..." :wacko:

  • Also mal ein paar Dinge:

    Wenn du run statt runwait verwendest geht dein Script sofort weiter, das ist richtig. Benutzt du aber den Flag um stdout mitulesen, dann musst du dein Script direkt nach dem run Aufruf sowieso in einer Schleife laufen lassen um solange den stdout zu lesen bis keiner mehr existiert, also robocopy beendet wurde. Da brauchst du dann auch nicht mehr auf existierende Prozesse oder ähnliches prüfen. Sobald beim stdout lesen ein error erscheint bist du fertig und die Schleife wird verlassen. Es ist also im Prinzip identisch zu runwait, nur dass du eben zusätzliche Daten erhältst.

    Davon unabhängig kann man auch mit processexists einen laufenden Prozess prüfen ohne Verwechslungen mit gleichnamigen Prozessen. Dafür benutzt man dann nicht den Prozessnamen sondern die Prozess ID (PID), welche eindeutig ist und von run zurückgegeben wird.

    Beispiel:

    [autoit]


    $pid = run(....)
    while processexists($pid)
    sleep(10)
    wend
    ; ist identisch mit runwait(...)

    [/autoit]

    Nun aber zum Auslesen des stdout:

    [autoit]


    ; Demonstrates StdoutRead()
    #include <Constants.au3>

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

    Local $foo = Run(@ComSpec & " /c dir foo.bar", @SystemDir, @SW_HIDE, $STDOUT_CHILD)
    Local $line
    While 1
    $line = StdoutRead($foo)
    If @error Then ExitLoop ; wenn nix mehr kommt schleife verlassen
    consolewrite(@crlf & "STDOUT read: " & $line) ; stattdessen könntest du den Inhalt auch in ein edit deiner gui schreiben oder ein Label verändern
    Wend

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

    MsgBox(0, "Debug", "Exiting...")

    [/autoit]

    Einmal editiert, zuletzt von misterspeed (3. Juli 2011 um 18:49)

  • AnnaM Dieses Beispiel ließt alle Informationen aus die normalerweise in der CUI angezeigt werden.

    Spoiler anzeigen
    [autoit]

    $sPath_Src = @ScriptDir & "\Test1"
    $sPath_Dst = @ScriptDir & "\Test2"

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

    $iPID = Run('ROBOCOPY "' & $sPath_Src & '" "' & $sPath_Dst & '" /MIR /R:3 /W:10', @ScriptDir, @SW_HIDE, 0x2)

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

    While ProcessExists("Robocopy.exe")
    ConsoleWrite(StdoutRead($iPID))
    WEnd

    [/autoit]


    Da könnte man dann mit StringRegExp die nötigen Informationen rauslesen.

  • Für ein kleines Backup-Skript habe ich mir mal folgende Funktion geschrieben:

    RoboCopy-Skript
    [autoit]

    #include <Constants.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>

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

    #region Tray-Menü

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

    TrayCreateItem("Beenden")
    TrayItemSetOnEvent(-1, "RoboCopyClose")
    TrayCreateItem("Wiederherstellen")
    TrayItemSetOnEvent(-1, "RoboCopyRestore")
    TraySetState()
    #endregion Tray-Menü

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

    #region GUI
    Global $hGUI = GUICreate("RoboCopy", 399, 98, 192, 124)
    GUISetOnEvent($GUI_EVENT_CLOSE, "RoboCopyClose")
    GUISetOnEvent($GUI_EVENT_MINIMIZE, "RoboCopyMinimize")
    Global $Label1 = GUICtrlCreateLabel("Verzeichnis:", 8, 12, 61, 17)
    Global $Label2 = GUICtrlCreateLabel("Datei", 32, 44, 29, 17)
    Global $Label3 = GUICtrlCreateLabel("Kopiere", 24, 74, 40, 17, $SS_RIGHT)
    Global $Label4 = GUICtrlCreateLabel("99.9%", 360, 72, 33, 17, $SS_RIGHT)
    Global $Label5 = GUICtrlCreateLabel("Größe", 284, 44, 33, 17)
    Global $Label6 = GUICtrlCreateLabel("mb", 376, 44, 18, 17)

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

    Global $Input1 = GUICtrlCreateInput("", 72, 8, 321, 21)
    Global $Input2 = GUICtrlCreateInput("", 72, 40, 209, 21)
    Global $Input3 = GUICtrlCreateInput("", 320, 40, 49, 21)

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

    Global $Progress1 = GUICtrlCreateProgress(72, 72, 281, 17)
    #endregion GUI
    OnAutoItExitRegister("raus")

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

    Global $bBreak = False, $bMac = False, $bMin = False, $bDelFolds = False, $iPID

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

    _Robocopy(@WindowsDir, "C:\Robocopy-Beispiel")

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

    ; Funktion _Robocopy()
    ; - kopiert ein Verzeichnis a nach b mit Unterordnern und zeigt den momentanen Bearbeitungsstand
    Func _Robocopy($sVon, $sNach, $bDelDirs = False)
    Local $sline, $sErrLine, $sFile, $sSize
    Local $aRegExp, $a_Temp
    Local $sFile, $sFileold = '', $sSize, $sSizeold = 0, $iFort, $iFortold = -1, $sDirold = ''
    Local $sParameters

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

    If $bDelDirs = True Then
    $sParameters = '/MIR /W:1 /R:1 /A-:HS /XJD /XA:SH'
    Else
    $sParameters = '/E /W:1 /R:1 /A-:HS /XJD /XA:SH'
    EndIf

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

    GUISetState(@SW_SHOW)

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

    $iPID = Run('Robocopy "' & $sVon & '" "' & $sNach & '" ' & $sParameters, @SystemDir, @SW_HIDE, $STDERR_CHILD + $STDOUT_CHILD)
    If @error Then Return -1

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

    $bBreak = False

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

    While 1
    If $bBreak Then
    GUICtrlSetData($Input1, "Prozess wird beendet...")
    Do
    ProcessClose($iPID)
    Until ProcessExists($iPID) = 0
    GUIDelete($hGUI)
    Exit
    EndIf

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

    If $bMin Then
    GUISetState(@SW_HIDE, $hGUI)
    EndIf

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

    $sline = StdoutRead($iPID)
    If @error Then ExitLoop

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

    If $sline <> '' Then
    #region Dateiname und Größe ermitteln
    $aRegExp = StringRegExp($sline, '(?m)^\s+(New File|Newer|Neuer|Neue Datei|Älter|Older)\s+([\d\.]+?)\s?([mg]?)\t([^\n\r]+?)$', 4)
    If Not @error Then
    $a_Temp = $aRegExp[0]

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

    $sFile = $a_Temp[4]
    $sSize = Number($a_Temp[2])

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

    Switch $a_Temp[1]
    Case 'New File', 'Neue Datei'
    If GUICtrlRead($Label3) <> 'Kopiere' Then GUICtrlSetData($Label3, 'Kopiere')
    Case 'Newer', 'Neuer'
    If GUICtrlRead($Label3) <> 'Aktualisiere' Then GUICtrlSetData($Label3, 'Aktualisiere')
    EndSwitch

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

    Switch StringRight($sSize, 1)
    Case 'm'
    $sSize = $sSize
    Case 'g'
    $sSize = Round($sSize * 1024, 1)
    Case Else
    $sSize = Round($sSize / 1048576, 2)
    EndSwitch

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

    TraySetToolTip($sFile)

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

    GUICtrlSetData($Input2, $sFile)
    GUICtrlSetData($Input3, $sSize)
    EndIf
    #endregion Dateiname und Größe ermitteln

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

    #region Fortschritt ermitteln
    $aRegExp = StringRegExp($sline, '(?m)^\s*([\d\.]+)%\s*?$', 3)
    If Not @error Then
    $iFort = Number($aRegExp[0])
    If $iFort <> $iFortold Then
    $iFortold = $iFort
    GUICtrlSetData($Progress1, $iFort)
    GUICtrlSetData($Label4, $iFort & '%')
    EndIf
    EndIf
    #endregion Fortschritt ermitteln

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

    #region aktuelles Verzeichnis ermitteln
    $aRegExp = StringRegExp($sline, '(?m)\d+\s+?([A-Z]:[^\n\r\t\?]+?\\)\s*?$', 3)
    If Not @error Then
    If $aRegExp[0] <> $sDirold Then
    $sDirold = $aRegExp[0]
    GUICtrlSetData($Input1, $sDirold)
    EndIf
    EndIf
    #endregion aktuelles Verzeichnis ermitteln
    EndIf
    Sleep(1)
    WEnd

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

    GUISetState(@SW_HIDE, $hGUI)
    Return $sErrLine
    EndFunc ;==>_Robocopy

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

    Func RoboCopyClose()
    $bBreak = True
    EndFunc ;==>RoboCopyClose

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

    Func RoboCopyMinimize()
    $bMin = True
    EndFunc ;==>RoboCopyMinimize

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

    Func RoboCopyRestore()
    $bMin = False
    GUISetState(@SW_SHOW, $hGUI)
    EndFunc ;==>RoboCopyRestore

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

    Func raus()
    ProcessClose($iPID)
    Run("taskkill /pid " & $iPID)
    EndFunc ;==>raus

    [/autoit]
  • uii. so viele Informationen :) Ich probiere dann mal meine Version aus und schicke es euch dann. Hoffe, ich schaffe das heute abend noch :)

    Danks schon einmal vielmals,

    Die Anna :*

    "Wo kämen wir hin, wenn jeder sagte wo kämen wir hin, und niemand ginge, um zu sehen, wohin wir kämen, wenn wir gingen..." :wacko:

  • Hallo Danke an Euch allen :) *thumbsup*

    Ich habe noch eine Frage an "AspirinJunkie". Bei deinem Code passiert es manchmal, dass eine Datei kopiert oder aktualisiert wird ... soweit so gut :)
    Aber passiert dieses am Anfang des Backups, wird es hingeschrieben "Kopiere Dateixy". Wird nun im Verlauf des Backups keine weiteren Dateien mehr aktualisiert oder erneuert bzw. hinzugefügt,
    bleibt der Text die ganze Zeit stehen bis zum Ende des Backups.

    Kann man da nicht ein
    Case Else einfügen oder so? Einfach dann einen Statustext "searching..." einblenden? Ansonsten läuft dein Code super. :)
    Noch eine Frage, ist der Code dann eigentlich sehr langsam, wenn der alles Auswerten muss?

    Gruß,

    Die Anna :*

    "Wo kämen wir hin, wenn jeder sagte wo kämen wir hin, und niemand ginge, um zu sehen, wohin wir kämen, wenn wir gingen..." :wacko:

  • Wird nun im Verlauf des Backups keine weiteren Dateien mehr aktualisiert oder erneuert bzw. hinzugefügt,
    bleibt der Text die ganze Zeit stehen bis zum Ende des Backups.
    Kann man da nicht ein
    Case Else einfügen oder so? Einfach dann einen Statustext "searching..." einblenden?

    Du kannst den Code natürlich nach Herzenslust anpassen wie du möchtest.
    Z.B. Könnte man wenn die 100% erreicht wurden das Dateifeld wieder leeren oder ähnliches.
    Kannst du machen wie du willst

    Noch eine Frage, ist der Code dann eigentlich sehr langsam, wenn der alles Auswerten muss?

    In wie fern langsam?
    Der "Code langsam"? - Meinst du die Ausführung des AutoIt-Codes selber?
    Zumindestens ist es für diesen Aufgabenzweck nicht überfordert. Die CPU-Auslastung beträgt bei mir bei diesem Skript rund 1%...

    Auf Robocopy selbst hat das Skript ja eh keinen Einfluss - das läuft ganz normal weiter wie immer.
    Nur die Ausgabe von Robocopy wird weiterverarbeitet.

  • Ja, aber wie mache ich das? Wie füge ich in dem Case etwas hinzu? war das richtig, was ich gesagt habe? Nach meinem Test hat es nicht viel gebracht.
    Der hat das einfach ignoriert. Wo füge ich den Code zum Zurücksetzen am Besten ein?

    P.S.: Ich habe die Erfahrung gemacht, dass wenn ich Robocopy mit den Parametern /NS /NC /NDL /NJH aufrufe, also ohne jegliche Doku,
    Robocopy 70% schneller war. Vielleicht lag es auch daran, dass der soviel auflisten musste in der CMD. hmm ?(

    Die Anna :*

    "Wo kämen wir hin, wenn jeder sagte wo kämen wir hin, und niemand ginge, um zu sehen, wohin wir kämen, wenn wir gingen..." :wacko:

  • So ungefähr?:

    Robocopy-Skript
    [autoit]

    #include <Constants.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>

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

    #region Tray-Menü

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

    TrayCreateItem("Beenden")
    TrayItemSetOnEvent(-1, "RoboCopyClose")
    TrayCreateItem("Wiederherstellen")
    TrayItemSetOnEvent(-1, "RoboCopyRestore")
    TraySetState()
    #endregion Tray-Menü

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

    #region GUI
    Global $hGUI = GUICreate("RoboCopy", 399, 98, 192, 124)
    GUISetOnEvent($GUI_EVENT_CLOSE, "RoboCopyClose")
    GUISetOnEvent($GUI_EVENT_MINIMIZE, "RoboCopyMinimize")
    Global $Label1 = GUICtrlCreateLabel("Verzeichnis:", 8, 12, 61, 17)
    Global $Label2 = GUICtrlCreateLabel("Datei", 32, 44, 29, 17)
    Global $Label3 = GUICtrlCreateLabel("Kopiere", 24, 74, 40, 17, $SS_RIGHT)
    Global $Label4 = GUICtrlCreateLabel("99.9%", 360, 72, 33, 17, $SS_RIGHT)
    Global $Label5 = GUICtrlCreateLabel("Größe", 284, 44, 33, 17)
    Global $Label6 = GUICtrlCreateLabel("mb", 376, 44, 18, 17)

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

    Global $Input1 = GUICtrlCreateInput("", 72, 8, 321, 21)
    Global $Input2 = GUICtrlCreateInput("", 72, 40, 209, 21)
    Global $Input3 = GUICtrlCreateInput("", 320, 40, 49, 21)

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

    Global $Progress1 = GUICtrlCreateProgress(72, 72, 281, 17)
    #endregion GUI
    OnAutoItExitRegister("raus")

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

    Global $bBreak = False, $bMac = False, $bMin = False, $bDelFolds = False, $iPID

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

    _Robocopy(@WindowsDir, "C:\Robocopy-Beispiel")

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

    ; Funktion _Robocopy()
    ; - kopiert ein Verzeichnis a nach b mit Unterordnern und zeigt den momentanen Bearbeitungsstand
    Func _Robocopy($sVon, $sNach, $bDelDirs = False)
    Local $sline, $sErrLine, $sFile, $sSize
    Local $aRegExp, $a_Temp
    Local $sFile, $sFileold = '', $sSize, $sSizeold = 0, $iFort, $iFortold = -1, $sDirold = ''
    Local $sParameters

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

    If $bDelDirs = True Then
    $sParameters = '/MIR /W:1 /R:1 /A-:HS /XJD /XA:SH'
    Else
    $sParameters = '/E /W:1 /R:1 /A-:HS /XJD /XA:SH'
    EndIf

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

    GUISetState(@SW_SHOW)

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

    $iPID = Run('Robocopy "' & $sVon & '" "' & $sNach & '" ' & $sParameters, @SystemDir, @SW_HIDE, $STDERR_CHILD + $STDOUT_CHILD)
    If @error Then Return -1

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

    $bBreak = False

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

    While 1
    If $bBreak Then
    GUICtrlSetData($Input1, "Prozess wird beendet...")
    Do
    ProcessClose($iPID)
    Until ProcessExists($iPID) = 0
    GUIDelete($hGUI)
    Exit
    EndIf

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

    If $bMin Then
    GUISetState(@SW_HIDE, $hGUI)
    EndIf

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

    $sline = StdoutRead($iPID)
    If @error Then ExitLoop

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

    If $sline <> '' Then
    For $i In StringSplit($sline, @CRLF, 2)
    #region Dateiname und Größe ermitteln
    $aRegExp = StringRegExp($i, '(?m)^\s+(New File|Newer|Neuer|Neue Datei|Älter|Older)\s+([\d\.]+?)\s?([mg]?)\t([^\n\r]+?)$', 4)
    If Not @error Then
    $a_Temp = $aRegExp[0]

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

    $sFile = $a_Temp[4]
    $sSize = Number($a_Temp[2])

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

    Switch $a_Temp[1]
    Case 'New File', 'Neue Datei'
    If GUICtrlRead($Label3) <> 'Kopiere' Then GUICtrlSetData($Label3, 'Kopiere')
    Case 'Newer', 'Neuer'
    If GUICtrlRead($Label3) <> 'Aktualisiere' Then GUICtrlSetData($Label3, 'Aktualisiere')
    EndSwitch

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

    Switch StringRight($sSize, 1)
    Case 'm'
    $sSize = $sSize
    Case 'g'
    $sSize = Round($sSize * 1024, 1)
    Case Else
    $sSize = Round($sSize / 1048576, 2)
    EndSwitch

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

    TraySetToolTip($sFile)

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

    GUICtrlSetData($Input2, $sFile)
    GUICtrlSetData($Input3, $sSize)
    EndIf
    #endregion Dateiname und Größe ermitteln

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

    #region Fortschritt ermitteln
    $aRegExp = StringRegExp($i, '(?m)^\s*([\d\.]+)%\s*?$', 3)
    If Not @error Then
    $iFort = Number($aRegExp[0])
    If $iFort <> $iFortold Then
    $iFortold = $iFort
    GUICtrlSetData($Progress1, $iFort)
    GUICtrlSetData($Label4, $iFort & '%')
    EndIf
    If $iFort = 100 Then GUICtrlSetData($Input2, "... suche ...")
    EndIf
    #endregion Fortschritt ermitteln

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

    #region aktuelles Verzeichnis ermitteln
    $aRegExp = StringRegExp($i, '(?m)\d+\s+?([A-Z]:[^\n\r\t\?]+?\\)\s*?$', 3)
    If Not @error Then
    ConsoleWrite($aRegExp[0])
    If $aRegExp[0] <> $sDirold Then
    $sDirold = $aRegExp[0]
    GUICtrlSetData($Input1, $aRegExp[0])
    EndIf
    EndIf
    #endregion aktuelles Verzeichnis ermitteln
    Next
    EndIf
    Sleep(1)
    WEnd

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

    GUISetState(@SW_HIDE, $hGUI)
    Return $sErrLine
    EndFunc ;==>_Robocopy

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

    Func RoboCopyClose()
    $bBreak = True
    EndFunc ;==>RoboCopyClose

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

    Func RoboCopyMinimize()
    $bMin = True
    EndFunc ;==>RoboCopyMinimize

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

    Func RoboCopyRestore()
    $bMin = False
    GUISetState(@SW_SHOW, $hGUI)
    EndFunc ;==>RoboCopyRestore

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

    Func raus()
    ProcessClose($iPID)
    Run("taskkill /pid " & $iPID)
    EndFunc ;==>raus

    [/autoit]

    Ich habe die Erfahrung gemacht, dass wenn ich Robocopy mit den Parametern /NS /NC /NDL /NJH aufrufe, also ohne jegliche Doku,
    Robocopy 70% schneller war. Vielleicht lag es auch daran, dass der soviel auflisten musste in der CMD.

    Wenn du denkst das läuft bedeutend besser kannst du das natürlich auch so aufrufen.
    Dein Ziel (den aktuellen Bearbeitungsstand anzeigen lassen) wird dann aber nicht mehr erreichbar sein.

  • Ja, funzt super.. Danke an euch alles :) Auf ein baldiges Wiedersehen *gg*

    Die Anna :*

    "Wo kämen wir hin, wenn jeder sagte wo kämen wir hin, und niemand ginge, um zu sehen, wohin wir kämen, wenn wir gingen..." :wacko:

  • Wenn ich das Ausführen will, erhalte ich folgende Fehler ;(


    C:\test\copy.au3(85,27) : ERROR: syntax error
    If NotNot @error
    ~~~~~~~~~~~~~~~~~~~~~~~~~~^
    C:\test\copy.au3(116,27) : ERROR: syntax error
    If NotNot @error
    ~~~~~~~~~~~~~~~~~~~~~~~~~~^
    C:\test\copy.au3(129,27) : ERROR: syntax error
    If NotNot @error
    ~~~~~~~~~~~~~~~~~~~~~~~~~~^
    C:\test\copy.au3 - 3 error(s), 0 warning(s)


    Was ist da falsch?