我想将目录及其子目录中的所有文件的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
答案 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
作为相对路径。$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"