我正在尝试通过哈希比较文件和目录,它正在工作,但是现在我需要一种更简单的方法来找出哪个文件不同。
我最初是在不比较哈希的情况下开始的,它适用于文件和文件夹,但是除了它们存在的事实外,它什么也没有告诉我。
$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 <=
答案 0 :(得分:2)
如果您要进行哈希处理,为什么不使用组对象而不是比较对象。像这样:
$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}
答案 1 :(得分:0)
默认情况下,比较对象输出差异,
如果要比较哈希和名称(无路径)
存在一个问题,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