Powershell-Banner

Powershell: Zwei Verzeichnisse schnell miteinander vergleichen

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

Powershell in Explorer öffnen
Powershell direkt aus dem Explorer aufrufen
  • 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 vergleichen
    • Compare-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
  • 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 <= 
Screenshot von Vergleich in Powershell
Und so sieht das Ganze in der Konsole aus

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

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.