【问题标题】:MD5 hash all files and then Compare with the Original csvMD5 哈希所有文件,然后与原始 csv 比较
【发布时间】:2021-01-29 22:39:18
【问题描述】:

使用下面的命令为我的所有媒体文件创建 MD5 哈希后,我想要 PowerShell

Get-ChildItem -Path 'D:\Media 1\' -Recurse -File |  
       Get-FileHash -Algorithm MD5 | 
       Export-Csv -Path 'D:\MediaHashes1.csv' -UseCulture -NoTypeInformation

将新创建的 Mediahashes1.csv 与原始 D"\Originalhashes.csv 进行比较 并创建一个新的 csv 文件通知我它们是否相同 谢谢

【问题讨论】:

  • 你看Compare-Object了吗?
  • 我想比较新创建的 CSV 中的每个散列,并与 Originalhashes.csv 中的散列进行比较,然后与 Powershell 进行比较,例如创建一个新的 CSV 文件,告诉我它们是否相同如果 powershell 能做到这一点会非常高兴

标签: powershell


【解决方案1】:

使用 Import-Csv 将旧 CSV 和新 CSV 读取到单独的变量中,然后调用 Compare-Object 进行比较。确保比较 HashPath 以检测移动的文件。

$oldHashes = Import-Csv oldhashes.csv
$newHashes = Import-Csv newhashes.csv
Compare-Object $oldHashes $newHashes -Property Hash, Path | Export-Csv difference.csv

作为一种性能优化,您可以在生成新哈希时将它们存储在一个变量中。这样您就不必再次从文件中读取新的哈希值。

如果 CSV 相等,则输出文件“difference.csv”将为空。

否则输出文件包含所有差异。 SideIndicator 列指示 Hash 和 Path 的给定组合是仅存在于 oldhashes.csv (SideIndicator <=) 中还是仅存在于 newhashes.csv (SideIndicator =>) 中。


进一步改进

上面的代码输出重复的路径,以防文件被修改。为了便于阅读,以表格格式输出示例:

Path            Hash                             SideIndicator
----            ----                             -------------
C:\test\bar.txt 73FEFFA4B7F6BB68E44CF984C85F6E88 <=
C:\test\baz.txt D41D8CD98F00B204E9800998ECF8427E =>
C:\test\foo.txt 2AF65102DB00B80835E1578278064AD1 =>
C:\test\foo.txt 37B51D194A7513E45B56F6524F2D51F2 <=

文件“foo.txt”被列出两次,因为它以新旧状态存在,但内容有所修改。要删除重复的路径,我们可以使用Group-ObjectPath 属性进行分组:

# Compare and store differences in variable $diff
$diff = Compare-Object $oldHashes $newHashes -Property Path, Hash | Sort-Object 

# Group on path to create only a single output item for each modified file
$groupedDiff = $diff | Group-Object Path | ForEach-Object {

    # The pscustomobject is the output of the ForEach-Object script block
    [pscustomobject] @{
        Path = $_.Name

        # If group has only one element, the file exists either in old or in new state.
        # Otherwise we have a modified file, which will be indicated by
        # special SideIndicator value '<>'.
        SideIndicator = if( $_.Count -eq 1 ) { $_.Group.SideIndicator } else { '<>' }
    }
}

$groupedDiff | Export-Csv difference.csv

$groupedDiff的表格内容:

Path            SideIndicator
----            -------------
C:\test\bar.txt <=
C:\test\baz.txt =>
C:\test\foo.txt <>

现在我们只得到“foo.txt”的一行,其中&lt;&gt; 清楚地表明该文件已被修改。我没有输出哈希值,因为在这种输出格式中我看不到它们有多大用处。如果您需要它们,请将属性添加到 [pscustomobject] 并分配 $_.Group.Hash

【讨论】:

    【解决方案2】:

    您想比较 CSV 中的每个哈希值还是只比较文件的哈希值? 为此,您可以使用Compare-Object cmdlet。如需更多信息,请提供更多信息 Doc

    【讨论】:

    • 感谢您的回答我想比较新创建的 CSV 中的每个散列并与 Originalhashes.csv 中的散列进行比较,如果您可以编辑我的命令,我将非常高兴生成哈希后也进行比较,谢谢
    • "...如果您可以编辑我的命令,我会非常高兴,这样它也可以在生成哈希后进行比较,谢谢" 所以不是代码- 写作服务;您应该阅读参考文档并自己尝试一下,然后发布您遇到的任何具体问题。
    • SO 是一个信息交换平台,因为 boxdog 已经提到不是代码编写服务。请记住,从简单的控件 c 和控件 v 中,您将不会学到任何关于编码的知识。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-27
    • 1970-01-01
    • 2016-08-20
    • 1970-01-01
    • 2013-12-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多