我想要将一个目录及其子目录中所有文件的md5哈希值写入一个文件。理想情况下,复制Unix命令find . -type f -exec md5sum {} +
的输出(即两列:哈希和相对文件路径)。
我已经查看了CMD命令CertUtil -hashfile afile.txt MD5
,但由于使用dir /A:-D /B /S
给出了完整的文件路径,因此我卡住了。我找到了以下用PowerShell回答:https://superuser.com/a/1249418。我很少使用CMD,并且这是我第一次尝试PowerShell。
Get-FileHash -Algorithm MD5 -Path (Get-ChildItem "*.*" -Recurse | Resolve-Path -Relative | Tee-Object -Variable y) | select hash | Out-File C:\Users\MYUSERNAME\Desktop\MYFOLDER\temphashes.txt
$x = (Get-Content C:\Users\MYUSERNAME\Desktop\MYFOLDER\temphashes.txt).ToLower() | select -skip 3 | ?{$_.Trim(" `t")}
$i = 0; $x | ForEach-Object {($_, $y[$i]) -join " "; $i++} | Out-File C:\Users\MYUSERNAME\Desktop\MYFOLDER\hashes.txt
有没有更好的方法在PowerShell(或CMD中)获取哈希和相对路径?或者至少,可以用最终输出覆盖中间文件`temphashes.txt`吗?
编辑:可以将哈希值转换为小写,并删除标题和额外的尾随空行(参见我尝试的第二行),以使文件看起来像:
d41d8ce98f00b204e9800988ecf8427e .\aSubDirectory\anotherfile.txt
4615fd7b904c04e94cbeced23361c778 .\afile.txt
Select-Object @{n='Hash';e={$_.Hash.ToLower()}},...
要从$Result
中删除表头,请使用以下命令:$Result | Format-Table -HideTableHeaders | Out-File $ENV:USERPROFILE\Desktop\MYFOLDER\hashes.txt
- user6811411Format-Table
选项中的-Autosize
有助于防止较长的文件路径被截断。这是一个单行版本:(Get-FileHash -Algorithm MD5 -Path (gci "*.*" -Recurse) | select @{N='Hash';E={$_.Hash.ToLower()}},@{N='Path';E={$_.Path | rvpa -Relative}} | ft -Autosize -HideTableHeaders | Out-String).Trim() > $ENV:USERPROFILE\Desktop\MYFOLDER\hashes.txt
- Stacey