如何在Powershell中获取文件哈希及创建、修改时间等属性
PowerShell获取文件属性及哈希值解决方案
命令编写问题修复
你遇到的报错是因为Get-FileHash直接插入管道时,输出的哈希对象会覆盖原本的文件属性对象,导致后续Select无法读取到文件的时间、名称属性。你可以通过计算属性将哈希值整合到Select-Object的返回结果中,无需拆分管道流程,正确命令如下:
# 递归获取所有文件的名称、路径、创建时间、修改时间、SHA256哈希值 gci -Recurse -File | select Name, FullName, CreationTime, LastWriteTime, ` @{ Name = 'SHA256Hash' Expression = { (Get-FileHash -Path $_.FullName -Algorithm SHA256).Hash } }
参数说明:
-File参数过滤掉文件夹对象,避免对文件夹调用哈希计算报错- 自定义计算属性中
$_指代当前管道传递的单个文件对象,调用Get-FileHash后提取哈希值赋值给自定义的SHA256Hash字段 - 需要其他哈希算法时,将
SHA256替换为MD5、SHA1等参数即可
时间属性比对说明
直接比对原生的CreationTime、LastWriteTime不是通用最优方案,存在两个常见兼容问题:
- 精度兼容问题:部分文件系统(如FAT32)仅支持2秒级的时间精度,跨文件系统拷贝文件后,直接全等比对毫秒级精度的DateTime对象会出现误判。这种场景下建议将时间转换为统一精度后再比对,示例如下:
# 转换为秒级精度的UTC时间字符串比对,同时规避时区差异问题 $sourceTime = $file.CreationTimeUtc.ToString("yyyy-MM-dd HH:mm:ss") $targetTime = $targetFile.CreationTimeUtc.ToString("yyyy-MM-dd HH:mm:ss")
- 时区差异问题:跨时区的设备生成的文件时间会带时区偏移,直接比对本地时间会出现偏差,建议统一使用
CreationTimeUtc、LastWriteTimeUtc的UTC时间属性做比对。
如果是做文件一致性校验,建议结合文件大小、哈希值和时间属性三者共同判断,避免时间被篡改或系统自动更新时间导致的误判。
内容的提问来源于stack exchange,提问作者user10191234
相关产品推荐
相关产品推荐

