none
Fortschrittsanzeige beim Kopieren mit Powershell RRS feed

  • Frage

  • Hallo, eine Frage an die Spezialisten.

    Ich habe mir ein PS-Script gebastelt, welches VM´s in Hyper-V erstellt, updatet, und durchs Netzwerk kopiert.
    Die VHDX Dateien sind ca30 GB groß. Soweit funktioniert auch alles.

    Jetzt dachte ich mir mit meinem Halbwissen, eine Fortschrittsanzeige beim kopieren wäre nicht schlecht.

    Viele Foren verweisen auf fogende Seite, wenn man große Dateien hat.
    https://stackoverflow.com/questions/2434133/progress-during-large-file-copy-copy-item-write-progress

    Da habe ich mir folgende Funktion ( siehe unten) von dieser Seite kopiert und mal getestet. Dabei habe ich festgestellt, das die Übertragungsrate max ca. 400 MBit/s ist.

    Kopiere ich per GUI (also mit Maus -> kopieren u einfügen) oder mit dem Copy-Item befehl komme ich auf ca. 990 MBit/s. Also ich nutze die volle Bandbreite (in unser "Spielumgebung")

    Ich weiß nicht genau, was in dieser Funktion steht. Vielleicht hat jemand eine Idee warum die Übertragungsrate so gering ist mit der Funktion und ob sich dort was ändern lässt um die volle Bandbreite zu nutzen ??

    Eigentlich wollte ich eine Prozentuale Fortschrittsanzeige für große Dateien, aber richtig fündig bin ich da nicht geworden.

    Vielen Dank im Voraus

    Marek Augsten

    function Copy-File {
        param( [string]$from, [string]$to)
        $ffile = [io.file]::OpenRead($from)
        $tofile = [io.file]::OpenWrite($to)
        Write-Progress -Activity "Copying file" -status "$from -> $to" -PercentComplete 0
        try {
            [byte[]]$buff = new-object byte[] 4096
            [long]$total = [long]$count = 0
            do {
                $count = $ffile.Read($buff, 0, $buff.Length)
                $tofile.Write($buff, 0, $count)
                $total += $count
                if ($total % 1mb -eq 0) {
                    Write-Progress -Activity "Copying file" -status "$from -> $to" `
                       -PercentComplete ([long]($total/$ffile.Length* 100))
                }
            } while ($count -gt 0)
        }
        finally {
            $ffile.Dispose()
            $tofile.Dispose()
            Write-Progress -Activity "Copying file" -Status "Ready" -Completed
        }
    }


    Marek Augsten



    Mittwoch, 20. Dezember 2017 17:43

Antworten

  •  .... das Kopieren per GUI oder Copy-Item dauert also ca 35 bis 40 Sekunden, oder? Lohnt sich da wirklich der Aufwand, eine aufwändige Fortschrittsanzeige zu bauen? Vielleicht genügt ja auch die einfache Fortschrittsanzeige, die Robocopy im Standard rausrückt. Für große Dateien würde ich sowieso eher Robocopy verwenden als Copy-Item.

    Best regards,

    (79,108,97,102|%{[char]$_})-join''

    • Als Antwort markiert Marek Augsten Mittwoch, 20. Dezember 2017 18:49
    Mittwoch, 20. Dezember 2017 18:17

Alle Antworten

  •  .... das Kopieren per GUI oder Copy-Item dauert also ca 35 bis 40 Sekunden, oder? Lohnt sich da wirklich der Aufwand, eine aufwändige Fortschrittsanzeige zu bauen? Vielleicht genügt ja auch die einfache Fortschrittsanzeige, die Robocopy im Standard rausrückt. Für große Dateien würde ich sowieso eher Robocopy verwenden als Copy-Item.

    Best regards,

    (79,108,97,102|%{[char]$_})-join''

    • Als Antwort markiert Marek Augsten Mittwoch, 20. Dezember 2017 18:49
    Mittwoch, 20. Dezember 2017 18:17
  • Hallo, ja das Kopieren dauert keine 45 Sekunden. Da ist der Aufwand natürlich nicht gerechtfertigt, um etwas aufwändiges zusammen zubauen. Dachte da gibt es was "fertiges & passendes " ;-)

    Ich muss gestehen, das Robocopy eine einfache Fortschrittsanzeige hat, wusste ich garnicht. Ich nutze Robocopy eigentlich nie. Das würde mir ja völlig ausreichen. Ich werde das morgen gleich mal ausprobieren.

    Vielen Dank für den Tipp...


    Marek Augsten


    Mittwoch, 20. Dezember 2017 18:47
  • Na es gibt keinen Fortschrittsbalken oder so, aber die Prozente zeigt er an. Und das wolltest Du ja so, oder?  ;-)

    Best regards,

    (79,108,97,102|%{[char]$_})-join''

    Mittwoch, 20. Dezember 2017 19:22
  • Ja Prozentanzeige passt besser als ein Balken :-)

    MfG


    Marek Augsten

    Mittwoch, 20. Dezember 2017 21:58
  • Noch so als Ergänzung/Tipps:

             [byte[]]$buff = new-object byte[] 4096

    W+rde sich evtl. lohnen, hier mal mit anderen Puffergrößen zu testen.

    Und wenn die Fortschrittsanzeige nicht "nativ Powershell" sein muß (wäre sie bei Robocopy ja auch nicht), dann kannst Du auch per Shell Dateien kopieren:
      $ShellApplication = New-Object -ComObject shell.application

    Mit .Namespace definierst Du Quelle und Ziel, dann .CopyHere am Ziel :)

    Donnerstag, 21. Dezember 2017 09:38
  • Je kleiner die Datenblöcke, desto langsamer die Übertragung.
    Hauptspeicher ist ja eher weniger das Problem, also kann man auch ein 10-Megabyte-Array (oder größer) verwenden. Das sollte Durchsatz bringen.
    Donnerstag, 21. Dezember 2017 13:04