Benennen Sie alle Dateien in einem Ordner in ihren SHA1-Hash um

3

Ich möchte alle Dateien in einem Ordner in ihren SHA1 HASH-Wert umbenennen.

Ich habe ein Befehlszeilenprogramm, mit dem ich "sha1.exe -s"den SHA1-Hash-Wert ausgeben kann, aber ich muss alle Dateien in diesem Ordner umbenennen, damit sie mit ihm übereinstimmen (keine Erweiterung).

Im Wesentlichen möchte ich, dass es so funktioniert:

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

In der Praxis stellt sich so etwas heraus:

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

Ich bin offen für die Verwendung anderer Ressourcen wie Powershell, wenn dies erforderlich ist.

Ich freue mich über jede Hilfe!

Craysh
quelle

Antworten:

2

Erstellen Sie eine Datei hasher.bat(zum leichteren Platzieren sha1.exein demselben Ordner):

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

Jetzt können Sie in CMD den Batch mit der folgenden Anweisung ausführen:

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

Ankit
quelle
Dies ist perfekt! Der Einfachheit halber habe ich sha1.exe im Ordner "c: \ windows" abgelegt und eine weitere Batch-Datei erstellt, die die Datei hasher.bat aufrufen kann: für %% A IN (C: \ PathToFolder *) DO C: \ SomeFolder \ hasher .bat "%% A"
Craysh
1

Ich kenne weder einen forfilesBefehl noch eine /POption für forähnliche Befehle, die ich kenne. Ich vermute also, dass E:\software\sha1es sich um eine Textdatei handelt, in der die Dateien aufgelistet sind, mit denen Sie arbeiten möchten, ein Pfad pro Zeile.

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

oder wenn Sie es von Hand eingeben:

gc E:\software\sha1 | % { ren $_ (sha1.exe -s $_) }
Jay Bazuzi
quelle
Tatsächlich /Pakzeptiert die Option ein Verzeichnis, von dem aus die Auflistung ausgeführt werden kann. Also , wenn Sie ersetzen Get-Contentmit Get-ChildItem, sie ist golden.
zdan
0

Das .Net-Framework verfügt über integrierte Hashing-Funktionen. Hier erfahren Sie, wie Sie dies in Powershell tun können, ohne zusätzliche Dienstprogramme zu verwenden.

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

Um beispielsweise alle Dateien unter c: \ temp umzubenennen, führen Sie den folgenden Befehl aus:

Rename-FilesToSHA -Path c:\temp
MFT
quelle