Frage Wie kann ich zwei Textdateien in Windows PowerShell vergleichen?


Ich habe zwei Textdateien und möchte mit Windows PowerShell die Unterschiede zwischen ihnen finden. Gibt es etwas Ähnliches wie das Unix-Diff-Tool? Oder gibt es noch einen anderen Weg, an den ich nicht gedacht habe?

Ich habe compare-object ausprobiert, bekomme aber diese kryptische Ausgabe:

PS C:\> compare-object one.txt two.txt

InputObject                                                 SideIndicator
-----------                                                 -------------
two.txt                                                     =>
one.txt                                                     <=

74
2018-05-07 03:37


Ursprung




Antworten:


Ich habe es selbst herausgefunden. Da Powershell mit .net-Objekten und nicht mit Text arbeitet, müssen Sie get-content verwenden, um den Inhalt der Textdateien verfügbar zu machen. Um das zu tun, was ich in der Frage versucht habe, benutze:

compare-object (get-content one.txt) (get-content two.txt)

80
2018-05-07 03:51



Ich war sehr überrascht, als ich versuchte, zwei Dateien zu vergleichen: ein unsortiertes Zahlenfeld und dasselbe Zahlenfeld nach dem Sortieren. Es gibt keine Ausgabe, obwohl die Dateien sehr unterschiedlich sind. Anscheinend vergleicht compare-object nicht die Reihenfolge. - cgmb
@cgmb - Sie können verwenden -SyncWindow 0 das zu beheben, glaube ich, obwohl ich nicht sicher bin, ob es erst kürzlich eingeführt wurde. Es ist jedoch nicht besonders schlau. - James Ruskin


Oder Sie könnten das DOS benutzen fc Befehl wie folgt (Dies zeigt die Ausgabe beider Dateien an, so dass Sie nach den Unterschieden suchen müssen):

fc.exe filea.txt fileb.txt > diff.txt

fc ist ein Alias ​​für das Cmdlet "Format-Custom". Stellen Sie also sicher, dass Sie den Befehl als eingeben fc.exe. Beachten Sie, dass viele DOS-Dienstprogramme nicht UTF-8-Codierung verarbeiten.

Sie können auch einen CMD-Prozess generieren und ausführen fc darin.

start cmd "/c  ""fc filea.txt fileb.txt >diff.txt"""

Dies weist PowerShell an, einen Prozess mit dem Programm "cmd" unter Verwendung der Parameter in Anführungszeichen zu starten. In den Anführungszeichen steht die Option '/ c' cmd, um den Befehl auszuführen und zu beenden. Der eigentliche Befehl, der von cmd ausgeführt wird, ist fc filea.txt fileb.txt Umleiten der Ausgabe in die Datei diff.txt.

Sie können das DOS verwenden fc.exe aus der Powershell.


27
2018-05-29 17:52



+1 für das DOS ^ _ ^ - Jeff Bridgman
"fc" funktionierte nicht für mich, und ich wusste nicht, dass ich es als "fc.exe" angeben musste, um es von Format-Custom zu unterscheiden. Genau das, was ich gesucht habe. Vielen Dank. - Xonatron
Vielleicht bin ich ein vollkommener Philister, aber das scheint mir viel nützlicher zu sein. Es hat mein Problem sehr gut gelöst. - AJ.


Ein einfacherer Weg ist es zu schreiben:

diff (cat file1) (cat file2)

23
2017-12-12 19:15



Diff und cat sind nur Aliase für Compare-Object und Get-Content in PowerShell. Es ist das selbe Ding. - Shawn Melton
Obwohl dies die gleiche Antwort ist, verwende ich diese Syntax mehr - Elijah W. Gagne


diff on * nix ist kein Teil der Shell, sondern eine separate Anwendung.

Gibt es einen Grund, warum du diff.exe nicht einfach unter PowerShell verwenden kannst?

Sie können eine Version aus dem UnxUtils-Paket herunterladen (http://unxutils.sourceforge.net/)


7
2018-05-07 03:56



Da PowerShell jetzt enthalten ist, kann nichts heruntergeladen und installiert werden. - Bratch
Ich habe es gerade benutzt git diff, weil ich es bereits installiert hatte. Weder fc.exe Noch Compare-Object produzierte die Ausgabe, die ich erwartete. - Raziel


compare-object (alias diff alias) ist erbärmlich, wenn Sie erwarten, dass es sich wie ein Unix-Diff verhält. Ich habe versucht, das diff (gc file1) (gc file2), und wenn eine Zeile zu lang ist, kann ich nicht sehen, die tatsächliche diff und noch wichtiger, kann ich nicht sagen, welche Zeile Nummer der diff ist.

Wenn ich versuche, -passthru hinzuzufügen, kann ich jetzt den Unterschied sehen, aber ich verliere, in welcher Datei der Unterschied liegt, und ich bekomme immer noch keine Zeilennummer.

Mein Ratschlag: Verwenden Sie Powershell nicht, um Unterschiede in Dateien zu finden. Wie jemand anders bemerkt, arbeitet fc, und arbeitet ein wenig besser als compare-object, und noch besser ist das Herunterladen und Verwenden echter Werkzeuge wie der Unix-Emulator, den Mikeage erwähnte.


3
2018-02-18 18:19





WinMerge ist ein anderes gutes GUI-basiertes Diff-Tool.


2
2018-05-07 04:58



So habe ich es in der Vergangenheit gemacht, was ein manueller Prozess ist, den ich durch ein kleines Skript ersetzen wollte. - Bratch


Wie andere bemerkt haben, wenn Sie eine Unix-y-Diff-Ausgabe erwarteten, würde die Verwendung des Powershell-Diff-Alias ​​Sie stark im Stich lassen. Zum einen müssen Sie die Dateien tatsächlich lesen (mit gc / get-content). Zum anderen ist der Differenzindikator rechts, weit entfernt vom Inhalt - es ist ein Albtraum der Lesbarkeit.

Die Lösung für alle, die einen vernünftigen Output suchen, ist

  1. bekomme ein echtes diff (zB von GnuWin32)
  2. Bearbeiten Sie% USERPROFILE% \ Dokumente \ WindowsPowerShell \ Microsoft.PowerShell_profile.ps1
  3. Füge die Zeile hinzu

    remove-item alias:diff -force
    

Das Argument -force ist erforderlich, da Powershell für diesen speziellen integrierten Alias ​​sehr wertvoll ist. Wenn jemand daran interessiert ist, GnuWin32 installiert zu haben, füge ich auch folgendes in mein Powershell-Profil ein:

remove-item alias:rm
remove-item alias:mv
remove-item alias:cp

Hauptsächlich, weil Powershell keine Argumente versteht, die zusammen ausgeführt werden, und das Schreiben von "rm -Force -Recurse" ist viel mehr Aufwand als "rm -rf".

Powershell hat einige nette Eigenschaften, aber es gibt einige Dinge, die es einfach nicht für mich tun sollte.


2
2018-01-28 12:54





Es gibt auch Windiff die eine GUI-Diff-Schnittstelle bietet (ideal für GUI-basierte CVS / SVN-Programme)


1
2018-05-07 04:17