【问题标题】:Comparing files by their hash, but I need the names not just the hashes通过哈希比较文件,但我需要的不仅仅是哈希的名称
【发布时间】:2019-06-12 16:28:12
【问题描述】:

我正在尝试通过哈希比较文件和目录,它正在工作,但我现在需要一种更简单的方法来确定哪个文件不同。

我一开始没有比较哈希值,它适用于文件和文件夹,但除了它们存在的事实之外,它不会告诉我任何其他信息。

$Source = Get-ChildItem -recurse –Path E:\path | foreach  {Get-FileHash –Path $_.FullName}
$Destination = Get-ChildItem -recurse –Path "\\server\e$\path" | foreach  {Get-FileHash –Path $_.FullName}

Compare-Object -ReferenceObject $Source.hash  -DifferenceObject $Destination.hash 

现在这很好用,但我还想列出与哈希关联的文件。获得哈希后,我需要返回文件并将哈希与原始目录进行比较,以确定它来自哪个目录。

InputObject                                                      SideIndicator
-----------                                                      -------------
CFD1DF3C08A9F7C4D81E22DA7D1CBB35FA12220C3CB85777EBA9BD89362AEDA3 =>           
2B098B7FC189A87B41A7706EA7ABFFDB343B8B5AF3712BA6614E04BD3032A977 =>           
D8CBDD03564C3547D8189D11A9BAE078FBD70986DBFB485EAEE5170C13113798 =>           
F5D7AE29DB432EC3421EE956B70927AE394C0F27CE00FF855666DBC3E14084DB <=           
85795253C6CCDC3CC2A4CAE055CC7478946CDB33D35EAE2BB5796C55954205B2 <=           
9CE2A42C8FFA2D8001BA2874324987DCEF601173CB2ED8B654A76598F90B126E <=

【问题讨论】:

    标签: powershell compare


    【解决方案1】:

    如果您要进行哈希,为什么不使用 Group-Object 而不是 Compare-Object。像这样的:

    $Source = Get-ChildItem -recurse –Path E:\path
    $Destination = Get-ChildItem -recurse –Path "\\server\e$\path"
    $Source + $Destination | Group-Object @{Expression={(Get-FileHash $_.FullName).hash}} | ? {$_.Count -gt 1} 
    

    输出会是这样的:

    Count Name                      Group                                                                                                                       
    ----- ----                      -----                                                                                                                       
        2 DF7E70E5021544F4834BBE... {b.txt, c.txt}
    

    【讨论】:

    • 这确实对它们进行了分组,但我正在查看数千个文件,并且只想要不同的文件。如果我按照你的方式做,我可以把它改成 {$_.Count -lt 2} 它似乎只显示不同的文件。谢谢
    【解决方案2】:

    Compare-Object 默认输出差异,
    如果您想比较散列 名称(无路径)
    问题是Get-FileHash 只输出Algorithm,Hash 和完整的Path

    您可以直接将Get-ChildItem 输出到Get-FileHash
    但需要附加名称(此处使用计算属性)

    我将使用-PassThru 参数并使用指定属性HashName 的整个对象进行比较。

    ## Q:\Test\2019\06\12\SO_565666700.ps1
    $SourceDir = 'E:\path'          # 'C:\Bat' # 
    $TargetDir = '\\server\e$\path' # 'K:\Bat' # 
    
    $Source = Get-ChildItem –Path $SourceDir -Recurse -PipeLineVar Item |
        Get-FileHash | Select-Object *,@{n='Name';e={$Item.Name}}
    $Target = Get-ChildItem –Path $TargetDir -Recurse -PipeLineVar Item |
        Get-FileHash | Select-Object *,@{n='Name';e={$Item.Name}}
    
    Compare-Object -ReferenceObject  $Source -Property Name,Hash `
                   -DifferenceObject $Target -PassThru |
        Sort-Object Name | Select-Object Hash,Path
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-27
      • 1970-01-01
      • 2016-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-15
      • 1970-01-01
      相关资源
      最近更新 更多