按哈希比较文件,但我需要名称而不仅仅是哈希



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

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

$Source = Get-ChildItem -recurse –Path E:path | foreach  {Get-FileHash –Path $_.FullName}
$Destination = Get-ChildItem -recurse –Path "\servere$path" | foreach  {Get-FileHash –Path $_.FullName}
Compare-Object -ReferenceObject $Source.hash  -DifferenceObject $Destination.hash 

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

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

要进行哈希处理,为什么不使用组对象而不是比较对象。像这样:

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

输出将是这样的:

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

比较对象默认输出差异,
如果要比较哈希名称(不带路径(
存在Get-FileHash仅输出AlgorithmHash和完整Path的问题。

可以直接通过管道Get-ChildItem输出到Get-FileHash
但需要附加名称(此处使用计算属性(

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

## Q:Test2019612SO_565666700.ps1
$SourceDir = 'E:path'          # 'C:Bat' # 
$TargetDir = '\servere$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

最新更新