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
一道简单的理论题。 如果我使用 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