Vielleicht gibt es noch jemanden, der eine idee oder ein gutes Script zur Umsetzung hat...
Beiträge von AnnaM
-
-
Hallo DevFly,
danke für deinen Beitrag.
Ich habe die INI erstellt, da manche Umgebungsvariablen nicht für alle Betriebssysteme gelten und man bei einem Registryeintrag nicht einfach das Programm und die zugehörigen Ordner löschen kann. Folglich müsste ich noch eine Deinstallation schreiben. Und so habe ich auch die Möglichkeit die INI schnell und unkompliziert zu editieren.
Also werde ich das wohl erst einmal mit der INI weiter machen. Trotzdem ein netter Vorschlag. Danke. -
Hallo Zusammen,
ich habe eine Frage, wie ich einen Kopiervorgang angehe:
Mein Vorhaben bzw. Ziel:
Ich möchte gerne einen Ordner in ein Ziel kopieren. _copy("C:\test\quelle\","C:\test\ziel\")
Die bereits vorhanden Dateien bzw. Ordner dürfen nur überschrieben werden, wenn die Quelle neuer ist.
Es muss eine Prozentangabe und ein Prozessbalken geben.
Extra: Man sieht, welche Datei gerade kopiert wird
Extra: Man sieht die Kopiergeschwindigkeit
Extra: Man sieht die noch verbleibende ZeitFolgende Sachen habe ich bereits ausprobiert:
Spoiler anzeigen
[autoit]
[/autoit]
$winShell = ObjCreate("shell.application")
$winShell.namespace($ziel).CopyHere($quelle,$FOF_SIMPLEPROGRESS)
Leider weiß ich hier nicht, wie ich sagen kann, dass nur neuere Dateien kopiert werden sollen.
(wäre aber mal nützlich zu wissen, wenn einer Ahnung davon hat ^^)
Außerdem ist es ungeeignet, da ich eine eigene GUI erzeugen möchte, wo es einen Prozessbalken gibt
--------------------------------------------------------------------------------------------------------
Spoiler anzeigen
[autoit]
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
$callback = DllCallbackRegister ( "Progress" , "int", "uint64;uint64;uint64;uint64;dword;dword;hwnd;hwnd;ptr")
$ptr = DllCallbackGetPtr ( $callback )GUICtrlSetData($Label2,$sourcefile)
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
GUICtrlSetData($Label5,$destinationfile)
$Timer = TimerInit()
DllCall("kernel32.dll", "int", "CopyFileExA", "str" , $sourcefile , "str", $destinationfile, "ptr", $ptr , "ptr", 0, "int", 0, "int", 0)
;~ ProgressOff ()
Sleep(500)
GUIDelete()
Func Progress($TotalFileSize, $TotalBytesTransferred, $StreamSize, $StreamBytesTransferred, $dwStreamNumber, $dwCallbackReason, $hSourceFile, $hDestinationFile, $lpData)
;~ If GUIGetMsg() = $Button1 Then Return 1 ; Cancel Copying NICHT MIT GUIGetMSg arbeiten !!!, auch Sleeps nicht machen...
; Button State so verwenden :::
If BitAND(_GUICtrlButton_GetState(GUICtrlGetHandle($Button1)),$BST_PUSHED) = $BST_PUSHED Then Return 1
;~ If WinActive($Form1) And _IsPressed("1B") Then Return 1Local $percDone = round($TotalBytesTransferred/$TotalFileSize * 100, 0)
[/autoit] [autoit][/autoit] [autoit]
GUICtrlSetData($Label9,$TotalBytesTransferred & " Bytes from " & $TotalFileSize)
GUICtrlSetData($Label7,Round((TimerDiff($Timer)/$percDone)*(100-$percDone)/1000,1) & "s") ; Millisekunden pro Prozent * RestProzent / 1000 ( damit Skeunden rauskommen )
GUICtrlSetData($Progress1,$percDone); , round($TotalBytesTransferred/$TotalFileSize * 100, 0) & "%")EndFunc
[/autoit]
Hier habe ich das Problem, dass ich bis jetzt nur Datei zu Datei und nicht Ordner zu Ordner übertragen kann... aber wir kommen der Sache näher
---------------------------------------------------------------------------------------------------------
Nun kommt das Programm aus diesem Forum. Ich glaube Oscar hat es geschrieben:
https://autoit.de/index.php?page=Thread&threadID=7923
Hier stellt sich die Frage, wie ich es umschreiben kann bzw. meine Anforderungen damit realisieren kann.
Bis jetzt habe ich lediglich die INI-Datei fertig geschrieben. Sie sieht so aus:Spoiler anzeigen
Code
Alles anzeigen[Einzelne Programme] FileZilla = C:\Users\Anna\Anwendungsdaten\FileZilla Trillian = C:\Program Files (x86)\Trillian Webentwicklung = E:\Webentwicklung Spiele = E:\Spiele Fonts = C:\Windows\Fonts Windows Sidebar = C:\Users\Anna\AppData\Local\Microsoft\Windows Sidebar [Firefox] FF-Hauptverzeichniss = C:\Program Files (x86)\Mozilla Firefox FF-Anwendungsdaten = C:\Users\Anna\Anwendungsdaten\Mozilla [Thunderbird] TB-Hauptverzeichniss = C:\Program Files (x86)\Mozilla Thunderbird TB-Anwendungsdaten = C:\Users\Anna\Anwendungsdaten\Thunderbird
Somit liest das Script die einzelnen Pfade ein und führt ein Backup aus.
Das Problem werden die Anzeigen mit einem Prozessbalken. Da müsste man Zwei haben.
Aber ich weiß leider nicht, wie ich sowas realisieren kann
Zudem habe ich ja meine eigene GUI, wo es Prozessbalken und Anzeigefelder für die Zeit und so geben wird (noch nicht erstellt)
Und das Script legt mir eine Datei in das Verzeichnis, welche ich nicht haben möchte, bzw. brauche, da das Verzeichnis sich immer ändert.Ich hoffe, man kann mir helfen... Vielen Dank im Voraus erst einmal... die Anna
-
Boar, supi.. dankeschön

-
Hallo James,
aber ich habe 2 Progress-Bars und da macht der das nicht

Auch beim Auto-It-Beispiel in der Hilfe, macht der keine Füllung des Tasksymbols

-
Hallo Zusammen,
bei einer Installation von einem Programm oder rendern von einem Video sieht man es häufiger.
In der Taskleiste wird das Programm als Symbol abgebildet und ab Windows 7 füllt es sich grün, je höher der Installations - oder Downloadfortschritt voran geschritten ist.Ist dieses auch mit Autoit möglich?
Wer es nicht kennt, einfach mal unter Win7 ein Video mit dem WindowsMovieMaker rendern oder bei Steam ein Spiel updaten oder runterladen

Ich hoffe, ihr habt Tipps, wie man diese Fortschrittsanzeige umsetzen kann.
Vielen Dank und liebe Grüße

-
Keiner eine Idee?
*schnüff* 
-
Hallo AspirinJunkie,
da bin ich wieder

Ich habe deinen Code ausgiebig getestet und mir ist aufgefallen, dass er manchmal Fehler macht.
[autoit][/autoit][autoit][/autoit][autoit]
Zum Beispiel bewegt sich der aktuelle Fortschrittsbalken, auch wenn unten steht "suche...".
Das kann doch nicht sein, oder? Hier einmal mein Code:_GUICtrlStatusBar_SetText($StatusBar, "suche...1")
[/autoit][autoit][/autoit][autoit]$iPID = Run('Robocopy "' & $quelle & '" "' & $ziel & '" ' & $sync, @SystemDir, @SW_HIDE, $STDERR_CHILD + $STDOUT_CHILD)
[/autoit][autoit][/autoit][autoit]
[/autoit][autoit][/autoit][autoit]
If @error Then Return MsgBox(0,"Fehler", "Fehlercode: " & @error & @CRLF & "PID: " & $iPID)
While 1
$sline = StdoutRead($iPID)
If @error Then ExitLoopIf $sline <> '' Then
[/autoit][autoit][/autoit][autoit]
#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]
$sFile = $a_Temp[4]
Switch $a_Temp[1]
Case 'New File', 'Neue Datei'
_GUICtrlStatusBar_SetText($StatusBar, "Kopiere: '" & $sFile & "'")
Case 'Newer', 'Neuer'
_GUICtrlStatusBar_SetText($StatusBar, "Aktualisiere: '" & $sFile & "'")
Case Else
_GUICtrlStatusBar_SetText($StatusBar, "suche...2")
GUICtrlSetData($Progress_Update_detail, 0)
EndSwitch
EndIf#region Fortschritt ermitteln
[/autoit][autoit][/autoit][autoit][/autoit]
$aRegExp = StringRegExp($sline, '(?m)^\s*([\d\.]+)%\s*?$', 3)
If Not @error Then
$iFort = Number($aRegExp[0])
If $iFort <> $iFortold Then
$iFortold = $iFort
GUICtrlSetData($Progress_Update_detail, $iFort)
EndIf
If $iFort = 100 Then
_GUICtrlStatusBar_SetText($StatusBar, "suche...3")
GUICtrlSetData($Progress_Update_detail, 0)
EndIf
EndIf
#endregion Fortschritt ermitteln
EndIf
Sleep(1)
WEndIch habe einmal das Aufgeteilt mit "suche1", "suche2" und "suche3" und es passiert manchmal bei ganz neueren Dateien, dass er einfach ab "If Not @error Then" den Code überspringt. Er zeitg also nichts mehr an, ob er sucht oder aktualisiert und macht trotzdem einen Fortschrittsbalken.
Hoffe du kannst mir da helfen 
Edit: Dabei ist "$Progress_Update_detail" mein Fortschrittsbalken in Prozent und "$StatusBar" meine Anzeige.

-
Ja, funzt super.. Danke an euch alles
Auf ein baldiges Wiedersehen *gg* -
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
-
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ß,
-
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,
-
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*
-
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*
-
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...
-
Hallo "name22",
leider brauche ich runwait für die Zeile, weil danach erst das Programm weiter gehen soll.
Tut mir Leid .... -
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.

-
Naja, oder auch so

-
Hallo Lottich,
es könnte daran liegen, dass deine $read*-Variablen nicht global sind. Das heißt, die können in einer anderen Funktion gar nicht ausgelesen werden.
Setze doch zum Test oben am Programmanfang "Global $read1" und schau, obs klappt. -
Hallo Cash,
schonmal "_DateTimeFormat" bzw "_DateTimeSplit" ausprobiert?