Сравнение файлов по их хешу, но мне нужны имена, а не только хэши - PullRequest
0 голосов
/ 12 июня 2019

Я пытаюсь сравнить файлы и каталоги по хешу, и это работает, но теперь мне нужен более простой способ выяснить, какой файл отличается.

Я изначально начал, не сравнивая хеш, и он работал для файлов и папок, но он не сказал бы мне ничего, кроме факта их существования.

$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 <=

Ответы [ 2 ]

2 голосов
/ 12 июня 2019

Если вы собираетесь использовать хеш, почему бы не использовать объект группы вместо объекта сравнения. Примерно так:

$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}
0 голосов
/ 12 июня 2019

Compare-Object по умолчанию выводит различия,
, если вы хотите сравнить Hash и Name (без пути)
, есть проблема, что Get-FileHash только выводит Algorithm, Hash и полное Path.

Вы можете напрямую направить Get-ChildItem вывод в Get-FileHash,
, но необходимо присоединить Имя (здесь, используя вычисляемое свойство)

Я бы использовал параметр -PassThru и использовал бы целые объекты, указав для сравнения свойства Hash и Name.

## 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...