none
Datei Eigenschaften aus zwei Dateien auslesen RRS feed

  • Frage

  • Liebe Forengemeinde,

    ich hoffe, ich trete hier niemanden auf die Füße, oder verstoße gg. irgend welche Regeln.

    Zu meinem Problem:

    Ich hab zwei lokale NAS Laufwerke, welche sich jede Nacht synchronisieren. Die Log Datei ist jedoch sehr "schwammig" xxx.Dateien wurden synchronisiert.... Tas ist Toll, aber wie gleich sind die beiden NAS????

    Meine Idee mittels PowerShell den HAUPT-Ordner, inclusive aller Unter-Ordner inclusive aller enthaltenen Dateien zu vergleichen, mit den BACKUP-Ordner, inclusive aller Unter-Ordner inclusive aller enthaltenen Dateien, hab ich hinbekommen, im Testversuch mit zwei "kleineren Ordnern" hat es wunderbar funktioniert. Jedoch haben die Ordner auf dem NAS mittlerweile ein Größe von 3TB , ca. 6100000 oder 6,1 Mio. Dateien... Das Wochenende ist zu kurz um dies zu vergleichen. -> verworfen!!!

    Neue Herangehensweise, (unter Windows) rechte Mouse Taste auf meinen HAUPT-Ordner, -> Eigenschaften... das gleiche mit dem BACKUP-Ordner. 20 min. warten.... = Ergebnis!!(also, ich vergleiche nur die Ordnergröße) In Bytes betrachtet. Wenn ich schnell genug klicke, läuft es parallel. Ich denke, mit dem Ergebnis muß ich leben.. andere Vorschläge? Gerne...

    Zu meinem PowerShell Skript, der genau dieses erledigen soll! Hab ich mir hier im Forum schon einiges zurecht "stibitzt" und zurecht gebastelt, es läuft auch.

    JETZT zum Problem, das Skript überprüft erst den HAUPT-Ordner, dann den BACKUP-Ordner, ..klar so ist es auch geschrieben.

    WER hat eine Idee, das das Skript beide Ordner Parallel überprüft!!! Das dauert so wie es ist ewig.....

    WER hat eine Idee, wie man das Skript beschleunigt, braucht ca. 5 Std., so lange braucht ja Win. nicht einmal...

    Irgendwo hab ich viele Fehler....

    Vielen Dank für Anregungen und Hilfen!

    mein Script….

    $Logfile = "C:\test\Log.txt"
    $DateNow = Get-Date -Format "dd.MM.yyyy HH:mm"
    
    $sumH = (Get-ChildItem -Path \\192,168,000,001\HAUPT_NAS\Freigabe\Ordner1 -Force -Recurse -ErrorAction SilentlyContinue | Measure-Object -Property Length -Sum).Sum 
    "`r`n$DateNow" + " -> ","LTS-1 Ordnergroesse NAS_HAUPT :   $sumH Bytes","-> oder: {0:n2} MiB" -f ($sumH/1MB) | Out-File $Logfile -append
    $sumB = (Get-ChildItem -Path \\192,168,000,002\NAS_BACKUP\Freigabe\Ordner1 -Force -Recurse -ErrorAction SilentlyContinue | Measure-Object -Property Length -Sum).Sum 
    $DateNow + " -> ","LTS-1 Ordnergroesse NAS_BACKUP:   $sumB Bytes","-> oder: {0:n2} MiB" -f ($sumB/1MB) | Out-File $Logfile -append  
    
    ###ab hier ist der email Versandt, der ist ok...
    #$body = Get-Content -Path C:\test\Log.txt | Out-String
    
    #$pw = Get-Content C:\AndereBaustelle\MailPW.txt | #ConvertTo-SecureString
    #$cred = New-Object #System.Management.Automation.PSCredential "meine@emailadre#sse.de", $pw
    #Send-MailMessage -From "quell@emailadresse.de" #-to 'ziel@emailadresse.de' -Subject "GroessenVergleich #NAS_HAUPT mit NAS_BACKUP" $Body #-SmtpServer 'smtp.provider.de' -Credential $cred -UseSSL #-Port 587 -Attachments "C:\test\Log.txt"
    

    Montag, 5. November 2018 21:32

Antworten

  • Hallo daswarder und erstmal willkommen im deutschen Powershell-Forum.

    Deine Aufgabenstellung ist vielschichtiger als man vielleicht im ersten Moment denken mag. Die schiere Größe Deines Dateibestandes ist eine Herausforderung und das 2 externe Resourcen beteiligt sind, die vermutlich auch noch Linux-basiert sind, macht es nicht besser.  ;-)

    Normalerweise lautet die Empfehlung, wenn es um Dateioperationen geht, die Powershell zu vermeiden. Über die Jahre ist zwar enorm an der Geschwindigkeit gearbeitet worden, aber cmdlets wie Get-ChildItem sind im Vergleich trotzdem immer das Langsamste. Du könntest z.B. versuchen das "Einsammeln" der Informationen über Dateien und Ordner an robocopy "auszulagern". Es gibt ethliche Beispiele im Netz, die zeigen, wie man das machen kann. Bei mir z.B. braucht Get-ChildItem ca 18 sec. um den Windows-Ordner mit Unterordnern zu beackern - robocopy braucht knapp 5.

    Natürlich kann man dieses Sammeln der Informationen auf 2 Jobs aufteilen, die parallel laufen. Das sollte die Laufzeit des Scripts gefühlt erstmal halbieren. Start-Job, Get-Job und Receive-Job wären also erstmal ein Anfang.

    Ein weiterer Ansatz könnte auch sein, Deine Daten in verschiedene Kategorien aufzuteilen und die getrennt zu betrachten. Meistens hat man ja bestimmte Ordner, wie z.B. Videos, Musik oder Bilder, bei denen sich nicht so häufig etwas ändert wie bei den Dokumenten.

    Ganz am Ende bist Du aber natürlich trotzdem immer von der Geschwindigleit Deiner NAS-Boxen abhängig. Je nach deren Betriebssystem gibt es ja vielleicht auch dort Schräubchen, an denen Du drehen könntest.

    Na denn erstmal viel Spaß!


    Live long and prosper!

    (79,108,97,102|%{[char]$_})-join''

    Dienstag, 6. November 2018 01:03

Alle Antworten

  • Hallo daswarder und erstmal willkommen im deutschen Powershell-Forum.

    Deine Aufgabenstellung ist vielschichtiger als man vielleicht im ersten Moment denken mag. Die schiere Größe Deines Dateibestandes ist eine Herausforderung und das 2 externe Resourcen beteiligt sind, die vermutlich auch noch Linux-basiert sind, macht es nicht besser.  ;-)

    Normalerweise lautet die Empfehlung, wenn es um Dateioperationen geht, die Powershell zu vermeiden. Über die Jahre ist zwar enorm an der Geschwindigkeit gearbeitet worden, aber cmdlets wie Get-ChildItem sind im Vergleich trotzdem immer das Langsamste. Du könntest z.B. versuchen das "Einsammeln" der Informationen über Dateien und Ordner an robocopy "auszulagern". Es gibt ethliche Beispiele im Netz, die zeigen, wie man das machen kann. Bei mir z.B. braucht Get-ChildItem ca 18 sec. um den Windows-Ordner mit Unterordnern zu beackern - robocopy braucht knapp 5.

    Natürlich kann man dieses Sammeln der Informationen auf 2 Jobs aufteilen, die parallel laufen. Das sollte die Laufzeit des Scripts gefühlt erstmal halbieren. Start-Job, Get-Job und Receive-Job wären also erstmal ein Anfang.

    Ein weiterer Ansatz könnte auch sein, Deine Daten in verschiedene Kategorien aufzuteilen und die getrennt zu betrachten. Meistens hat man ja bestimmte Ordner, wie z.B. Videos, Musik oder Bilder, bei denen sich nicht so häufig etwas ändert wie bei den Dokumenten.

    Ganz am Ende bist Du aber natürlich trotzdem immer von der Geschwindigleit Deiner NAS-Boxen abhängig. Je nach deren Betriebssystem gibt es ja vielleicht auch dort Schräubchen, an denen Du drehen könntest.

    Na denn erstmal viel Spaß!


    Live long and prosper!

    (79,108,97,102|%{[char]$_})-join''

    Dienstag, 6. November 2018 01:03
  • Moin, ich würde es auch per Robocopy machen, da gibt‘s die Möglichkeit, aufzulisten, was man sonst kopiert hätte. Alternativ wäre noch denkbar, von den beiden NASen die Dateilisten exportieren zu lassen und dann die so entstandenen Textdateien zu vergleichen. Last but not least, könnte man den Verzeichnisvergleich evtl. direkt auf einem der NASe fahren. Wenn man da per SSH rankommt.

    Evgenij Smirnov

    I work @ msg services ag, Berlin -> http://www.msg-services.de
    I blog (in German) @ http://it-pro-berlin.de
    my stuff in PSGallery --> https://www.powershellgallery.com/profiles/it-pro-berlin.de/
    Exchange User Group, Berlin -> https://exusg.de
    Windows Server User Group, Berlin -> http://www.winsvr-berlin.de
    Mark Minasi Technical Forum, reloaded -> http://newforum.minasi.com


    In theory, there is no difference between theory and practice. In practice, there is.

    Dienstag, 6. November 2018 06:10
  • Hallo Ihr zwei @BOfH_666 & Evgenij Smirnov,

    vielen Dank für Eure Antworten, bin leider immer recht lange in der Arbeit..

    @BOfH_666, Dein Ansatz, hat mir schon recht gut gefallen, warum bin ich nicht darauf gekommen.., das Skript zu "splitten".... ..starte per Aufgabenplanung um 23:00Uhr "Ordnergröße_NAS_HAUPT" .. schreibe LOG in C:\Log.txt und starte per Aufgabenplanung um 23:05Uhr "Ordnergröße_NAS_BACKUP" -append in C:\Log.txt plus den email Versandt Getöns... sehr Gute Idee....

    @Evgenij Smirnov, robocopy, nutze ich recht oft zum kopieren.. Klasse, keine Frage! Habe echt keine Ahnung was es sonst so kann, sicher keine e'mails versenden. Bin nun einmal bei der "Wunderwaffe" PowerShell am Wochenende gelandet.. kenne ich zwar schon seid Jahren, habe mich aber ernsthaft niemals damit beschäftigt! Eine Windows Konsole hat bisher immer geholfen.

    Um es noch einmal klar zu stellen, ich suche keine PowerShell "Funktionen" zum kopieren oder synchronisieren. Dieses kann das NAS, und ich erhalte eine email über diesen Sync-Job. So soll es auch bleiben! NUR das Log, von diesem Job, ist mir zu "schwammig" bzw. niemand weiß damit etwas anzufangen. Mein NAS bietet mir in der "Tiefe " sogar selbst an, die Eigenschaften meines "Haupt-Ordners" auszulesen.. selbst das NAS bricht mit einer Fehlermeldung nach ca. 15min ab...

    Warum kommt aber Windows selbst so Problemlos mit der Ermittlung der Dateieigenschaften klar, …dauert zwar 20min, für 2x ca 6,1Mio Dateien auf zwei verschiedenen NAS... aber das finde ich ok.. und PowerShell bekommt kein Ergebnis?!?!??! Wenn ich dieses Skript auf mein C:\Windows Verzeichnis anwende, (Win10 ca. 15GB) habe ich im sek. Bruchteil eine Log.txt, Auf meinem Laufwerk D:\ mit ca 450GB zu geballert nach ca. 30sek. eine Log.txt. … gehen in PowerShell keine URL Pfade?


    • Bearbeitet daswarder Dienstag, 6. November 2018 21:08 Schreibfehler
    Dienstag, 6. November 2018 21:06
  • Warum der Windows-Explorer die Gesamtgröße schneller ermitteln kann?

    Weil es dafür mehrere APIs gibt, und der Explorer benutzt halt eine andere als die, auf der die .Net-Klasse beruht, die PowerShell verwendet. Du kriegst ja vom Windows-Explorer auch NUR die Infos zur Anzahl und Größe. PowerShell fasst jede einzelne Datei an und ermittelt auch Zeitstempel usw.

    Dateien durch die Gegend schaufeln, ist halt nicht unbedingt der Fokus von PowerShell. Andererseits kann es durchaus sein, dass eine aktualisierte Version von PowerShell Core da deutlich performanter ist, denn da arbeitet ja eine ganze Community mit und verbessert ständig was...

    Und dass die Enumerierung über SMB deutlich langsamer geht als lokal, ist doch wohl kaum verwunderlich, oder? Ich vermute, Deine NASe können auch kein SMB3.


    Evgenij Smirnov

    I work @ msg services ag, Berlin -> http://www.msg-services.de
    I blog (in German) @ http://it-pro-berlin.de
    my stuff in PSGallery --> https://www.powershellgallery.com/profiles/it-pro-berlin.de/
    Exchange User Group, Berlin -> https://exusg.de
    Windows Server User Group, Berlin -> http://www.winsvr-berlin.de
    Mark Minasi Technical Forum, reloaded -> http://newforum.minasi.com


    In theory, there is no difference between theory and practice. In practice, there is.

    Dienstag, 6. November 2018 21:55