我想将文件夹中的所有文件重命名为其 SHA1 HASH 值。
我有一个命令行实用程序,可以用来"sha1.exe -s"
回显 SHA1 哈希值,但我需要重命名该文件夹中的所有文件以匹配它(无扩展名)。
本质上,我希望它能像这样发挥作用:
rename file.exe (sha1.exe -s file.exe)
实践结果如下:
forfiles /p E:\software\sha1 /c "cmd /c rename @file (sha1.exe -s @file)"
如果需要的话,我愿意使用其他资源,例如 Powershell。
我很感激任何帮助!
答案1
创建一个文件hasher.bat
(为了方便放置sha1.exe
在同一个文件夹中):
@ECHO OFF
SET FULLNAME=%~f1
for /f "delims=" %%a in ('sha1.exe -s %FULLNAME%') do SET hash=%%a
ren %FULLNAME% %hash%
现在,在 CMD 中,您可以使用以下语句运行批处理:
for %A IN (C:\PathToFolder\*) DO C:\SomeFolder\hasher.bat "%A"
答案2
我不熟悉forfiles
命令,也不熟悉我所知道的/P
任何for
类似命令的选项,所以我猜这E:\software\sha1
是一个文本文件,列出了你想要操作的文件,每行一个路径。
Get-Content E:\software\sha1 |
foreach {
ren $_ (sha1.exe -s $_)
}
或者如果你手写输入:
gc E:\software\sha1 | % { ren $_ (sha1.exe -s $_) }
答案3
.Net 框架具有内置的散列功能。以下是如何在 powershell 中执行此操作而不使用其他实用程序。
function Rename-FilesToSHA {
[CmdletBinding()]
Param(
[ValidateScript({ Test-Path $_ })]
$Path
)
$hasher = [System.Security.Cryptography.HashAlgorithm]::Create('SHA1')
$files = Get-ChildItem $Path -Recurse | Where-Object {-not $_.PSIsContainer}
foreach ($file in $files) {
$fs = New-Object IO.FileStream($file.FullName, 'Open')
$sb = New-Object System.Text.StringBuilder
$hasher.ComputeHash($fs) | ForEach-Object { [void]$sb.Append($_.ToString("x2")) }
$fs.Close()
$file | Rename-Item -NewName $sb.ToString()
}
}
例如,要重命名 c:\temp 下的所有文件,请运行以下命令:
Rename-FilesToSHA -Path c:\temp