3

Я хотел бы переименовать все файлы в папке в их значение SHA1 HASH.

У меня есть утилита командной строки, с помощью которой я могу использовать "sha1.exe -s" для вывода значения SHA1 Hash, но мне нужно переименовать все файлы в этой папке, чтобы они соответствовали (без расширения).

По сути, я хотел бы, чтобы это функционировало так:

rename file.exe (sha1.exe -s file.exe)

На практике получается примерно так:

forfiles /p E:\software\sha1 /c "cmd /c rename @file (sha1.exe -s @file)"

Я открыт для использования других ресурсов, таких как Powershell, если это то, что требуется.

Я ценю любую помощь!

3 ответа3

2

Создайте файл 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"

1

Я не знаком ни с командой forfiles , ни с параметром /P для любых известных мне команд типа for , поэтому я предполагаю, что E:\software\sha1 - это текстовый файл, в котором перечислены файлы, с которыми вы хотите работать. путь на линию.

Get-Content E:\software\sha1 |
    foreach {
        ren $_ (sha1.exe -s $_)
    }

или если вы печатаете это вручную:

gc E:\software\sha1 | % { ren $_ (sha1.exe -s $_) }
0

.NET Framework имеет встроенные функции хеширования. Вот как это сделать в 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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .