Robocopy индикация поврежденных файлов - PullRequest
0 голосов
/ 29 октября 2018

Один простой теоретический вопрос. Если я использую команду robocopy, например, для копирования с ноутбука на внешний жесткий диск, есть ли у нее какой-либо механизм для обнаружения поврежденных файлов, которые были повреждены во время копирования? Если это так, поможет ли мне "/ r" с этим?

1 Ответ

0 голосов
/ 29 октября 2018

Robocopy не имеет переключателя проверки, хотя несколько похожих приложений имеют.XXCopy является популярным.

Вы можете использовать / r и / w, чтобы повторить определенное количество раз и подождать определенное количество секунд между каждой повторной попыткой, что помогает при проблемах с сетью.

Выможет также выполнить сравнение с Get-FileHash после завершения копирования.

Вот очень простой пример.

$source = 'C:\temp'
$destination = 'C:\temp2'
#copy files
robocopy $source $destination /z /e /r:1 /w:1
#get all files, hash them, select just the path and file hash
#group by the hash, and finally get the ones that only have 1 item
#anything successfully copied will have 2 hashes that match
Get-ChildItem $source,$destination | Get-FileHash | Select-Object Path, Hash | Group-Object Hash | Where-Object Count -eq 1

Для случайной выборки 25 ГБ файлов, которая была у меня под рукой, проверкаэто заняло всего ~ 1 минуту.

РЕДАКТИРОВАТЬ: Если вы работаете в v3, вы можете использовать следующий Get-FileHash, но это не является быстрой функцией, которая не была полностью протестирована для всех сред или пограничных случаев.

function Get-TestFileHash
{
    [CmdletBinding()]
    Param
    (
        [Parameter(Mandatory=$true,
                   ValueFromPipeline = $true,
                   Position=0)]
        [String]
        $FileName,
        [Parameter(Position=1)]
        [System.Security.Cryptography.HashAlgorithmName]
        $Algorithm = [System.Security.Cryptography.HashAlgorithmName]::SHA256
    )
    Process
    {
        Foreach($File in $FileName){
            $FilePath = Get-Item $File
            If($FilePath -is [System.IO.FileInfo]){
                $Stream = New-Object System.IO.FileStream($FilePath,[System.IO.FileMode]::Open)
                $StringBuilder = New-Object System.Text.StringBuilder
                [System.Security.Cryptography.HashAlgorithm]::Create($Algorithm).ComputeHash($Stream)|%{[Void]$StringBuilder.Append($_.ToString("x2"))}
                $stream.Close()
                $stream.Dispose()
                [PSCustomObject]@{
                    Algorithm=$Algorithm 
                    Hash=$StringBuilder.ToString().ToUpper()
                    Path=$FilePath
                }
            }
        }
    }
}

Пример этой команды:

PS > dir | Get-TestFileHash

Algorithm Hash                                                             Path                                               
--------- ----                                                             ----                                               
SHA256    CB0363573C31B7E4684A3D620C125DF0CC7C9335379A8C3D08710EA5B65EA014 C:\Users\Bob\documents\afile1.txt
SHA256    E2F6395909A0FF358A3A5ACBEC5B60A2212FE6511D3E593E0940BA0A51D1DD66 C:\Users\Bob\documents\afile2.txt
SHA256    88EB168DD68C484226E5B3E0626AF30B1364DA0D6B53EA168649AB472C5F9FB7 C:\Users\Bob\documents\afile3.txt
SHA256    52A20D3072E8AA919746176C222B355CE7E7E3FA704E81561E366A8934C37509 C:\Users\Bob\documents\afile4.txt
SHA256    DD61CEFC783E581F1A5D490E5A04CE6B7E892201221ABB0E651AD7C272B4B279 C:\Users\Bob\documents\afile5.txt
SHA256    954B7CC9846F800FA5BE5AD14EB8CA9FAA38FBE936E93DA9599B1026EEEF7C06 C:\Users\Bob\documents\afile6.txt
SHA256    0F63AC1AD9A0D51362667B108DFFAED26E283B547F1694DF7DFF8A74357AA68F C:\Users\Bob\documents\afile7.txt
...