首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >验证Linux生成的md5sum文件的Powershell脚本

验证Linux生成的md5sum文件的Powershell脚本
EN

Code Review用户
提问于 2020-07-22 18:07:28
回答 1查看 455关注 0票数 7

我正在通过一个低速的,可能是错误的实验通信通道将一些文件从Linux机器转移到Windows机器上,我想测试这个通道。其中一个测试是在接收端传输大量大小文件并验证它们的加密散列。在Linux方面,我们使用md5sum生成文件散列,如下所示:

代码语言:javascript
复制
md5sum * > files.md5

然后将文件从Linux机器传输到Windows 10机器。接下来我要做的是验证普通Windows机器上的散列(没有安装Cygwin )。因此,为了模拟md5sum -c files.md5的默认操作,它将逐行进行,并验证每个md5校验和,我编写了这个Powershell脚本。比起Powershell,我更多的是呆在bash,所以我想我可能会从评论中受益。

代码语言:javascript
复制
param (
    [Parameter(Mandatory=$true)][string]$infile
)
$basedir = Split-Path -Parent $infile
$badcount = 0
foreach ($line in [System.IO.File]::ReadLines("$infile")) {
    $sum, $file = $line.split(' ')
    $fullfile = "$basedir\$file"
    $filehash = Get-FileHash -Algorithm MD5 $fullfile
    if ($sum -eq $filehash.Hash) {
        Write-Host $file ": OK"
    } else {
        Write-Host $file ": FAILED"
        $badcount++
    }
}
if ($badcount -gt "0") {
    Write-Host "WARNING:" $badcount "computed checksums did NOT match"
}
EN

回答 1

Code Review用户

回答已采纳

发布于 2020-07-22 20:33:48

以下是我要做的一些改变。这些想法..。

  • 使用Get-Content而不是ReadLines(),除非您处理大量的文件,否则速度差异并不大。使用标准cmdlet,除非从其他方面获得有意义的好处。
  • 测试该文件是否存在
  • 构建一个[PSCustomObject]以保存所需的结果项
  • 将这些PSCO保存在一个集合中
  • 在完整测试结束后查看散列失败项。

它所做的..。

  • 设置常量
  • 生成一个测试文件,以便在准备使用自己的数据时删除整个#region/#endregion块。
  • 读取哈希列表文件
  • 迭代生成的数组。
  • 分割出文件名和哈希值。
  • 生成要检查的完整文件名。
  • 测试以查看该文件是否存在。
  • 如果是,则获取文件哈希并保存它。
  • 如果没有,则将文件哈希$Var设置为'__N/A__'
  • 使用看似有用的属性构建一个PSCO。
  • 将其发送到$Result集合
  • 获取集合中的散列失败并显示它们(如果您想要的话--计数),将所有这些都包装在@()中,并将.Count添加到末尾。

密码..。

代码语言:javascript
复制
$SourceDir = $env:TEMP
$HashFileName = 'FileHashList.txt'
$FullHashFileName = Join-Path -Path $SourceDir -ChildPath $HashFileName

#region >>> make a hash list to compare with
#    remove this entire "#region/#endregion" block when ready to work with your real data
$HashList = Get-ChildItem -LiteralPath $SourceDir -Filter '*.log' -File |
    ForEach-Object {
        '{0} {1}' -f $_.Name, (Get-FileHash -LiteralPath $_.FullName-Algorithm 'MD5').Hash
        }
# munge the 1st two hash values
$HashList[0] = $HashList[0] -replace '.{5}输出..。FileName                  CopyOK OriHash                          CopyHash                        
--------                  ------ -------                          --------                        
Genre-List_2020-07-07.log  False 7C0C605EA7561B7020CBDAE24D1--BAD 7C0C605EA7561B7020CBDAE24D140E40
Genre-List_2020-07-14.log  False 20F234ACE66B860821CF8F8BD5E--BAD 20F234ACE66B860821CF8F8BD5EC144D, '--BAD'
$HashList[1] = $HashList[1] -replace '.{5}输出..。A47, '--BAD'

$HashList |
    Set-Content -LiteralPath $FullHashFileName
#endregion >>> make a hash list to compare with

$Result = foreach ($Line in (Get-Content -LiteralPath $FullHashFileName))
    {
    $TestFileName, $Hash = $Line.Split(' ')
    $FullTestFileName = Join-Path -Path $SourceDir -ChildPath $TestFileName
    if (Test-Path -LiteralPath $FullTestFileName)
        {
        $THash = (Get-FileHash -LiteralPath $FullTestFileName -Algorithm 'MD5').Hash
        }
        else
        {
        $THash = '__N/A__'
        }
    [PSCustomObject]@{
        FileName = $TestFileName
        CopyOK = $THash -eq $Hash
        OriHash = $Hash
        CopyHash = $THash
        }
    }

$Result.Where({$_.CopyOK -eq $False})

输出..。

A47

票数 5
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/245882

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档