fc.exe
jest lepszy do porównywania tekstu, ponieważ zaprojektowano go do działania jak * nix diff, tzn. porównuje linie sekwencyjnie, pokazując rzeczywiste różnice i próbując ponownie zsynchronizować (jeśli różne sekcje mają różne długości). Ma także kilka przydatnych opcji sterowania (tekst / binarny, rozróżnianie wielkości liter, numery linii, długość resynchronizacji, rozmiar bufora niedopasowania) i zapewnia status wyjścia (-1 zła składnia, 0 takich samych plików, 1 pliki różnią się, brak 2 plików). Jako (bardzo) stare narzędzie DOS ma kilka ograniczeń. Co najważniejsze, nie działa on automatycznie z Unicode, traktując 0 MSB znaków ASCII jako terminator linii, więc plik staje się sekwencją 1 linii znaków (@kennycoc: użyj opcji / U, aby określić, że OBIE pliki są Unicode, a WinXP i nowsze ), a także ma sztywny bufor o rozmiarze 128 znaków (128 bajtów ASCII,
Obiekt porównywania służy do ustalenia, czy 2 obiekty są identyczne pod względem członków. jeśli obiekty są kolekcjami, to są one traktowane jako ZESTAWY (patrz pomoc porównania-obiekt), tj. kolekcje NIEZGODNE bez duplikatów. 2 zestawy są równe, jeśli mają takie same elementy członkowskie, niezależnie od kolejności lub duplikatów. To poważnie ogranicza jego przydatność do porównywania plików tekstowych pod kątem różnic. Po pierwsze, domyślne zachowanie zbiera różnice, dopóki cały obiekt (plik = tablica ciągów) nie zostanie sprawdzony, tracąc w ten sposób informacje dotyczące położenia różnic i zaciemniając, które różnice są sparowane (i nie ma pojęcia numeru linii dla SET ciągów). Użycie opcji -synchwindow 0 spowoduje, że różnice zostaną wyemitowane w momencie ich wystąpienia, ale powstrzyma ją od ponownej synchronizacji, więc jeśli jeden plik ma dodatkową linię, kolejne porównania linii mogą się nie powieść, nawet jeśli pliki są identyczne (dopóki nie pojawi się kompensacja dodatkowa linia w drugim pliku, wyrównując w ten sposób pasujące linie). Jednak PowerShell jest niezwykle wszechstronny, a przydatne porównanie plików można wykonać, korzystając z tej funkcji, aczkolwiek kosztem znacznej złożoności i pewnych ograniczeń dotyczących zawartości plików. Jeśli chcesz porównać pliki tekstowe z długimi (> 127 znaków) liniami i których linie w większości pasują do 1:
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
gdzie xx jest długością najdłuższej linii + 9
Wyjaśnienie
(gc file | % -begin { $ln=0 } -process { '{0,6}<<:{1}' -f ++$ln,$_ })
pobiera zawartość pliku i wstawia numer linii i wskaźnik pliku (<< lub >>) do każdej linii (używając operatora ciągu formatu) przed przekazaniem jej do pliku diff.
-property { $_.substring(9) }
każe diffowi porównać każdą parę obiektów (ciągów znaków) ignorując pierwsze 9 znaków (które są numerem linii i wskaźnikiem pliku). Wykorzystuje to możliwość określenia obliczonej właściwości (wartości bloku skryptu) zamiast nazwy właściwości.
-passthru
powoduje, że diff wypisuje różne obiekty wejściowe (które obejmują numer linii i wskaźnik pliku) zamiast różnych porównywanych obiektów (które nie).
sort-object
następnie ustawia wszystkie linie z powrotem w sekwencji.
out-string zatrzymuje domyślne obcięcie wyjścia w celu dopasowania do szerokości ekranu (jak zauważył Marc Towersap) przez określenie szerokości wystarczająco dużej, aby uniknąć obcięcia. Zwykle dane wyjściowe byłyby umieszczane w pliku, który jest następnie przeglądany za pomocą przewijanego edytora (np. Notatnika).
Uwaga
Format numeru linii {0,6} daje wyrównany do prawej 6-znakowy numer wiersza (do sortowania). Jeśli pliki mają więcej niż 999,999 wierszy, po prostu zmień format na szerszy. Wymaga to również zmiany $_.substring
parametru (3 więcej niż szerokość numeru linii) i wartości x-out-string (maksymalna długość linii + $_.substring
parametr).