复制后如何在源和目标上执行MD5验证

时间:2016-02-29 22:55:27

标签: powershell hash md5 robocopy

我们需要将~4GB的有效负载复制到多个地理区域,有时组件(dll文件)会被损坏。我在powershell中使用get-hash函数,我的示例代码片段看起来像这样

# PowerShell Invoke-Command source Machine has check
Clear-Host
Invoke-Command -ScriptBlock {dir C:\swtools\7-Zip -Recurse | Where-Object {!$_.psiscontainer } | get-hash | Out-File c:\temp\source.md5.txt}

# PowerShell Invoke-Command on Remote Computer to check filehash at Dest
Clear-Host
Invoke-Command -Computer Remote_Host -ScriptBlock {dir e:\downloads\7-zip -Recurse | Where-Object {!$_.psiscontainer } | get-hash } | Out-File c:\temp\dest.md5.txt

# PowerShell compare to check if the md5 hashes are equal at source and dest

Compare-Object $(Get-Content c:\temp\source.md5.txt) $(Get-Content c:\temp\dest.md5.txt) -includeequal

这并没有解决问题,因为get-hash的输出包含添加到文件名的文件路径,因此我无法真正与源文件名和哈希值进行1:1比较,文件名和目的地哈希值因为输出包含不同的完整文件路径

那么确保从源复制到目标的所有程序集的md5校验和匹配是什么的最佳方法是什么?

注意:我不打算创建其他文件,我只通过正则表达式等推送文件名和哈希值,时间和内存都是个问题。

1 个答案:

答案 0 :(得分:1)

您可以管道到Tee-Object以转储到文件(如果您觉得需要转储到文件),然后转到Select-Object修改Path值以排除根路径,并捕获变量中的那个以运行Compare-Object。以下内容将输出您的文件,并捕获Hash输出的修改版本,其中Path将排除根路径,并且仅包含子文件夹和文件名。

# PowerShell Invoke-Command source Machine has check
Clear-Host
$LocalRoot = [RegEx]::Escape('C:\swtools\7-Zip')
$LocalHash = Invoke-Command -ScriptBlock {dir C:\swtools\7-Zip -Recurse | Where-Object {!$_.psiscontainer } | get-hash} | Tee-Object -File c:\temp\source.md5.txt | Select *,@{l='Path';e={$_.Path -replace $LocalRoot}} -ExcludeProperty Path

# PowerShell Invoke-Command on Remote Computer to check filehash at Dest
Clear-Host
$DestRoot = [RegEx]::Escape('e:\downloads\7-zip')
$DestHash = Invoke-Command -Computer Remote_Host -ScriptBlock {dir e:\downloads\7-zip -Recurse | Where-Object {!$_.psiscontainer } | get-hash } | Tee-Object -file c:\temp\dest.md5.txt | Select *,@{l='Path';e={$_.Path -replace $DestRoot}} -ExcludeProperty Path

# PowerShell compare to check if the md5 hashes are equal at source and dest

Compare-Object $LocalHash $DestHash -includeequal