Frage

ich benutze rsync um Dateien serverunabhängig mit Windows-Clients zu synchronisieren.Welche Methoden stehen zur Verfügung, um den Fortschritt von rsync an den übergeordneten Prozess zu senden, um ihn in einer GUI-Fortschrittsleiste anzuzeigen?

Ich kann mir vorstellen, dass es zwei oder drei Möglichkeiten gibt.(1) Beobachten Sie STDOUT. (2) Beobachten Sie die Protokolldatei rsync.exe, ähnlich wie bei Unix tail (3) Beobachten Sie die Ausgabe der rsync-Konsole im Speicher.

Welches ist am besten/bevorzugt?

War es hilfreich?

Lösung

Für diese Art von Aufgaben verwende ich meine eigene AutoIt Skript (Freeware, nur Windows).Das Skript leitet die Standardausgabe in ein grafisches Fenster um und zeigt sie mit der Möglichkeit zum Zurückscrollen usw. an (sehr nützlich bei langen Prozessen wie XCOPYs/PKZIPs, um zu überprüfen, ob ein Fehler aufgetreten ist).

Ich verwende AutoIt, weil es kostenlos, sehr einfach zu verwenden und schnell in eine .EXE-Datei kompilierbar ist.Ich denke, dass es für diese Art von Aufgaben eine hervorragende Alternative zu einer vollständigen Programmiersprache ist.Der Nachteil ist, dass es nur für Windows ist.

$sCmd = "DIR E:\*.AU3 /S"  ; Test command
$nAutoTimeout = 10      ; Time in seconds to close window after finish

$nDeskPct = 60          ; % of desktop size (if percent)

; $nHeight = 480          ; height/width of the main window (if fixed)
; $nWidth = 480

$sTitRun = "Executing process. Wait...."     ; 
$sTitDone = "Process done"                ; 

$sSound = @WindowsDir & "\Media\Ding.wav"       ; End Sound

$sButRun = "Cancel"                           ; Caption of "Exec" button
$sButDone = "Close"                            ; Caption of "Close" button

#include <GUIConstants.au3>
#include <Constants.au3>
#Include <GuiList.au3>

Opt("GUIOnEventMode", 1)

if $nDeskPct > 0 Then
    $nHeight = @DesktopHeight * ($nDeskPct / 100)
    $nWidth = @DesktopWidth * ($nDeskPct / 100)
EndIf


If $CmdLine[0] > 0 Then
    $sCmd = ""
    For $nCmd = 1 To $CmdLine[0]
        $sCmd = $sCmd & " " & $CmdLine[$nCmd]
    Next

    ; MsgBox (1,"",$sCmd)
EndIf

; AutoItSetOption("GUIDataSeparatorChar", Chr(13)+Chr(10))

$nForm = GUICreate($sTitRun, $nWidth, $nHeight)
GUISetOnEvent($GUI_EVENT_CLOSE, "CloseForm")

$nList = GUICtrlCreateList ("", 10, 10, $nWidth - 20, $nHeight - 50, $WS_BORDER + $WS_VSCROLL)
GUICtrlSetFont (-1, 9, 0, 0, "Courier New")

$nClose = GUICtrlCreateButton ($sButRun, $nWidth - 100, $nHeight - 40, 80, 30)
GUICtrlSetOnEvent (-1, "CloseForm")

GUISetState(@SW_SHOW)   ;, $nForm)

$nPID = Run(@ComSpec & " /C " & $sCmd, ".", @SW_HIDE, $STDOUT_CHILD)
; $nPID = Run(@ComSpec & " /C _RunErrl.bat " & $sCmd, ".", @SW_HIDE, $STDOUT_CHILD)     ; # Con ésto devuelve el errorlevel en _ERRL.TMP

While 1
    $sLine = StdoutRead($nPID)
    If @error Then ExitLoop

    If StringLen ($sLine) > 0 then
        $sLine = StringReplace ($sLine, Chr(13), "|")
        $sLine = StringReplace ($sLine, Chr(10), "")
        if StringLeft($sLine, 1)="|" Then
            $sLine = " " & $sLine
        endif

        GUICtrlSetData ($nList, $sLine)

        _GUICtrlListSelectIndex ($nList, _GUICtrlListCount ($nList) - 1)
    EndIf
Wend

$sLine = " ||"
GUICtrlSetData ($nList, $sLine)
_GUICtrlListSelectIndex ($nList, _GUICtrlListCount ($nList) - 1)

GUICtrlSetData ($nClose, $sButDone)

WinSetTitle ($sTitRun, "", $sTitDone)
If $sSound <> "" Then
    SoundPlay ($sSound)
EndIf

$rInfo = DllStructCreate("uint;dword")      ; # LASTINPUTINFO
DllStructSetData($rInfo, 1, DllStructGetSize($rInfo));

DllCall("user32.dll", "int", "GetLastInputInfo", "ptr", DllStructGetPtr($rInfo))
$nLastInput = DllStructGetData($rInfo, 2)

$nTime = TimerInit()

While 1
    If $nAutoTimeout > 0 Then
        DllCall("user32.dll", "int", "GetLastInputInfo", "ptr", DllStructGetPtr($rInfo))
        If DllStructGetData($rInfo, 2) <> $nLastInput Then
            ; Tocó una tecla
            $nAutoTimeout = 0
        EndIf
    EndIf

    If $nAutoTimeout > 0 And TimerDiff ($nTime) > $nAutoTimeOut * 1000 Then
        ExitLoop
    EndIf

    Sleep (100)
Wend


Func CloseForm()
    Exit
EndFunc

Andere Tipps

.NET bietet eine ziemlich einfache Möglichkeit, STDOUT zu lesen und anzusehen.
Ich denke, das wäre der sauberste Weg, da es nicht von externen Dateien abhängt, sondern nur vom Pfad zu rsync.Ich wäre auch nicht allzu überrascht, wenn es da draußen eine Wrapper-Bibliothek gäbe.Wenn nicht, schreiben Sie es und öffnen Sie es als Quelle :)

Ich habe dafür mein eigenes einfaches Objekt erstellt, ich kann es viel wiederverwenden, ich kann es mit einem umwickeln cmdline, web page, webservice, Ausgabe in eine Datei schreiben usw. ---

Die kommentierten Artikel enthalten einige rsync Beispiele--

Was ich gerne einmal machen würde, ist Einbetten rsync (Und cygwin) in eine Ressource umwandeln und daraus eine einzelne ausführbare .net-Datei erstellen –

Bitte schön:

Imports System.IO

Namespace cds

Public Class proc

    Public _cmdString As String
    Public _workingDir As String
    Public _arg As String


    Public Function basic() As String

        Dim sOut As String = ""

        Try
            'Set start information.
            'Dim startinfo As New ProcessStartInfo("C:\Program Files\cwRsync\bin\rsync", "-avzrbP 192.168.42.6::cdsERP /cygdrive/s/cdsERP_rsync/gwy")
            'Dim startinfo As New ProcessStartInfo("C:\Program Files\cwRsync\bin\rsync", "-avzrbP 10.1.1.6::user /cygdrive/s/cdsERP_rsync/gws/user")
            'Dim startinfo As New ProcessStartInfo("C:\windows\system32\cscript", "//NoLogo c:\windows\system32\prnmngr.vbs -l")

            Dim si As New ProcessStartInfo(_cmdString, _arg)

            si.UseShellExecute = False
            si.CreateNoWindow = True
            si.RedirectStandardOutput = True
            si.RedirectStandardError = True

            si.WorkingDirectory = _workingDir


            ' Make the process and set its start information.
            Dim p As New Process()
            p.StartInfo = si

            ' Start the process.
            p.Start()

            ' Attach to stdout and stderr.
            Dim stdout As StreamReader = p.StandardOutput()
            Dim stderr As StreamReader = p.StandardError()

            sOut = stdout.ReadToEnd() & ControlChars.NewLine & stderr.ReadToEnd()

            'Dim writer As New StreamWriter("out.txt", FileMode.CreateNew)
            'writer.Write(sOut)
            'writer.Close()

            stdout.Close()
            stderr.Close()
            p.Close()


        Catch ex As Exception

            sOut = ex.Message

        End Try

        Return sOut

    End Function

End Class
End Namespace

Kasse DeltaCopy.Es ist eine Windows-GUI für rsync.

Überprüfen NAsBackup Es handelt sich um eine Open-Source-Software, die Windows-Benutzern mithilfe von Watch STDOUT eine Rsync-GUI bietet.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top