fc.exe
ist besser für das Vergleichen von Text, da es so konzipiert ist, dass es wie * nix diff funktioniert, dh Zeilen sequentiell vergleicht, die tatsächlichen Unterschiede anzeigt und versucht, neu zu synchronisieren (wenn die unterschiedlichen Abschnitte unterschiedliche Längen haben). Es verfügt auch über einige nützliche Steuerungsoptionen (Text / Binär, Groß- / Kleinschreibung, Zeilennummern, Resynchronisationslänge, Puffergröße für Nichtübereinstimmung) und bietet einen Beendigungsstatus (-1 ungültige Syntax, 0 gleiche Dateien, 1 unterschiedliche Dateien, 2 fehlende Dateien). Da es sich um ein (sehr) altes DOS-Dienstprogramm handelt, gibt es einige Einschränkungen. Insbesondere funktioniert es nicht automatisch mit Unicode. Das 0-MSB-Zeichen von ASCII-Zeichen wird als Zeilenabschluss behandelt, sodass die Datei zu einer Folge von 1-Zeichen-Zeilen wird (@kennycoc: Verwenden Sie die Option / U, um anzugeben, dass BEIDE Dateien Unicode und WinXP sind ) und es hat auch eine feste Zeilenpuffergröße von 128 Zeichen (128 Bytes ASCII,
compare-object wurde entwickelt, um festzustellen, ob zwei Objekte in Bezug auf die Mitglieder identisch sind. Handelt es sich bei den Objekten um Auflistungen, werden sie als SETS (siehe Hilfe Vergleichsobjekt) behandelt, dh als UNORDERED-Auflistungen ohne Duplikate. 2 Sätze sind gleich, wenn sie unabhängig von der Reihenfolge oder der Vervielfältigung die gleichen Elemente aufweisen. Dies schränkt seine Nützlichkeit zum Vergleichen von Textdateien auf Unterschiede stark ein. Erstens sammelt das Standardverhalten die Unterschiede, bis das gesamte Objekt (Datei = Array von Zeichenfolgen) überprüft wurde, wodurch die Informationen bezüglich der Position der Unterschiede verloren gehen und verdeckt wird, welche Unterschiede gepaart sind (und es gibt kein Konzept der Zeilennummer für ein SET von Streichern). Wenn Sie -synchwindow 0 verwenden, werden die Unterschiede ausgegeben, sobald sie auftreten. Wenn jedoch eine Datei eine zusätzliche Zeile enthält, können nachfolgende Zeilenvergleiche fehlschlagen, obwohl die Dateien ansonsten identisch sind (bis eine Kompensation vorliegt) zusätzliche Zeile in der anderen Datei, wodurch die übereinstimmenden Zeilen neu ausgerichtet werden). Powershell ist jedoch äußerst vielseitig und ein nützlicher Dateivergleich kann mithilfe dieser Funktionalität durchgeführt werden, allerdings auf Kosten einer erheblichen Komplexität und mit einigen Einschränkungen für den Inhalt der Dateien. Wenn Sie Textdateien mit langen (> 127 Zeichen) Zeilen vergleichen müssen und die Zeilen meistens mit 1 übereinstimmen:
diff (gc file1 | % -begin { $ln1=0 } -process { '{0,6}<<:{1}' -f ++$ln1,$_ }) (gc file2 | % -begin { $ln2=0 } -process { '{0,6}>>:{1}' -f ++$ln2,$_ }) -property { $_.substring(9) } -passthru | sort | out-string -width xx
Dabei ist xx die Länge der längsten Linie + 9
Erläuterung
(gc file | % -begin { $ln=0 } -process { '{0,6}<<:{1}' -f ++$ln,$_ })
Ruft den Inhalt der Datei ab und stellt jeder Zeile die Zeilennummer und die Dateianzeige (<< oder >>) voran (unter Verwendung des Format-String-Operators), bevor die Datei an diff übergeben wird.
-property { $_.substring(9) }
weist diff an, jedes Objektpaar (Strings) zu vergleichen, wobei die ersten 9 Zeichen (Zeilennummer und Dateianzeige) ignoriert werden. Dies nutzt die Möglichkeit, eine berechnete Eigenschaft (den Wert eines Skriptblocks) anstelle des Namens einer Eigenschaft anzugeben.
-passthru
veranlasst diff, die unterschiedlichen Eingabeobjekte (einschließlich Zeilennummer und Dateianzeige) anstelle der unterschiedlichen verglichenen Objekte (die dies nicht tun) auszugeben.
sort-object
Dann werden alle Zeilen wieder in die richtige Reihenfolge gebracht.
out-string stoppt das standardmäßige Abschneiden der Ausgabe, um sie an die Bildschirmbreite anzupassen (wie von Marc Towersap angegeben), indem eine Breite angegeben wird, die groß genug ist, um ein Abschneiden zu vermeiden. Normalerweise wird diese Ausgabe in eine Datei geschrieben, die dann mit einem Bildlauf-Editor (z. B. Editor) angezeigt wird.
Hinweis
Das Zeilennummernformat {0,6} gibt eine rechtsbündige, mit Leerzeichen aufgefüllte 6-stellige Zeilennummer (zum Sortieren) an. Wenn die Dateien mehr als 999.999 Zeilen haben, ändern Sie einfach das Format, um breiter zu werden. Dazu müssen Sie auch den $_.substring
Parameter (3 mehr als die Zeilennummernbreite) und den Wert xx für die Zeichenfolge ändern (maximale Zeilenlänge + $_.substring
Parameter).