如何用for循环保存Get-FileHash输出至文件,保留所有哈希并添加文件名?
解决方案
1. 避免覆盖文件并保留所有哈希值
你的代码每次循环调用Out-File时都会覆盖目标文件,因为默认是写入模式而非追加。有两种高效的解决方式:
方式一:使用追加模式
在Out-File后添加-Append参数,每次循环将结果追加到文件末尾:
for ($var = 0; $var -le 9999; $var++) { $filePath = "C:\Users\Name\Documents\Filename$var.txt" Get-FileHash -Path $filePath | Select-Object @{Name='FileName'; Expression={Split-Path $_.Path -Leaf}}, Hash | Out-File -FilePath C:\Users\Name\Documents\HashFiles.txt -Append }
方式二:先收集所有结果再一次性写入(推荐)
先将所有计算结果存入变量,最后统一写入文件,减少文件IO操作次数,性能更优:
# 收集所有哈希结果 $hashResults = for ($var = 0; $var -le 9999; $var++) { $filePath = "C:\Users\Name\Documents\Filename$var.txt" # 可选:检查文件是否存在,避免不存在的文件导致报错 if (Test-Path -Path $filePath) { Get-FileHash -Path $filePath | Select-Object @{Name='FileName'; Expression={Split-Path $_.Path -Leaf}}, Hash } } # 一次性写入文件 $hashResults | Out-File -FilePath C:\Users\Name\Documents\HashFiles.txt
2. 在哈希值前添加对应的文件名
通过Select-Object自定义输出属性,从Get-FileHash返回的对象中提取文件名(不含路径)并与哈希值配对:
@{Name='FileName'; Expression={Split-Path $_.Path -Leaf}}:创建名为FileName的属性,用Split-Path -Leaf从完整路径中提取纯文件名。- 如果改用
Get-ChildItem批量获取文件(更简洁),可以直接用$_.Name获取文件名:
Get-ChildItem -Path "C:\Users\Name\Documents\Filename*.txt" | Get-FileHash | Select-Object @{Name='FileName'; Expression={$_.Name}}, Hash | Out-File -FilePath C:\Users\Name\Documents\HashFiles.txt
输出示例
最终文件HashFiles.txt的内容会类似:
FileName Hash -------- ---- Filename0.txt A9993E364706816ABA3E25717850C26C9CD0D89D Filename1.txt 7C4A8D09CA3762AF61E59520943DC26494F8941B ...
内容的提问来源于stack exchange,提问作者Brittany Broome
相关产品推荐
相关产品推荐

