Renomeia todos os arquivos em uma pasta para o hash SHA1

3

Gostaria de renomear todos os arquivos em uma pasta para o valor SHA1 HASH.

Eu tenho um utilitário de linha de comando que eu posso usar "sha1.exe -s" para ecoar o valor SHA1 Hash, mas eu preciso renomear todos os arquivos nessa pasta para corresponder a ele (sem extensão).

Essencialmente, gostaria que funcionasse assim:

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

Na prática, é algo assim:

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

Estou aberto a usar outros recursos, como o Powershell, se for necessário.

Agradeço qualquer ajuda!

    
por Craysh 12.02.2013 / 18:01

3 respostas

2

Crie um arquivo hasher.bat (para lugar fácil sha1.exe na mesma pasta):

@ECHO OFF
SET FULLNAME=%~f1
for /f "delims=" %%a in ('sha1.exe -s %FULLNAME%') do SET hash=%%a
ren %FULLNAME% %hash%

Agora, no CMD, você pode executar o lote usando a seguinte instrução:

for %A IN (C:\PathToFolder\*) DO C:\SomeFolder\hasher.bat "%A"

    
por 12.02.2013 / 21:18
1

Eu não estou familiarizado com o comando forfiles , nem com a opção /P para qualquer comando for -like que eu conheço, então estou supondo que E:\software\sha1 é um arquivo de texto listando os arquivos que você deseja para operar, um caminho por linha.

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

ou se você estiver digitando manualmente:

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

O framework .Net tem recursos de hashing embutidos. Veja como fazer isso no powershell sem usar utilitários adicionais.

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()
    }
}

Por exemplo, para renomear todos os arquivos em c: \ temp, execute o comando:

Rename-FilesToSHA -Path c:\temp
    
por 22.04.2013 / 00:46