Powershell: Trick gesucht zur Beschleunigung eines Dateivergleichs
Hallo Community,
ich habe folgendes Skript, um gleichnamige Dateien in zwei unterschiedlichen Verzeichnissen zu vergleichen. Herzstück ist cmdlet Compare-Object. Funktioniert an sich (Gutfall und Schlechtfall), nur dauert es bei entsprechend großen Dateien eine (ganze) Weile, bis die Abarbeitung zu Ende ist. Leider gibt es bei Compare-Object kein -AsJob, um die Abarbeitung in den Hintergrund zu schieben und um somit gleich ohne nennenswerte Verzögerung mit einer möglichen Nachfolge Powershell-Skriptsequenz parallel zur Hintergrundverarbeitung weiterzumachen. Mit Receive-Job ließe sich ja das Ergebnis auswerten.
Gibt es trotzdem einen Trick, um das zu bewerkstelligen oder gehört mein Code komplett anders aufgebaut?
Viele Grüsse, Roger
ich habe folgendes Skript, um gleichnamige Dateien in zwei unterschiedlichen Verzeichnissen zu vergleichen. Herzstück ist cmdlet Compare-Object. Funktioniert an sich (Gutfall und Schlechtfall), nur dauert es bei entsprechend großen Dateien eine (ganze) Weile, bis die Abarbeitung zu Ende ist. Leider gibt es bei Compare-Object kein -AsJob, um die Abarbeitung in den Hintergrund zu schieben und um somit gleich ohne nennenswerte Verzögerung mit einer möglichen Nachfolge Powershell-Skriptsequenz parallel zur Hintergrundverarbeitung weiterzumachen. Mit Receive-Job ließe sich ja das Ergebnis auswerten.
Gibt es trotzdem einen Trick, um das zu bewerkstelligen oder gehört mein Code komplett anders aufgebaut?
Viele Grüsse, Roger
[bool]$FinishLoop = $false
$dir1 = "C:\test" # Verzeichnis 1
$dir2 = "D:\test" # Verzeichnis 2
clear-host
Compare-Object (Get-ChildItem $dir1 -File).Name (Get-ChildItem $dir2 -File).Name -IncludeEqual -ExcludeDifferent -PassThru | ForEach-Object{
# Inhalt der Dateien vergleichen
$diff = Compare-Object (Get-Content "$dir1\$_") (Get-Content "$dir2\$_")
# Gibt es einen Unterschied , ForEach-Object-Schleife abbrechen
if ($diff -and !$FinishLoop)
{
$FinishLoop = $true
}
}
if($FinishLoop -eq $true)
{
write-host "Unterschiede in den Dateien" -F Red
}
else
{
write-host "keine Unterschiede in den Dateien" -F Green
}
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 562682
Url: https://administrator.de/forum/powershell-trick-gesucht-zur-beschleunigung-eines-dateivergleichs-562682.html
Ausgedruckt am: 22.12.2024 um 13:12 Uhr
9 Kommentare
Neuester Kommentar
Hi
also grundsätzlich würde ich hier vielleicht eher mit Checksummen arbeiten, also mit Get-FileHash . Kommt drauf an ob du die Unterschiede dann aufgelistet haben willst oder nicht. Wenn es dir nur darum geht rauszufinden ob die Dateien gleich sind oder nicht, dann macht eine Checksum wohl mehr sinn.
Ansonsten kannst du natürlich aber alles per Start-Job in Jobs schmeissen. einfach in einer Schleife alle Files im Ordner durchgehen und z.B immer 5 Dateien auf ein mal vergleichen
also grundsätzlich würde ich hier vielleicht eher mit Checksummen arbeiten, also mit Get-FileHash . Kommt drauf an ob du die Unterschiede dann aufgelistet haben willst oder nicht. Wenn es dir nur darum geht rauszufinden ob die Dateien gleich sind oder nicht, dann macht eine Checksum wohl mehr sinn.
Ansonsten kannst du natürlich aber alles per Start-Job in Jobs schmeissen. einfach in einer Schleife alle Files im Ordner durchgehen und z.B immer 5 Dateien auf ein mal vergleichen
Hallo,
Gruß,
Peter
Zitat von @Herbstengel:
Gibt es trotzdem einen Trick, um das zu bewerkstelligen oder gehört mein Code komplett anders aufgebaut?
Ja, Leistungsfähigere Hardware verwenden die das in deiner gewünschten Sekunde kann. Oder deine Daten soweit runterbrechen das die nicht so lange berechnet werden müssen.Gibt es trotzdem einen Trick, um das zu bewerkstelligen oder gehört mein Code komplett anders aufgebaut?
Gruß,
Peter
Moin,
Entweder das - oder halt die Dateigröße vergleichen. Die Chance, das 2 Dateien mit selbem Namen aufs Byte genau gleich groß sind und dennoch einen unterschiedlichen Inhalt aufweisen ist eben auch nur sehr sehr gering.
Gruß Thomas
Entweder das - oder halt die Dateigröße vergleichen. Die Chance, das 2 Dateien mit selbem Namen aufs Byte genau gleich groß sind und dennoch einen unterschiedlichen Inhalt aufweisen ist eben auch nur sehr sehr gering.
Gruß Thomas
Moin,
das sind zwei aufbauende Themen.
Ich will extra nicht Probleme schreiben.
1. Warten.
Wenn Du nicht warten willst, verwende Multithreading
Wenn Deine Umgebung kein Multithreading kann verwende eine Andere.
Bringt Dir vermutlich aber nichts weil Du nicht 1000 100GB-Dateien gleichzeitig lesen kannst weil die Hardware das nicht mitmacht.
Also warten bis er fertig ist oder und 2. schauen.
2. Vergleichen
Zuerst Dateigröße, Änderungsdatum und Attribute vergleichen.
Wenn hier was abweicht brauchst Du den Rest nicht testen.
Dann Prüfsumme des ersten und letzten MBs erstellen und vergleichen.
Wenn hier was abweicht brauchst Du den Rest nicht testen.
Jetzt die Knuffifrage ob Du in diesem Fall auch die ganze Datei vergleichst oder nicht.
Musst Du entscheiden.
Stefan
das sind zwei aufbauende Themen.
Ich will extra nicht Probleme schreiben.
1. Warten.
Wenn Du nicht warten willst, verwende Multithreading
Wenn Deine Umgebung kein Multithreading kann verwende eine Andere.
Bringt Dir vermutlich aber nichts weil Du nicht 1000 100GB-Dateien gleichzeitig lesen kannst weil die Hardware das nicht mitmacht.
Also warten bis er fertig ist oder und 2. schauen.
2. Vergleichen
Zuerst Dateigröße, Änderungsdatum und Attribute vergleichen.
Wenn hier was abweicht brauchst Du den Rest nicht testen.
Dann Prüfsumme des ersten und letzten MBs erstellen und vergleichen.
Wenn hier was abweicht brauchst Du den Rest nicht testen.
Jetzt die Knuffifrage ob Du in diesem Fall auch die ganze Datei vergleichst oder nicht.
Musst Du entscheiden.
Stefan
Hallo,
Der wird sich nicht ändern da du den nicht änderst, nur abfragst.
Gruß,
Peter
Der wird sich nicht ändern da du den nicht änderst, nur abfragst.
Gruß,
Peter
Hallo,
Dann wird diser Code nie erreicht...Deine IF ist **korrekt?
Gruß,
Peter
Dann wird diser Code nie erreicht...Deine IF ist **korrekt?
Gruß,
Peter