将文件夹中的所有文件重命名为其 SHA1 哈希值

将文件夹中的所有文件重命名为其 SHA1 哈希值

我想将文件夹中的所有文件重命名为其 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

相关内容