PowerShell(或CMD)中的md5散列以及相对文件路径

时间:2019-06-03 11:25:42

标签: powershell cmd

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

答案 0 :(得分:2)

这能为您提供所需的东西吗?

$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并仅选择哈希属性,同时使用Calculated Property返回Path作为相对路径。
  • ForEach循环的结果返回到$Result变量,然后将其输出到带有Out-File的文件中。

答案 1 :(得分:1)

类似这样的东西:

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