Cambie el nombre de todos los archivos en una carpeta a su hash SHA1

3

Me gustaría cambiar el nombre de todos los archivos en una carpeta a su valor SHA1 HASH.

Tengo una utilidad de línea de comandos que puedo usar "sha1.exe -s"para hacer eco del valor SHA1 Hash, pero necesito cambiar el nombre de todos los archivos en esa carpeta para que coincida (sin extensión).

Esencialmente, me gustaría que funcionara así:

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

En la práctica resulta algo como esto:

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

Estoy abierto a usar otros recursos como Powershell si eso es lo que se requiere.

Agradezco cualquier ayuda!

Craysh
fuente

Respuestas:

2

Cree un archivo hasher.bat(para facilitar su ubicación sha1.exeen la misma carpeta):

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

Ahora en CMD puede ejecutar el lote utilizando la siguiente declaración:

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

Ankit
fuente
¡Esto es perfecto! Por simplicidad puse sha1.exe en la carpeta "c: \ windows" y creé otro archivo por lotes que puede invocar el archivo hasher.bat: para %% A IN (C: \ PathToFolder *) DO C: \ SomeFolder \ hasher .bat "%% A"
Craysh
1

No estoy familiarizado con un forfilescomando, ni con una /Popción para forcomandos similares que conozco, así que supongo que E:\software\sha1es un archivo de texto que enumera los archivos en los que desea operar, una ruta por línea.

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

o si lo estás escribiendo a mano:

gc E:\software\sha1 | % { ren $_ (sha1.exe -s $_) }
Jay Bazuzi
fuente
En realidad, la /Popción acepta un directorio para obtener el listado para operar. Entonces, si reemplazas Get-Contentcon Get-ChildItem, eres dorado.
zdan
0

El marco .Net tiene características de hashing incorporadas. Aquí se explica cómo hacerlo en PowerShell sin utilizar utilidades adicionales.

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 ejemplo, para cambiar el nombre de todos los archivos en c: \ temp, ejecute el comando:

Rename-FilesToSHA -Path c:\temp
MFT
fuente