批量生成当前文件夹下全部文件的 Hash

题图

S.场景

当前文件夹下有若干个文件。我需要批量生成它们的哈希值(Hash)。

只显示主文件名和后缀,不显示所在文件夹路径,每个文件显示三种 Hash:MD5、SHA1、SHA256。如题图(大标题正下方的图、正文第一张大图)所示。

C.冲突

用图形界面软件,没法批量操作。

结合使用 Powershell 的 Get-ChildItemGet-FileHash 命令,可以批量操作,但是 Get-FileHash 一次只能输出一种 Hash,输出格式不符合上图的要求。

Q.问题

我们该怎么办?

A.解决办法

可以用 Powershell 脚本来解决。

在这里,谷月姐用了数组。代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
$excluded_files = 'Hash.txt','!Write_All_Files_Hashes_to_Hash_txt.ps1','password.txt','readme.txt'
$files = @(Get-ChildItem -Name -Exclude $excluded_files)
$hashes_md5 = 0..($files.Count - 1)
$hashes_sha1 = 0..($files.Count - 1)
$hashes_sha256 = 0..($files.Count - 1)
If (Test-Path Hash.txt) { Clear-Content Hash.txt }
For ($i=0; $i -le ($files.Count - 1); $i++) {
$hashes_md5[$i] = (Get-FileHash -Path $files[$i] -Algorithm MD5).Hash
$hashes_sha1[$i] = (Get-FileHash -Path $files[$i] -Algorithm SHA1).hash
$hashes_sha256[$i] = (Get-FileHash -Path $files[$i] -Algorithm SHA256).hash
Write-Output ("File : " + $files[$i]) ("MD5 : " + $hashes_md5[$i]) ("SHA1 : " + $hashes_sha1[$i]) ("SHA256 : " + $hashes_sha256[$i]) `r`n >> Hash.txt
}

将上述代码另存为 !Write_All_Files_Hashes_to_Hash_txt.ps1,右击这个 PS1 文件,选择「使用 PowerShell运行」,就会在当前文件夹下生成 Hash.txt 文件。Hash.txt 文件的内容是所有文件的 Hash 值,当然,排除 Hash.txt!Write_All_Files_Hashes_to_Hash_txt.ps1

逐句解释

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# 要排除的文件列表。注意 `Hash.txt` 和我们的脚本文件 `!Write_All_Files_Hashes_to_Hash_txt.ps1` 一定要放进要排除的文件列表。
$excluded_files = 'Hash.txt','!Write_All_Files_Hashes_to_Hash_txt.ps1','password.txt','readme.txt'

# 获取当前文件夹下所有文件,排除上一语句要排除的文件。
$files = @(Get-ChildItem -Name -Exclude $excluded_files)

# 建立三个数组
$hashes_md5 = 0..($files.Count - 1)
$hashes_sha1 = 0..($files.Count - 1)
$hashes_sha256 = 0..($files.Count - 1)

# 如果 Hash.txt 存在,就清除其内容
If (Test-Path Hash.txt) { Clear-Content Hash.txt }

# For 循环,循环次数等于当前文件夹下文件的数量,注意是从 0 开始计数的
For ($i=0; $i -le ($files.Count - 1); $i++) {

# 分别计算文件 $files[$i] 的 MD5、SHA1、SHA256,并写入对应的三个数组的第 $i 号元素
$hashes_md5[$i] = (Get-FileHash -Path $files[$i] -Algorithm MD5).Hash
$hashes_sha1[$i] = (Get-FileHash -Path $files[$i] -Algorithm SHA1).hash
$hashes_sha256[$i] = (Get-FileHash -Path $files[$i] -Algorithm SHA256).hash

# 将每个文件的文件名(主文件名和后缀) 、MD5、SHA1、SHA256 输出到 Hash.txt
# 注意冒号前后的空格 ;-)
Write-Output ("File : " + $files[$i]) ("MD5 : " + $hashes_md5[$i]) ("SHA1 : " + $hashes_sha1[$i]) ("SHA256 : " + $hashes_sha256[$i]) `r`n >> Hash.txt
}

注意:这样生成的 Hash.txt 默认编码是带 BOM 的 UTF-16LE。如果需要跨平台使用,最好用 Notepad3、Notepad++、Emeditor、EditPlus 等专门为程序员开发的文本编辑器转码为不带 BOM 的 UTF-8 格式。

P. 图片来源

题图:自制

头图:Seidenperle from Pixabay


求扫码打赏
“我这么可爱,请给我钱 o(*^ω^*)o”

批量生成当前文件夹下全部文件的 Hash
https://blog.kukmoon.com/ea8661737383/
作者
Kukmoon谷月
发布于
2024年7月1日
许可协议