Es kommt manchmal vor, dass man nur schnell zwei Verzeichnisse vergleichen möchte, ohne direkt einen Kopiervorgang oder ein extra Diff-Tool starten zu müssen. Das geht unter Windows ganz gut mit einem Einzeiler in Powershell.
Anwendungsfall
Man hat zum Beispiel eine neue PHP-Version heruntergeladen und ist sich nicht sicher, welche Dateien in der Standardinstallation ergänzt werden müssen. Oder man möchte vielleicht sehen, ob mit der neuen Version auch neue Dateien dazugekommen sind.
Vorgehensweise
- in das übergeordnete Verzeichnis wechseln (zum Beispiel C:\php\)
- man kann entweder Powershell starten und zum Ordner navigieren
- oder den Ordner im Explorer öffnen und dann mittels Alt + D das Dateimenü einblenden und Powershell auswählen
- mit
Compare-Object
die beiden Ordner vergleichenCompare-Object -ReferenceObject ObjektA -DifferenceObject ObjektB -CaseSensitive
- da viele Anwendungen Groß- und Kleinschreibung bei Dateien unterscheiden, wird noch
CaseSensitive
gesetzt - die Objekte werden durch
Get-ChildItem -Recurse -Path PFAD
ermittelt- durch die
Recurse
-Option werden auch Unterordner durchsucht
- durch die
- als Ergebnis wird eine Liste der Unterschiede gezeigt, wobei Pfeile anzeigen, in welchem Ordner die jeweilige Datei liegt
- => steht für OrdnerB, also das DifferenceObject
- <= steht für OrdnerA, also das ReferenceObject
- mit
IncludeEqual
werden auch Gemeinsamkeiten aufgelistet
Compare-Object -ReferenceObject (Get-ChildItem -Recurse -Path .\7.0.11\) -DifferenceObject (Get-ChildItem -Recurse -Path .\7.1.4\) -CaseSensitive # Resultat: InputObject SideIndicator ----------- ------------- nghttp2.dll => log <= php.ini <= phpinfo.txt <= zf2-profile.xml <= php_xdebug-2.5.3-7.0-vc14.dll <=

Weitere Möglichkeiten
Will man bei gleichnamigen Dateien auch die Dateiinhalte vergleichen, bietet es sich an Get-Content
in einer For-Schleife anzuwenden. Hier ein Beispiel mit zwei unterschiedlichen Textdateien:
# Zeilenumbruch, für zeilenweisen Vergleich $n = [System.Environment]::NewLine # Textdateien erzeugen New-Item -Name a.txt -Value "a$($n)b$($n)c" New-Item -Name b.txt -Value "a$($n)B$($n)c" # Vergleich mit CS Compare-Object -ReferenceObject (Get-Content .\a.txt) -DifferenceObject (Get-Content .\b.txt) -IncludeEqual -CaseSensitive #Resultat: InputObject SideIndicator ----------- ------------- B => b <= # Vergleich ohne CS Compare-Object -ReferenceObject (Get-Content .\a.txt) -DifferenceObject (Get-Content .\b.txt) -IncludeEqual #Resultat: InputObject SideIndicator ----------- ------------- a == b == c ==
Binäre Vergleiche, Streams und Datei-Hashvergleiche sind ebenfalls mit Powershell möglich. Auf diese wird hier jedoch nicht näher eingegangen.
Viel Spaß beim Ausprobieren.
Links
- Doku zu Compare-Object:
- https://msdn.microsoft.com/powershell/reference/4.0/microsoft.powershell.utility/Compare-Object
- Für die eigene PS-Version aufrufen per:
Get-Help Compare-Object -Online
- Doku zu Get-ChildItem:
- https://msdn.microsoft.com/powershell/reference/4.0/microsoft.powershell.management/Get-ChildItem
- Für die eigene PS-Version aufrufen per:
Get-Help Get-ChildItem -Online
- Doku zu New-Item:
- https://msdn.microsoft.com/powershell/reference/4.0/microsoft.powershell.management/New-Item
- Für die eigene PS-Version aufrufen per:
Get-Help New-Item -Online