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-Key: 302475

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

Printed on: April 16, 2024 at 12:04 o'clock

Mitglied: 114757
114757 Apr 21, 2016 updated at 12:48:13 (UTC)
Goto Top
Findest du hier diverse Threads ...
Variablen oder Dateien nach Inhalt Vergleichen Powershell

Gruß jodel32
Member: zamsi7
zamsi7 Apr 21, 2016 at 13:44:34 (UTC)
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?
Mitglied: 114757
114757 Apr 21, 2016 at 13:46:35 (UTC)
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.
Member: zamsi7
zamsi7 Apr 22, 2016 at 07:30:58 (UTC)
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
Mitglied: 114757
114757 Apr 22, 2016 updated at 07:35:42 (UTC)
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.
Member: colinardo
colinardo Apr 22, 2016, updated at Apr 30, 2016 at 18:36:49 (UTC)
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
Member: zamsi7
zamsi7 May 02, 2016 at 09:27:36 (UTC)
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
Mitglied: 114757
114757 May 02, 2016 at 09:32:25 (UTC)
Goto Top
$diff | export-csv 'c:\datei.csv' -Delimiter ";" -NoType -Encoding UTF8 -Append  
Member: zamsi7
zamsi7 May 02, 2016 at 09:49:43 (UTC)
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?
Member: zamsi7
zamsi7 May 02, 2016 at 09:53:51 (UTC)
Goto Top
Damit ich halt weiß, in welcher Datei der Unterscheid vorkommt..
Member: colinardo
colinardo May 02, 2016 updated at 11:51:30 (UTC)
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
Member: zamsi7
zamsi7 May 02, 2016 at 14:56:28 (UTC)
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
Member: colinardo
colinardo May 02, 2016 at 15:05:08 (UTC)
Goto Top
Dann ist es aber keine gültige CSV-Datei mehr face-wink Aber wenn's dir so reicht ...
Member: colinardo
colinardo Jul 15, 2016 at 16:48:50 (UTC)
Goto Top
Wenns das dann war, den Beitrag bitte noch auf gelöst setzen. Merci.