Quersummen-Datei pro Ordner erstellen (checksum crc md5 sha)

German support forum

Moderators: Hacker, Stefan2, white

Post Reply
sigbod
Junior Member
Junior Member
Posts: 30
Joined: 2005-02-25, 14:42 UTC

Quersummen-Datei pro Ordner erstellen (checksum crc md5 sha)

Post by *sigbod »

Ich möchte gerne bei vielen Verzeichnissen eine Quersumme pro Verzeichnis erstellen. Ich habe beim erstellen die Option das man für jede Datei eine Quersumme erstellen kann oder nicht. Lass ich die option eingeschaltet so wird auch tatsächlich für jede Datei in den einzelnen Verzeichnissen eine Quersummendatei angelegt. Wähle ich es ab so wird nur eine Quersumme gebildet wo alle Dateien aus allen Verzeichnissen in einer Quersummendatei geschrieben werden. Besteht irgendwie die Möglichkeit das ich mehrere Verzeichnisse auswählen kann und TC nur 1 Quersummendatei pro Verzeichnis incl. U-Verzeichnissen erstellt.

Vielen Dank

Falls es keine Möglichkeit gibt wäre es schön wenn es hierzu noch eine Option gäbe.
User avatar
ZoSTeR
Power Member
Power Member
Posts: 1050
Joined: 2004-07-29, 11:00 UTC

Post by *ZoSTeR »

Hatte mal was gebastelt: Batch CRC-Tool

Könnte das auch noch verdeutschen wenns nötig ist.
sigbod
Junior Member
Junior Member
Posts: 30
Joined: 2005-02-25, 14:42 UTC

Post by *sigbod »

Ist doch verständlich.
Für jedes Verzeichnis soll je eine CRC-Datei erstellt werden, in dessen Inhalt sich alle Prüfsummen der in dem Verzeichnis gespeicherten Dateien befinden inc. der Unterverzeichnisse.
Das kann man aber nur machen mit jeweils einem Verzeichnis. Da ich aber einige hundert Verzeichnisse habe ist mir dies zuviel Aufwand.

Markiere Dir einfach mal 2 Verzeichnisse und erstelle von denen eine Quersumme. Menü -> Dateien -> Quersummen erstellen. Vieleicht erkennst du dann das Problem.
User avatar
ZoSTeR
Power Member
Power Member
Posts: 1050
Joined: 2004-07-29, 11:00 UTC

Post by *ZoSTeR »

Verlinkten Thread gelesen? Oder passt die Lösung nicht?
sigbod
Junior Member
Junior Member
Posts: 30
Joined: 2005-02-25, 14:42 UTC

Post by *sigbod »

Tja wenn man englisch könnte, evtl. ansonsten hätts ich ja im englischen Forum geschrieben.
User avatar
Horst.Epp
Power Member
Power Member
Posts: 6981
Joined: 2003-02-06, 17:36 UTC
Location: Germany

Post by *Horst.Epp »

sigbod wrote:Tja wenn man englisch könnte, evtl. ansonsten hätts ich ja im englischen Forum geschrieben.
Tja wenn man Deutsch lesen könnte :D
Wie hatte doch ZoSTeR so schön geschrieben:
"Könnte das auch noch verdeutschen wenns nötig ist"
sigbod
Junior Member
Junior Member
Posts: 30
Joined: 2005-02-25, 14:42 UTC

Post by *sigbod »

Lesefehler meinerseits :oops: Habs so gelesen als ob er nicht wüsste was ich meine.

Wäre natürlich nett
User avatar
ZoSTeR
Power Member
Power Member
Posts: 1050
Joined: 2004-07-29, 11:00 UTC

Post by *ZoSTeR »

Hier nun die deutsche Version:

Anbei ein PowerShell Skript zur CRC Erzeugung.

Das Skript nimmt ausschließlich Ordnerpfade entgegen und überschreibt keine vorhandenen CRC-Dateien.

Auf einen Button legen mit
Kommando:

Code: Select all

powershell.exe
Parameter:

Code: Select all

-NoExit -ExecutionPolicy remotesigned -Command "&{&'C:\PfadZu\CreateChecksum.ps1' -listFile '%L'}"
Als "CreateChecksum.ps1" speichern und Pfad im Parameter anpassen.

Das Script hat drei optionale Parameter:
-sha1 aktiviert den SHA1 Algorithmus statt MD5.
-insidefolder bewirkt das Speichern der Checksummen-Datei im jeweiligen Ordner statt im Elternverzeichnis.
-donttouch stellt das Änderungsdatum des Ordners wieder her (nur mit -insidefolder).

Das Setzen der Optionen würde so aussehen:
Parameter:

Code: Select all

-NoExit -ExecutionPolicy remotesigned -Command "&{&'C:\PfadZu\CreateChecksum.ps1' -sha1 -insidefolder -donttouch -listFile '%L'}"
"CreateChecksum.ps1":

Code: Select all

# TC Button Parameter:
# powershell.exe
# -NoExit -ExecutionPolicy remotesigned -Command "&{&'C:\PfadZu\CreateChecksum.ps1' -sha1 -insidefolder -donttouch -listFile '%L'}"

Param(
    [Parameter(Mandatory=$True)]
    [ValidateNotNullOrEmpty()]
    [string]$listFile,
    [switch]$insidefolder,
    [switch]$sha1,
    [switch]$donttouch
)

if ($sha1)
{
    $algo = "SHA1"
    $extensionOutputFile = ".sha"
}
else
{
    $algo = "MD5"
    $extensionOutputFile = ".md5"
}

$contentListFile = Get-Content -Path $listFile

Write-Output ("Erzeuge $algo Checksumme für " + $contentListFile.Count.ToString() + " Ordner...")
$timeStart = Get-Date

foreach ($folder in $contentListFile)
{
    $folderItem = Get-Item -LiteralPath $folder
    $nameParentFolder = Split-Path -Path $folderItem -Parent
    $isFolder = Test-Path -LiteralPath $folderItem -PathType Container
   
    if ($isFolder)
    {
        if ($insidefolder)
        {
            $nameOutputFile = $folderItem.FullName + $folderItem.Name + $extensionOutputFile
            $outputFolder = Get-Item -LiteralPath $folderItem.FullName
            $lastWriteTimeOutputFolder = $outputFolder.LastWriteTime
        }
        else
        {
            $nameOutputFile = $nameParentFolder + '\' + $folderItem.Name + $extensionOutputFile
        }

        if (Test-Path -LiteralPath $nameOutputFile)
        {
            Write-Output ("`n" + $nameOutputFile + " existiert bereits. Wird übersprungen.")
        }
        else
        {
            $pathFolderItem = $folderItem.FullName.ToString().Replace('[','`[').Replace(']','`]')
            $colFiles = Get-ChildItem -Path $pathFolderItem -Recurse -File
            foreach ($file in $colFiles)
            {
                $hashFile = Get-FileHash -LiteralPath $file.FullName -Algorithm $algo
                $relativeName = $file.FullName.Remove(0, $folderItem.FullName.Length)
               
                if ($insidefolder)
                {
                    $finalString = $hashFile.Hash + ' *' + $relativeName
                }
                else
                {
                    $finalString = $hashFile.Hash + ' *' + $folderItem.Name + '\' + $relativeName
                }
               
                Out-File -LiteralPath $nameOutputFile -InputObject $finalString -Append
            }

            if ($donttouch -and $insidefolder)
            {
                $outputFolder.LastWriteTime = $lastWriteTimeOutputFolder
            }
        }
    }
}

$timeEnd = Get-Date
$timeSpan = New-TimeSpan -Start $timeStart -End $timeEnd
Write-Output ("`nFertig. Dauer: " + $timeSpan.ToString("hh\:mm\:ss\,fff"))
sigbod
Junior Member
Junior Member
Posts: 30
Joined: 2005-02-25, 14:42 UTC

Post by *sigbod »

Vielen Dank.
Post Reply