在输出之前,使用Get-FileHash对Get-ChildItem的结果进行排序。

5

我尝试编写一个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**              

一切都正常。

期望结果:
我每天都要运行这个命令。在这个目录树中,文件会不时地被删除和重新创建。然而有时候输出文件中的文件顺序会发生变化。 在下面的例子中,report文件中的report5.txt应该在最后一行,但它却在第二行。我猜测这是因为选了递归选项造成的。递归选项对我很重要。当我在没有子目录的目录上运行命令时,结果总是相同的。但是当在包含子目录(目录树)的目录上运行时,结果就不同了。

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                                                     

在输出到报告文件之前,有没有一种方法可以按列fullpath对所有数据进行排序的解决方案?
1个回答

10

您可以按哈希对象的路径属性进行排序。

您还可以直接在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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接