使用PowerShell(或CMD)生成文件相对路径的MD5哈希值

3

我想要将一个目录及其子目录中所有文件的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
2个回答

6

这能满足你的需求吗?

$Files = Get-ChildItem "*.*" -Recurse

$Result = ForEach ($File in $Files) {
    Get-FileHash $File -Algorithm MD5 | Select-Object Hash,@{N='Path';E={$_.Path | Resolve-Path -Relative}}
} 

$Result | Out-File C:\Users\MYUSERNAME\Desktop\MYFOLDER\hashes.txt

说明:

  • 使用Get-ChildItem将所有文件检索到名为$Files的变量中。
  • 循环遍历每个文件,并使用Get-FileHash检索FileHash,该函数也返回完整的路径作为路径。
  • 将此结果传递给Select-Object,并仅选择哈希属性,同时使用计算属性Path返回为相对路径。
  • ForEach循环的结果返回到$Result变量,然后使用Out-File输出到文件中。

要将哈希值转换为小写字母,请使用以下命令:Select-Object @{n='Hash';e={$_.Hash.ToLower()}},... 要从 $Result 中删除表头,请使用以下命令:$Result | Format-Table -HideTableHeaders | Out-File $ENV:USERPROFILE\Desktop\MYFOLDER\hashes.txt - user6811411
感谢Mark Wragg、LotPings和mhu的快速回复。我进一步修改了$Result行,以去除空行的方式 ($Result|Format-Table -HideTableHeaders|Out-String).Trim()|Out-File C:\Users\MYUSERNAME\Desktop\MYFOLDER\hashes.txt。 此外,“>”似乎可以作为“| Out-File”的别名。 - Stacey
此外,我发现Format-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

1

类似这样:

Get-ChildItem -Path $path -Recurse | 
    Get-FileHash -Algorithm MD5 | 
    Select-Object "Hash","Path" | 
    ConvertTo-Csv -NoTypeInformation | 
    Out-File -FilePath "files.txt"

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