zamsi7
Goto Top

Powershell Script um Inhalt von Dateien zu vergleichen

Hallo an alle,

hoffe ich bin hier richtig...

Ich würde ein Powershell script benötigen, welche mir hilft Dateien in einem Ordner zu vergleichen und mir die Unterschied in eine CSV zu schreiben.
Soweit habe ich das mit den Dateien bereits geschafft:


$o1 = Get-ChildItem -Recurse -Path c:\pstest\o1
$o2 = Get-ChildItem -Recurse -Path c:\pstest\o2

Compare-Object -ReferenceObject $o1 -DifferenceObject $o2 | Export-Csv -path "C:\pstest\differences_folder.csv"


Das funktionier soweit ganz gut. Es vergleicht die Dateien im Ordner und listet mir auf welche Dateien in welchem Ordner fehlen. Um die Formatierung hätte ich mich noch gekümmert face-smile

Es sollte aber auch möglich sein, dass mir das Script die Unterschiede in den Dateien auflistet. Also den Inhalt der Dateien vergleicht und mir angibt wo etwas verändert oder gelöscht wurde.

Ist dies mit PS möglich?
Wenn ja, wie?

Schon mal vielen Dank!! face-smile


LG Simon

Content-ID: 302475

Url: https://administrator.de/contentid/302475

Ausgedruckt am: 25.11.2024 um 03:11 Uhr

114757
114757 21.04.2016 aktualisiert um 14:48:13 Uhr
Goto Top
Findest du hier diverse Threads ...
Variablen oder Dateien nach Inhalt Vergleichen Powershell

Gruß jodel32
zamsi7
zamsi7 21.04.2016 um 15:44:34 Uhr
Goto Top
Erst mal viele Dank für deine rasche Antwort!!

Ich habe jetzt ein wenig durch diese Artikel durchgestöbert, doch leider wurde ich bez. dem vergleichen von Dateien nicht wirklich schlauer.
Zwar finde ich viel zum Thema bearbeiten und auslesen von Dateien aber nicht wie man diese so vergleichen kann wie ich dies benötige..

Hattest du unter diesen Artikeln einen speziellen gesehen, welche ich vielleicht übersehen habe?
114757
114757 21.04.2016 um 15:46:35 Uhr
Goto Top
Naja die Essenz ist doch mit get-content den Inhalt jeder Datei zu holen und mit dem Content der anderen Datei mit compare-object zu vergleichen.
zamsi7
zamsi7 22.04.2016 um 09:30:58 Uhr
Goto Top
Nur wie kann man dies bewerkstelligen ohne dabei jede Datei einzeln angeben zu müssen?
Also das Script sollte selbstständig die Ordner vergleichen und gleiche Dateinamen miteinander vergleichen.. ist dies so überhaupt möglich?

Es geht hier des öfteren um weit über 1000 Files...

Also quasi:
Ordner "Test1" -> Datei a.txt -> das Script sollte dann im 2. Ordner "Test2" schauen ob es die Datei a.txt hier auch gibt und dann diese Dateien vergleiche. Das selbe dann mit der Datei b.txt c.txt usw...

Danke für deine Hilfe und sorry dass ich hier so genau nachfrage aber ich konnte nicht wirklich etwas hilfreiches ergoooglen face-confused
114757
114757 22.04.2016 aktualisiert um 09:35:42 Uhr
Goto Top
Mit Get-Childitem die Dateien auflisten und mit foreach Schleife durchlaufen. Prüfen ob eine Datei in einem Ordner existiert machst du mit Test-Path. In der foreach Schleife dann den Inhalt beider Dateien mit compare-item vergleichen und Änderungen wegschreiben, fertig.
Damit hast du alle Werkzeuge die du brauchst.

Findest du hier in hunderten von Skripten im Forum.
colinardo
colinardo 22.04.2016, aktualisiert am 30.04.2016 um 20:36:49 Uhr
Goto Top
Hallo Simon,
Es sollte aber auch möglich sein, dass mir das Script die Unterschiede in den Dateien auflistet. Also den Inhalt der Dateien vergleicht und mir angibt wo etwas verändert oder gelöscht wurde.
das kannst du so machen:
$dir1 = 'c:\pstest\o1' # Verzeichnis 1  
$dir2 = 'c:\pstest\o2' # Verzeichnis 2  

# Nur die paarweise vorhandenen Dateinamen beider Verzeichnisse holen
compare (gci $dir1 -File).Name (gci $dir2 -File).Name -IncludeEqual -ExcludeDifferent -PassThru | %{
    # Inhalt der Dateien vergleichen
    $diff = compare (gc "$dir1\$_") (gc "$dir2\$_")  
    # Gibt es einen Unterschied , gebe ihn auf der Konsole aus
    if ($diff){
        write-host "Unterschiede in der Datei $_`n$('='*50)" -F Green  
        $diff | ft -AutoSize
    }
}
ab PS 3.0

Grüße Uwe
zamsi7
zamsi7 02.05.2016 um 11:27:36 Uhr
Goto Top
Hallo Uwe,

ich habe das nun ein wenig getestet und es funktioniert soweit wie erwünscht.
Vielen Dank für deine Hilfe!!!! Hast mir sehr geholfen face-smile

Ich häng nur gerade noch dabei dass dies nicht mittels write-host ausgegeben wird, sonder dass
für jedes "$diff" eine neue Zeile in eine CSV angehängt wird..
bekomme das noch nicht wirklich hin X)

Vl hättest ja hierzu auch noch einen Tipp?

Danke!!

LG Simon
114757
114757 02.05.2016 um 11:32:25 Uhr
Goto Top
$diff | export-csv 'c:\datei.csv' -Delimiter ";" -NoType -Encoding UTF8 -Append  
zamsi7
zamsi7 02.05.2016 um 11:49:43 Uhr
Goto Top
Das ging ja schnell face-smile vielen Dank dafür!!!
Funktioniert sehr gut!
Nur wie könnte ich nun noch zu jeder Zeile den Zusatz $_ (Also den Dateinamen) hängen?
zamsi7
zamsi7 02.05.2016 um 11:53:51 Uhr
Goto Top
Damit ich halt weiß, in welcher Datei der Unterscheid vorkommt..
colinardo
colinardo 02.05.2016 aktualisiert um 13:51:30 Uhr
Goto Top
Zitat von @zamsi7:
Nur wie könnte ich nun noch zu jeder Zeile den Zusatz $_ (Also den Dateinamen) hängen?

    if ($diff){
        [pscustomobject] @{'Dateiname'=$_;'Unterschied'=[regex]::replace(($diff | ft -AutoSize -HideTableHeaders | out-string),'(?ism)^\s*$','')} | export-csv 'C:\unterschiede.csv' -Delimiter ";" -NoType -Encoding UTF8 -Append  
    }
Der Regex löscht nur die vielen leeren Zeilen für die Ausgabe in einer Zelle.

Alternative ist folgende: Dann hast du aber mehrere Zeilen zu einer Datei und jeweils den Dateinamen dazu
    if ($diff){
        $diff | Add-Member -MemberType NoteProperty -Name 'Dateiname' -Value $_ -PassThru | export-csv 'C:\unterschiede.csv' -Delimiter ";" -NoType -Encoding UTF8 -Append  
    }

Grüße Uwe
zamsi7
zamsi7 02.05.2016 um 16:56:28 Uhr
Goto Top
Vielen Dank!
werde ich mal durchprobieren face-smile

Habe es dann derweil so gelöst:

Habe nach der Zeile noch die "Add-Content" Zeile hinzugefügt. Dann wird eben darunter noch der Dateiname geschrieben.

$diff | export-csv 'C:\differences_file.csv' -Delimiter ";" -NoType -Encoding UTF8 -Append
"Unterschiede in der Datei: $_`n$('='*100)" | Add-Content 'C:\differences_file.csv'


Aber nochmals vielen Dank an alle die mir hier geholfen haben!! face-smile
colinardo
colinardo 02.05.2016 um 17:05:08 Uhr
Goto Top
Dann ist es aber keine gültige CSV-Datei mehr face-wink Aber wenn's dir so reicht ...
colinardo
colinardo 15.07.2016 um 18:48:50 Uhr
Goto Top
Wenns das dann war, den Beitrag bitte noch auf gelöst setzen. Merci.