none
MD5 oder CRC32 prüfen mehrerer Dateien ausgeben in TXT RRS feed

  • Frage

  • Moin moin,

    ich bins mal wieder und darf kräftig nerven, ich bin mir jetzt schon ziemlich sicher, mehrere Fragen einstellen zu müssen für dasselbe Projekt.

    @OFF TOPIC
    Ich darf ja aus Datenschutzgründen nicht alles entsprechend Posten darum bitte ich um verständnis, wenn ich mich ab und zu etwas schwammig ausdrücke ich gebe mein Bestes die Probleme entsprechend darzustellen.

    Zum Projekt, es werden mit Powershell riesige Mengen Daten verschoben von A nach B nach C nach D und desöfteren mal abgeglichen (MD5). Schluss endlich gibt es auch eine Kopplung zwischen dem User und seiner ID auf verschiedenen Servern.

    Evtl. kommt auch noch das Thema Zip/Rar mit hinein und alles mündet in einem FTP für die "endauslieferung" der Daten an die Kunden.

    Nun aber mal zu meinem akuten Problem, der liegt schon am Anfang des Skriptes das entstehen soll:
    @Topic

    Ordner "Source" beinhaltet ~7000 Dateien und jede soll jetzt folgends abgearbeitet werden:

    Dateiname + MD5 in eine txt-Datei geschrieben werden (eine Zeile). Danach wird die Datei anhand des Namens in den Ordner "SourceSec" kopiert, sofern die MD5 vorhanden ist und anschließend die MD5(SourceSec) mit der txt-Datei abgeglichen. Abschließend wird die Datei in "Source" gelöscht!

    Codeschnippsel

    # SourceFolder
    $Source = "c:\MXPSKRIPT\Source"
    $SourceSec = ".\SourceSec\"
    $SourceMD5 = ".\SourceMD5\"
    $SourceUsr = ".\SourceUsr\"
    $SourcePkg = ".\SourcePkg\"
    $UsrFolder
    # Dateien (Listen)
    $List01
    $List02
    $List03
    $List04
    # Dateien (Fidibus)
    $UsrFolderDatei
    $UsrDatei = "$Source\hallo.txt"
    
    #function Get-MD5{
    #$md5 = new-object -TypeName System.Security.Cryptography.MD5CryptoServiceProvider
    #$hash = [System.BitConverter]::ToString($md5.ComputeHash([System.IO.File]::ReadAllBytes($Source\$_)))
    #}
    #$hash = [Security.Cryptography.HashAlgorithm]::Create( "MD5" )
    #$stream = ([IO.StreamReader]"$UsrDatei").BaseStream
    #-join ($hash.ComputeHash($stream) | ForEach { "{0:x2}" -f $_ })
    #$stream.Close()
    ##################Routine - MD5 erstellen von Source##################
    #Get-ChildItem $Source -Filter *.txt | Get-MD5
    function Get-FileMD5 {
    $hash = [Security.Cryptography.HashAlgorithm]::Create( "MD5" )
    $stream = ([IO.StreamReader]"$Source\$_").BaseStream -join ($hash.ComputeHash($stream) | ForEach { "{0:x2}" -f $_ })
    $stream.Close()
    }
    
    @Zusatz

    Im Grunde möchte ich alles nicht als txt-Datei speichern, aber ich muss alle Bewegungen und Hashes protokollieren, und auf einzelne Werte zurückgreifen können! Es muss stets nachvollzogen werden, wo welche Datei gerade lliegt und was schon mit ihr gemacht wurde.

    Nun, es sind viele Dateien, aber kleine ~16kb ist schon groß (größte Ausnahme war mal 2MB)... Da MD5 die Datei immer ganz einlesen muss hab ich gedacht man könnte auch einen CRC32 Check von Filesystem nehmen, da muss dann ja nur der Hash später zwischen den Servern getuascht und verglichen werden und nicht jedes mal der Traffic für die ganze Datei! (aber frag mal Google oder das technet -.-", gibts nichts mit Powershell das brauchbar wäre)...

    Für vorschläge den Traffic klein zuhalten bin ich immer gerne offen!

    Punkte zu meiner Umgebung: bisher sind keine Zusatz Module installiert. Sollten welche gebraucht werden muss ich mal mit meinem Chef reden, das entsprechend welche installiert werden müssen um die Umsetzbarkeit zugewährleisten. Ich selbst hab da sicherlich noch den Azubibonus den ich geltend machen kann. Ich bin hochmotiviert vieles alleine zuschaffen, bzw. Ergebnisse mit euch zu teilen, aber diesen Anfang bekomme ich gerde nicht auf die Reihe... vermutlich da ich mich nicht richtig Konzentrieren kann, diverse Krankmeldungen dessen Tickets ich nun auch noch bearbeite halten mich etwas auf.

    Darum bitte ich um Eure Unterstützung ;-)

    Dankööö
    Gruß Jannis

    Donnerstag, 12. September 2013 12:55

Antworten

Alle Antworten

  • Soweit ich weiß hält das Filesystem keine Checksummen vor. (Warum auch)
    Du musst eine Checksumme wohl immer selbst berechnen!

    Siehe:

    http://stackoverflow.com/questions/7812258/getting-a-file-checksum-directly-from-the-filesystem-instead-of-calculating-it-e

    Was meinst du denn mit Traffic?
    Die Checksumme auf würde ich mit PowerShell Remoting auf dem Rechner berechnen lassen, der die Datei vorhält. Und dann nur noch die Checksumme über das Kabel schicken. So werden keine Dateien übertragen.
    Der Rechner muss natürlich genug CPU Filesystem Langeweile haben! (am besten Nachts)

    PowerShell und .NET sind nicht die schnellsten wenn es um Checksummen Berechnung geht.

    http://stackoverflow.com/questions/1177607/what-is-the-fastest-way-to-create-a-checksum-for-large-files-in-c-sharp

    hier empfehle ich dir den "File Checksum Integrity Verifier" fciv.exe der kann die Ergebnisse in einer XML abspeichern und PowerShell liest die dann ein ;-)

    http://www.heise.de/ct/hotline/Kopierte-Dateien-ueberpruefen-326742.html

    Download gibst hier:

    http://support.microsoft.com/kb/841290

    und hier:

    http://www.microsoft.com/en-us/download/details.aspx?id=11533


    Please click “Mark as Answer” if my post answers your question and click “Vote As Helpful” if my Post helps you.
    Bitte markiere hilfreiche Beiträge von mir als “Als Hilfreich bewerten” und Beiträge die deine Frage ganz oder teilweise beantwortet haben als “Als Antwort markieren”.
    My PowerShell Blog http://www.admin-source.info
    [string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' '
    German ? Come to German PowerShell Forum!

    • Bearbeitet Peter Kriegel Montag, 16. September 2013 08:42 typos
    • Als Antwort markiert Jannis K Montag, 16. September 2013 10:00
    Donnerstag, 12. September 2013 14:42
  • Cool mit dem Anstoß kann ich etwas anfangen, ich melde mich dann nächste Woche ob und wie es klappt.
    Apropos: schönes Wochenende!

    Gruß
    Jannis

    [EDIT]Moin moin,

    dieser Anstoß hat mir sehr geholfen und hab die Suche sogar noch verfeinern können:
    http://gallery.technet.microsoft.com/PowerShell-File-Checksum-e57dcd67
    beinhaltet de FCIV Version für Powershell und ich hab schon riesige Fortschritte gemacht:

    ######################Routine - Check MD5######################
    ###############################################################
    
    #fciv.exe -add $Source -xml $List01
    function Start-PsFCIV { (...)
    
    start-PSFCIV $Source -xml $List01 -HashAlgorithm md5 -Rebuild -NoStatistic -Recurse
    [xml]$MD5Check = Get-Content $List01
    foreach($FILE_ENTRY in $MD5Check.FCIV.FILE_ENTRY)
    {
    	Write-Host $FILE_ENTRY.name
    	Write-Host $FILE_ENTRY.MD5
    }
    Dankööö

    • Bearbeitet Jannis K Montag, 16. September 2013 10:00 Antwort markiert
    Freitag, 13. September 2013 08:26