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

标签 powershell sorting

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

这是一种在数据输出到报告文件之前按列完整路径对所有数据进行排序的解决方案吗?

最佳答案

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

您也可以将文件直接运行到 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

关于powershell - 在输出前使用 Get-FileHash 对 Get-ChildItem 的结果进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50132201/

相关文章:

email - 等待60秒,然后如果Send-MailMessage失败,则重新发送Powershell

python - 对同时包含字符串和整数的列表进行排序 (Python)

java - 使用插入排序算法,使用对象数组中的多个字段

powershell - 从 CSV 获取时出现错误 "Get-ADComputer : Cannot find an object with identity"

powershell - Powershell快速在大量文件中搜索短语

powershell - 我可以将 TLS 与 Send-MailMessage cmdlet 一起使用吗?

vba - 您如何为每列顶部的每个命令按钮分配不同的宏,以便它们独立于其他宏工作?

ios - iCloud - NSMetadataQuery 不使用 NSMetadataItemFSCreationDateKey 排序

sorting - awk 根据特定列值完全删除重复行

PowerShell 的 Get-Member cmdlet 不报告所有方法