1. Dashboard
  2. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team
    4. Mitgliedersuche
  3. Forenregeln
  4. Forum
    1. Unerledigte Themen
  • Anmelden
  • Registrieren
  • Suche
Alles
  • Alles
  • Artikel
  • Seiten
  • Forum
  • Erweiterte Suche
  1. AutoIt.de - Das deutschsprachige Forum.
  2. Mitglieder
  3. Micha_he

Beiträge von Micha_he

  • _RobocopyBackup_WithProgress()

    • Micha_he
    • 12. Februar 2012 um 13:42

    Ich brauchte ein BackupScript, welches möglichst zügig arbeitet und eine Fortschrittsanzeige hat.

    Bin dabei gestern von einer XCopy-Variante auf Robocopy (kopiert nur die Differenz) umgestiegen und wollte euch die Backupfunktion nicht vorenthalten. Ich glaube es waren schon einige Nachfragen nach einer Fortschrittsanzeige bei Robocopy und eine Lösung habe ich nicht finden können.

    Hier meine Idee:

    _Robocopy_WithProgress() V1.01
    [autoit]

    ; #FUNCTION# ===============================================================
    ; Name...........: _RobocopyBackup_WithProgress()
    ; Description ...: Erstellt ein Backup der angegebenen Quelle im Zielordner,
    ; unter Zuhilfenahme von Robocopy Version XP010. Während
    ; des Backupvorgangs wird eine Progressbar angezeigt,
    ; welche auf Basis der Datei-/Ordneranzahl arbeitet.
    ; Syntax.........: _RobocopyBackup_WithProgress($sourceDir, $destDir)
    ; Parameters ....: $sourceDir - Quellverzeichnis
    ; $destDir - Zielverzeichnis
    ; Return values .: Success - 1
    ; Failure - 0
    ; Required ......: #include <File.au3>
    ; Microsoft Robocopy.exe Version XP010
    ; Author ........: [email='micha_he@autoit.de'][/email]
    ; Version .......: V1.01
    ; Date ..........: 13.02.2012
    ; Thanks to .....: [email='gigx@autoit.de'][/email] (_CopyWithProgress)
    ; [email='AdamUL@autoitscript.com'][/email] (_ProcessGetExitCode)
    ; [email='PsaltyDS@autoitscript.com'][/email] (_ProcessGetExitCode)
    ; History .......: V1.00 Erstrelease
    ; V1.01 Unnötige TEE-Option vom Testlauf entfernt
    ; ==========================================================================
    Func _RobocopyBackup_WithProgress($srcDir, $destDir)
    Local $pid, $geschafft, $GesamtAnzahl, $aDirSize
    Local $hRun, $iExit1 , $iExit2
    FileInstall("Robocopy.exe", @TempDir & "\Robocopy.exe")
    If StringRight($srcDir, 1) = "\" Then $srcDir = StringTrimRight($srcDir, 1)
    If StringRight($destDir, 1) = "\" Then $destDir = StringTrimRight($destDir, 1)
    If Not FileExists($destDir) Then DirCreate($destDir)
    ProgressOn("Backup-Fortschritt...", "", "", 10, 10, 16)
    $aDirSize = DirGetSize($srcDir, 1)
    $GesamtAnzahl = $aDirSize[1] + $aDirSize[2]
    $pid = Run('"' & @TempDir & '\Robocopy" "' & $srcDir & '" "' & $destDir & '" /XN /XC /XO /IS /NOCOPY /E /R:0 /NP /NDL /NJH /NJS /LOG:"' & @TempDir & '\count.log"', @TempDir, @SW_HIDE)
    $hRun = _ProcessGetHandle($pid)
    Sleep(200)
    Do
    $geschafft = _FileCountLines(@TempDir & '\count.log') - 1
    If $geschafft < 0 Then $geschafft = 0
    If $geschafft > $GesamtAnzahl Then $geschafft = $GesamtAnzahl
    ProgressSet($geschafft/$GesamtAnzahl*100, $geschafft & ' / ' & $GesamtAnzahl & ' Dateien/Ordner')
    Sleep(100)
    Until Not ProcessExists($pid)
    $iExit1 = _ProcessGetExitCode($hRun)
    _ProcessCloseHandle($hRun)
    $pid = Run('"' & @TempDir & '\Robocopy" "' & $srcDir & '" "' & $destDir & '" /MIR /COPY:DAT /R:0 /NP /NJH /NJS /LOG+:"' & @TempDir & '\count.log"', @TempDir, @SW_HIDE)
    $hRun = _ProcessGetHandle($pid)
    Sleep(200)
    Do
    $geschafft = _FileCountLines(@TempDir & '\count.log') - 2
    If $geschafft < 0 Then $geschafft = 0
    If $geschafft > $GesamtAnzahl Then $geschafft = $GesamtAnzahl
    ProgressSet($geschafft/$GesamtAnzahl*100, $geschafft & ' / ' & $GesamtAnzahl & ' Dateien/Ordner')
    Sleep(100)
    Until Not ProcessExists($pid)
    ProgressSet(100, $geschafft & ' / ' & $GesamtAnzahl & ' Dateien/Ordner')
    $iExit2 = _ProcessGetExitCode($hRun)
    _ProcessCloseHandle($hRun)
    FileDelete(@TempDir & '\count.log')
    If FileExists(@TempDir & '\Robocopy.exe') Then FileDelete(@TempDir & '\Robocopy.exe')
    Sleep(1000)
    ProgressOff()
    If $iExit1 >= 4 Or $iExit2 >= 4 Then Return 0
    Return 1
    EndFunc ;==> _RobocopyBackup_WithProgress

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

    ; Return handle of given PID
    Func _ProcessGetHandle($iPID)
    Local Const $PROCESS_QUERY_INFORMATION = 0x0400
    Local $avRET = DllCall("kernel32.dll", "ptr", "OpenProcess", "int", $PROCESS_QUERY_INFORMATION, "int", 0, "int", $iPID)
    If @error Then
    Return SetError(1, 0, 0)
    Else
    Return $avRET[0]
    EndIf
    EndFunc ;==>_ProcessGetHandle

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

    ; Close process handle
    Func _ProcessCloseHandle($hProc)
    Local $avRET = DllCall("kernel32.dll", "int", "CloseHandle", "ptr", $hProc)
    If @error Then
    Return SetError(1, 0, 0)
    Else
    Return 1
    EndIf
    EndFunc ;==>_ProcessCloseHandle

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

    ; Get process exit code from handle
    Func _ProcessGetExitCode($hProc)
    Local $t_ExitCode = DllStructCreate("int")
    Local $avRET = DllCall("kernel32.dll", "int", "GetExitCodeProcess", "ptr", $hProc, "ptr", DllStructGetPtr($t_ExitCode))
    If @error Then
    Return SetError(1, 0, 0)
    Else
    Return DllStructGetData($t_ExitCode, 1)
    EndIf
    EndFunc ;==>_ProcessGetExitCode

    [/autoit]
  • _RunDos Progressbar für ffmpeg umwandelung?!

    • Micha_he
    • 6. Februar 2012 um 17:09

    Aus eigener Erfahrung (habe selber eine Videokonverter auf Basis FFMPEG geschrieben) weiß ich, das das Ausgabeformat von FFMPEG sich von Version zu Version leicht unterscheidet. Dies erschwert das Auswerten der abgearbeiteten Frames etwas.

    Du solltest also am besten einen Link angeben, mit welcher Version von FFMPEG Du arbeitest.

    Vom Prinzip her muss Du in einem Aufruf die Gesamtframe-Anzahl (FFMPEG -i [Inputfile]) ermitteln und beim Umrechnen anschließend aus der Rückgabe von FFMPEG das aktuelle Frame ermitteln. Mit den beiden Daten kannst Du deine Prozessbar steuern.

    Eine Ausgabe von 0-100% gibt es meiner Meinung nach bei FFMPEG nicht.

    Hier habe Dir hier einmal die beiden Stellen aus meinem Script herausgeschrieben. Ich kann aber nicht sagen ob das so schon fehlerfrei läuft, aber als Idee !

    Spoiler anzeigen
    [autoit]

    $geschafft_frames = _Frames_in_Datei(@ScriptDir & "\input.avi")

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

    $pid = Run(@ScriptDir & "\ffmpeg.exe -i ......", "", @SW_HIDE, 6) ; Hier der Aufruf zu konvertieren

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

    While 1
    If StdOutRead($pid,True) Then $rueckgabe &= StdOutRead($pid)
    If StdErrRead($pid,True) Then $rueckgabe &= StdErrRead($pid)
    If @error Then ExitLoop
    $return = StringRegExp($rueckgabe,'frame= *(\d+) *fps=',3)
    If IsArray($return) Then
    $geschafft_frames = Round($return[UBound($return)-1] / $frames_gesamt * 100)
    GUICtrlSetData($anzeige,$geschafft_frames) ; Hier wird die Prozessbar gesetzt
    EndIf
    Sleep(100)
    Wend

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

    Func _Frames_in_Datei($videodatei)
    Local $pid, $reuckgabe, $return, $framerate=0, $laufzeit=0
    If FileExists($videodatei) Then
    $rueckgabe = ""
    $pid = run(@ScriptDir & "\ffmpeg.exe -i " & chr(34) & $videodatei & chr(34),"",@SW_HIDE,6)
    While 1
    If StdOutRead($pid,True) Then $rueckgabe &= StdOutRead($pid)
    If StdErrRead($pid,True) Then $rueckgabe &= StdErrRead($pid)
    If @error Then ExitLoop
    Sleep(10)
    Wend
    $return = StringRegExp($rueckgabe,".*Stream #.*Video:.*\].*, (\d*.\d*) tb\(r\)",1)
    If IsArray($return) Then $framerate = $return[0]
    $return = StringRegExp($rueckgabe,"Duration:.?(\d*):(\d{2}):(\d{2}).(\d{2}), ",1)
    If IsArray($return) Then $laufzeit = 3600 * $return[0] + 60 * $return[1] + $return[2] + $return[3] / 100
    If $framerate <> 0 And $laufzeit <> 0 Then $frames_gesamt = Round($framerate * $laufzeit)
    EndIf
    EndFunc ; _Frames_in_Datei()

    [/autoit]

    FFMPEG Version ist: SVN-r15986

  • Lotus Notes automatisch starten mit AutoIT

    • Micha_he
    • 1. Februar 2012 um 22:00

    Nennt sich "gemeinsame Anmeldung". Wo das in den Tiefen von LotusNotes zu finden ist, müsste ich auch erst schauen.

    Funktioniert aber nur wenn die Passwörter identisch sind und nicht mit dem Notes-Minder, sondern nur mit dem Client.

  • AD Domänenpasswort von Standalone PC ändern ?

    • Micha_he
    • 31. Januar 2012 um 16:08
    Zitat von HassanMullah

    Micha_he: Habe das ausprobiert, aber wäre ja auch zu einfach. Da muss die Hardware ja Mitglied in der Domäne sein. Standalone geht das leider nicht.

    Gruss Hassan

    Ich habe es gerade einmal nachgestellt, rein aus Interesse. Windows 7 Stand-Alone-Client an W2k3-Domäne.

    Einfach unter Username [Domäne]\[Username] und 1x alt, 2x neues Passwort. Fertig ! Passwort geändert !

  • AD Domänenpasswort von Standalone PC ändern ?

    • Micha_he
    • 31. Januar 2012 um 13:52

    Sollte eigentlich funktionieren wie normal:

    - Strg-Alt-Del
    - Benutzername eingeben
    - Domäne eingeben die das Konto enthält (auswählen geht ja nicht bei Stand-Alone-PC)
    - altes Kennwort eingeben
    - 2x neues Kennwort eingeben

    Habe nur gerade keinen Standalone-PC um das zu testen...

  • Kontextmenü Registry Dateipfad mitgeben und in Autoit nutzen?

    • Micha_he
    • 30. Januar 2012 um 16:10

    Wie wär es, wenn Du einfach mal postest was Du hast. Dann kann man Dir helfen, wo der Fehler liegt.

    Aber ich rate eigentlich schon von Beginn an WAS Du WIE mit WELCHEM AutoIt-Code erreichen willst !

  • Kontextmenü Registry Dateipfad mitgeben und in Autoit nutzen?

    • Micha_he
    • 30. Januar 2012 um 16:03

    Vom Prinzip her schon.

    Edit: Erklärungen findest Du in der HILFE

  • Kontextmenü Registry Dateipfad mitgeben und in Autoit nutzen?

    • Micha_he
    • 30. Januar 2012 um 15:57

    Ich werde zwar aus Deinen Ausführungen noch nicht so 100%ig schlau, aber ich glaube du meinst etwas in der Art:

    Hier am Beispiel der Notepad-Editors:

    In "HKEY_CLASSES_ROOT\txtfile\shell\open\command" steht folgender Eintrag:

    %SystemRoot%\system32\NOTEPAD.EXE %1

    Die "%1" ist der übergebene Dateiname (z.B. Kontextmenue auf einer Datei), der sich im AutoIt-Script mit $cmdline[1]...[xxx] auswerten lässt.

  • [gelöst] TLD für Server mit statischer IP (Home Server)

    • Micha_he
    • 21. Januar 2012 um 10:50

    Warum nicht so : NoIP

  • Autoit 32-Bit kompilierte Exe(n) Probleme auf x64 System

    • Micha_he
    • 20. Januar 2012 um 15:51

    Bis mir gibt es keine merkbaren Unterschiede.

  • Warten bis eine Datei vollständig kopiert wurde

    • Micha_he
    • 23. Dezember 2011 um 08:05

    @Protex: So etwas in der Art hatte ich auch erst gedacht - ist doch einfach, sogar die FileCopy()-Funktion beendet sich erst nach dem Kopiervorgang.

    Aber: Er kopiert die Datei doch gar nicht im Script, sondern sie wird anderweitig erstellt und er weiß nicht wann sie komplett fertig kopiert ist. Außerdem ist es schwierig etwas mit FileGetSize() zu prüfen, wenn man nicht weiß wie groß es maximal wird !

    Oder hab ich das Script nun falsch interpretiert ?

  • Warten bis eine Datei vollständig kopiert wurde

    • Micha_he
    • 22. Dezember 2011 um 21:59

    Vielleicht wäre ein möglicher Lösungsweg auch, die betreffende Datei versuchen mit FileOpen() zum Schreiben zu öffnen.

    Solange die Datei nicht fertig geschrieben ist, sollte dies doch zu einem Fehler führen, oder ?

  • CSV Datei aufteilen

    • Micha_he
    • 11. Dezember 2011 um 00:18

    Ich würde eigentlich behaupten, das die Datei gar keine CSV-Datei ist, bzw. eine mit hunderten von Elementen (Zahlen mit Komma, Elemente mit Semikolon getrennt) in einem Datensatz.

    Die einzelnen Datensätzen müssten bei einer CSV-Datei ja mit einem Zeilenvorschub getrennt sein und der fehlt in der Datei, egal ob Unix oder Windows Format.

  • SplashText bearbeiten

    • Micha_he
    • 10. Dezember 2011 um 18:55

    Nochmal als Tip - Auszug aus der Hilfe zu SplashTextOn():

    Zitat

    Rückgabewert
    Gibt das Handle des Splash-Fensters zurück, welches für ControlSetText verwendet werden kann.

    Warum sollte man sonst wohl ControlSetText() verwenden können ?

  • Laufwerksbuchstaben finden und an shellexecute übergeben

    • Micha_he
    • 28. November 2011 um 21:45

    Zum 2. Problem:

    Zitat von Chicago

    WinWaitActive("Setup-Sprache auswählen","Sprache")
    if not WinActive("Setup-Sprache auswählen","Sprache") then WinActivate("Setup-Sprache auswählen","Sprache")

    mach mal daraus:

    [autoit]

    WinWait("Setup-Sprache auswählen","Sprache")
    if not WinActive("Setup-Sprache auswählen","Sprache") then WinActivate("Setup-Sprache auswählen","Sprache")

    [/autoit]

    Es ist Blödsinn auf ein "aktives" Fenster zu warten und es anschließend zu aktivieren wenn es "nicht" aktiv ist ?!?!

  • IniReadSection Ausgabe in String umwandeln

    • Micha_he
    • 12. November 2011 um 12:29
    Zitat von Crusoe

    Wo steht denn sowas? Ich habe bestimmt Stunde die Hilfe bemüht und im Internet gesucht
    Naja, der Trick ist eben, dass man weiß wo es steht

    Meines Wissen nach, steht das so direkt nirgends !

    Da ich schon das eine oder andere mal so einen Fehler hatte und ich aus der Hilfe nicht herauslesen konnte ob IniReadSection() immer Zeichenketten zurückliefert, habe ich einfach mal geraten ;)

    Schön das ich helfen konnte....

  • IniReadSection Ausgabe in String umwandeln

    • Micha_he
    • 12. November 2011 um 11:13

    Versuch es mal mit Number($Start[1][1]), um sicher zu stellen, das es sich um einen numerischen Wert handelt.

  • StringWidth

    • Micha_he
    • 10. November 2011 um 23:12

    BugFix hat mal etwas gemacht. War sogar mit der Suche schwer zu finden, obwohl ich den Namen wusste !

    Hier der Link: TextMeter

    Hier nochmal als Funktion mit Parametern: _GetTextSize()

  • Write UTF-16 ohne BOM

    • Micha_he
    • 7. November 2011 um 22:27

    Danke, das habe ich gesucht ! :thumbup:

    Edit: Habe es gerade mit der Originaldatei getestet, funktioniert einwandfrei !

  • 2 Monitore Problem

    • Micha_he
    • 7. November 2011 um 16:24

    Gib doch der Funktion InputBox() mit Parameter 7 & 8 Koordinaten Deiner GUI mit !
    Da "poppt" die InputBox immer relativ zur GUI auf.

    z.B. so:

    [autoit]

    $top=132
    $left=192
    $Gui = GUICreate("Main", 407, 147, $left, $top); die Main Gui diese Startet mit dem Button die Inputbox!
    $Input = InputBox("Info", "Bitte Info eintragen", "", "", -1, "150", $left + 20, $top + 20,default, $gui); Im Vordergrund

    [/autoit]

Spenden

Jeder Euro hilft uns, Euch zu helfen.

Download

AutoIt Tutorial
AutoIt Buch
Onlinehilfe
AutoIt Entwickler
  1. Datenschutzerklärung
  2. Impressum
  3. Shoutbox-Archiv
Community-Software: WoltLab Suite™