我尝试编写Windows PowerShell脚本。我需要从目录树中的所有文件获取文件哈希。
这是我到目前为止所得到的:
Get-ChildItem -Path "c:\temp\path" -Recurse -Force -Attributes !Directory | % {Get-FileHash $_.Fullname} | Out-File "c:\temp\report_file.txt"
文件c:\temp\report_file.txt
是这样的:
Algorithm Hash Path
--------- ---- ----
SHA256 E3B0C44298...E4649B934CA495991B7852B855 c:\temp\path\report1.txt
SHA256 7B989C1C95...6756624B3887E501DCC377DB23 c:\temp\path\report2.txt
SHA256 EA0155401C...A6D44F1DEBB95E401AEFF4F908 c:\temp\path\report3.txt
SHA256 06DAA0E452...32E3F3104EA4564EAB67CA6A0A c:\temp\path\report4.txt
**SHA256 9C7C9FEA96...45F460BA9015C8F0A5CA830B6B c:\temp\path\report5.txt**
一切正常。
期望:
我每天都会运行这个cmdlet很多次。文件将在此目录树中不时删除并重新创建。并且......输出文件中的文件顺序有几次不一样。
在下面的示例中,报告文件中的文件report5.txt
必须位于最后一行,但它位于第二行。我想这是因为选择了递归选项。我需要这个递归选项。当我在没有子目录的目录上运行cmdlet时,结果始终相等。但是当在带有子目录的目录(目录树)上时 - 不是。
Algorithm Hash Path
--------- ---- ----
SHA256 E3B0C44298...E4649B934CA495991B7852B855 c:\temp\path\report1.txt
**SHA256 9C7C9FEA96...45F460BA9015C8F0A5CA830B6B c:\temp\path\report5.txt**
SHA256 7B989C1C95...6756624B3887E501DCC377DB23 c:\temp\path\report2.txt
SHA256 EA0155401C...A6D44F1DEBB95E401AEFF4F908 c:\temp\path\report3.txt
SHA256 06DAA0E452...32E3F3104EA4564EAB67CA6A0A c:\temp\path\report4.txt
这是一个解决方案,可以在数据输出到报告文件之前按行完整路径对所有数据进行排序吗?
答案 0 :(得分:4)
您可以按哈希对象的path属性进行排序。
您也可以在不使用循环的情况下直接将文件运行到Get-FileHash
,我建议将它们导出为CSV而不是文本,因此它会将算法,散列和路径分开,以便您可以更轻松地使用它们:
Get-ChildItem -path "c:\temp\path" -Recurse -Force -File |
Get-FileHash |
Sort-Object -Property 'Path' |
Export-Csv -Path "c:\temp\report_file.csv" -NoTypeInformation