powershell - बड़ी फ़ाइल प्रतिलिपि के दौरान प्रगति(कॉपी-आइटम और लिखें-प्रगति?)




progress-bar progress (6)

यह रिकर्सिव फ़ंक्शन स्रोत पथ से गंतव्य पथ तक रिकर्सली फ़ाइलों और निर्देशिकाओं की प्रतिलिपि बनाता है

यदि गंतव्य पथ पर फ़ाइल पहले से मौजूद है, तो यह केवल उन्हें नई फ़ाइलों के साथ कॉपी करती है।

Function Copy-FilesBitsTransfer(
        [Parameter(Mandatory=$true)][String]$sourcePath, 
        [Parameter(Mandatory=$true)][String]$destinationPath, 
        [Parameter(Mandatory=$false)][bool]$createRootDirectory = $true)
{
    $item = Get-Item $sourcePath
    $itemName = Split-Path $sourcePath -leaf
    if (!$item.PSIsContainer){ #Item Is a file

        $clientFileTime = Get-Item $sourcePath | select LastWriteTime -ExpandProperty LastWriteTime

        if (!(Test-Path -Path $destinationPath\$itemName)){
            Start-BitsTransfer -Source $sourcePath -Destination $destinationPath -Description "$sourcePath >> $destinationPath" -DisplayName "Copy Template file" -Confirm:$false
            if (!$?){
                return $false
            }
        }
        else{
            $serverFileTime = Get-Item $destinationPath\$itemName | select LastWriteTime -ExpandProperty LastWriteTime

            if ($serverFileTime -lt $clientFileTime)
            {
                Start-BitsTransfer -Source $sourcePath -Destination $destinationPath -Description "$sourcePath >> $destinationPath" -DisplayName "Copy Template file" -Confirm:$false
                if (!$?){
                    return $false
                }
            }
        }
    }
    else{ #Item Is a directory
        if ($createRootDirectory){
            $destinationPath = "$destinationPath\$itemName"
            if (!(Test-Path -Path $destinationPath -PathType Container)){
                if (Test-Path -Path $destinationPath -PathType Leaf){ #In case item is a file, delete it.
                    Remove-Item -Path $destinationPath
                }

                New-Item -ItemType Directory $destinationPath | Out-Null
                if (!$?){
                    return $false
                }

            }
        }
        Foreach ($fileOrDirectory in (Get-Item -Path "$sourcePath\*"))
        {
            $status = Copy-FilesBitsTransfer $fileOrDirectory $destinationPath $true
            if (!$status){
                return $false
            }
        }
    }

    return $true
}

क्या PowerShell में वास्तव में बड़ी फ़ाइल (एक सर्वर से दूसरे में) की प्रतिलिपि बनाने और इसकी प्रगति प्रदर्शित करने का कोई तरीका है?

कई फाइलों की प्रतिलिपि बनाने और प्रगति प्रदर्शित करने के लिए लूपिंग के साथ संयोजन में लिखें-प्रगति का उपयोग करने के लिए वहां समाधान हैं। हालांकि मुझे ऐसा कुछ भी नहीं मिल रहा है जो एक फ़ाइल की प्रगति दिखाएगा।

कोई विचार?


ट्रेवर सुलिवान के पास Copy-ItemWithProgress पर Copy-ItemWithProgress को Copy-ItemWithProgress नामक कमांड जोड़ने के तरीके पर एक लिखना है।


यह नही है कि मैं जानता हूँ। मैं इसके लिए कॉपी-आइटम का उपयोग करने की सलाह नहीं दूंगा। मुझे नहीं लगता कि इसे पुनः प्रयास करने के लिए robocopy.exe जैसे मजबूत होने के लिए डिज़ाइन किया गया है जिसे आप नेटवर्क पर अत्यधिक बड़ी फ़ाइल प्रतियों के लिए चाहते हैं।


यह बिट्सट्रांसफर का उपयोग करने के लिए एक बेहतर समाधान की तरह प्रतीत होता है, ऐसा लगता है कि अधिकांश विंडोज मशीनों पर PowerShell 2.0 या इससे अधिक के साथ ओओटीबी आती है।

Import-Module BitsTransfer
Start-BitsTransfer -Source $Source -Destination $Destination -Description "Backup" -DisplayName "Backup"

अरे, सीनियर गाय से शॉन कियरनी ! ब्लॉग में एक समाधान है जो मुझे बहुत अच्छी तरह से काम करता है।

Function Copy-WithProgress
{
    [CmdletBinding()]
    Param
    (
        [Parameter(Mandatory=$true,
            ValueFromPipelineByPropertyName=$true,
            Position=0)]
        $Source,
        [Parameter(Mandatory=$true,
            ValueFromPipelineByPropertyName=$true,
            Position=0)]
        $Destination
    )

    $Source=$Source.tolower()
    $Filelist=Get-Childitem "$Source" –Recurse
    $Total=$Filelist.count
    $Position=0

    foreach ($File in $Filelist)
    {
        $Filename=$File.Fullname.tolower().replace($Source,'')
        $DestinationFile=($Destination+$Filename)
        Write-Progress -Activity "Copying data from '$source' to '$Destination'" -Status "Copying File $Filename" -PercentComplete (($Position/$total)*100)
        Copy-Item $File.FullName -Destination $DestinationFile
        $Position++
    }
}

फिर इसका इस्तेमाल करने के लिए:

Copy-WithProgress -Source $src -Destination $dest

मैंने Copy-Item साथ प्रगति के बारे में नहीं सुना है। यदि आप किसी बाहरी उपकरण का उपयोग नहीं करना चाहते हैं, तो आप धाराओं के साथ प्रयोग कर सकते हैं। बफर का आकार भिन्न होता है, आप विभिन्न मानों को आजमा सकते हैं (2kb से 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
        [int]$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 ([int]($total/$ffile.Length* 100))
            }
        } while ($count -gt 0)
    }
    finally {
        $ffile.Dispose()
        $tofile.Dispose()
        Write-Progress -Activity "Copying file" -Status "Ready" -Completed
    }
}




copy-item