Robocopy 损坏的文件指示

Robocopy corrupted files indication

一道简单的理论题。 如果我使用 robocopy 命令,例如从笔记本电脑复制到外部硬盘,它是否有某种机制来检测复制过程中已损坏的损坏文件? 如果是这样,“/r”会帮助我吗?

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

对于我手头的 25GB 随机文件样本,验证只用了大约 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