Search code examples
powershellprogress-barprogresscopyingcopy-item

Progress during large file copy (Copy-Item & Write-Progress?)


Is there any way to copy a really large file (from one server to another) in PowerShell AND display its progress?

There are solutions out there to use Write-Progress in conjunction with looping to copy many files and display progress. However I can't seem to find anything that would show progress of a single file.

Any thoughts?


Solution

  • I haven't heard about progress with Copy-Item. If you don't want to use any external tool, you can experiment with streams. The size of buffer varies, you may try different values (from 2kb to 64kb).

    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 = [int]$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 * 100 / $ffile.Length))
                }
            } while ($count -gt 0)
        }
        finally {
            $ffile.Dispose()
            $tofile.Dispose()
            Write-Progress -Activity "Copying file" -Status "Ready" -Completed
        }
    }