PowerShell相同文件哈希对比函数返回false问题排查求助
PowerShell哈希对比函数失效的问题原因及修复方案
问题原因
- 错误使用格式化命令:你通过
Format-List Hash处理Get-FileHash的输出,该命令返回的是格式化展示用的对象(类型为Microsoft.PowerShell.Commands.Internal.Format.FormatEntryData),而非纯哈希字符串。即使两个文件的哈希值逻辑上相同,这两个格式化对象的内部元数据并不一致,导致Compare-Object或-eq对比时判定为不匹配。 - 拼写错误:代码中
@(Compare-Object $HASH_1 $HASH_2).Lenght的Lenght是拼写错误,正确应为Length,不过这不是导致匹配失败的核心原因。
修复方法
核心是直接提取Get-FileHash返回对象的Hash属性值(纯字符串),而非使用格式化命令处理输出。以下是修复后的函数:
Function Compare-Hash { param ( $FILE_1, $FILE_2 ) # 直接获取哈希字符串,而非格式化对象 $HASH_1 = (Get-FileHash $FILE_1 -Algorithm SHA256).Hash $HASH_2 = (Get-FileHash $FILE_2 -Algorithm SHA256).Hash # 直接对比字符串相等性 $HASH_MATCHED = $HASH_1 -eq $HASH_2 If ($HASH_MATCHED) { Write-Host -ForegroundColor Green Hash matched! } else { Write-Host -ForegroundColor Red Hash not matched! # 可选:输出具体哈希值便于排查差异 Write-Host "File 1 Hash: $HASH_1" Write-Host "File 2 Hash: $HASH_2" } }
额外说明
- 若仍想使用
Compare-Object,需基于哈希字符串对比,同时修正拼写错误:$HASH_MATCHED = @(Compare-Object $HASH_1 $HASH_2).Length -eq 0 - 直接对比字符串(
-eq)是更高效的方式,适合这种简单的相等性判断。
内容的提问来源于stack exchange,提问作者caionam
相关产品推荐
相关产品推荐

