fc.exe
tốt hơn cho việc so sánh văn bản vì nó được thiết kế để hoạt động như * nix diff, tức là so sánh các dòng một cách tuần tự, cho thấy sự khác biệt thực tế và cố gắng đồng bộ hóa lại (nếu các phần khác nhau có độ dài khác nhau). Nó cũng có một số tùy chọn điều khiển hữu ích (văn bản / nhị phân, độ nhạy trường hợp, số dòng, độ dài đồng bộ hóa, kích thước bộ đệm không khớp) và cung cấp trạng thái thoát (-1 cú pháp xấu, 0 tệp giống nhau, 1 tệp khác nhau, thiếu 2 tệp). Là một tiện ích DOS (rất) cũ, nó có một vài hạn chế. Đáng chú ý nhất là nó không tự động hoạt động với Unicode, coi 0 MSB của các ký tự ASCII là dấu kết thúc dòng để tệp trở thành một chuỗi gồm 1 dòng ký tự (@kennycoc: sử dụng tùy chọn / U để chỉ định các tệp BOTH là Unicode, WinXP trở đi ) và nó cũng có kích thước bộ đệm dòng cứng là 128 ký tự (128 byte ASCII,
đối tượng so sánh được thiết kế để xác định xem 2 đối tượng có giống thành viên không. nếu các đối tượng là các bộ sưu tập thì chúng được coi là SETS (xem đối tượng trợ giúp so sánh), tức là các bộ sưu tập UNORDERED không có bản sao. 2 bộ bằng nhau nếu chúng có cùng các mục thành viên không phân biệt thứ tự hoặc trùng lặp. Điều này hạn chế nghiêm trọng tính hữu ích của nó để so sánh các tệp văn bản cho sự khác biệt. Đầu tiên, hành vi mặc định thu thập các khác biệt cho đến khi toàn bộ đối tượng (tệp = mảng chuỗi) đã được kiểm tra, do đó làm mất thông tin liên quan đến vị trí của các khác biệt và che khuất sự khác biệt nào được ghép nối (và không có khái niệm về số dòng cho SET của chuỗi). Việc sử dụng -synchwindow 0 sẽ khiến các khác biệt được phát ra khi chúng xảy ra nhưng ngăn không cho nó cố gắng đồng bộ hóa lại, vì vậy nếu một tệp có thêm một dòng thì việc so sánh dòng tiếp theo có thể thất bại ngay cả khi các tệp giống hệt nhau (cho đến khi có bù trừ dòng bổ sung trong tập tin khác do đó sắp xếp lại các dòng phù hợp). Tuy nhiên, powershell cực kỳ linh hoạt và việc so sánh tệp hữu ích có thể được thực hiện bằng cách sử dụng chức năng này, mặc dù phải trả giá bằng sự phức tạp đáng kể và với một số hạn chế về nội dung của các tệp. Nếu bạn cần so sánh các tệp văn bản với các dòng dài (> 127 ký tự) và trong đó các dòng chủ yếu khớp với 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
Trong đó xx là độ dài của dòng dài nhất + 9
Giải trình
(gc file | % -begin { $ln=0 } -process { '{0,6}<<:{1}' -f ++$ln,$_ })
lấy nội dung của tệp và thêm số dòng và chỉ báo tệp (<< hoặc >>) cho mỗi dòng (sử dụng toán tử chuỗi định dạng) trước khi chuyển nó sang diff.
-property { $_.substring(9) }
báo cho diff để so sánh từng cặp đối tượng (chuỗi) bỏ qua 9 ký tự đầu tiên (là số dòng và chỉ báo tệp). Điều này sử dụng khả năng chỉ định một thuộc tính được tính toán (giá trị của khối tập lệnh) thay vì tên của một thuộc tính.
-passthru
gây ra khác biệt cho đầu ra các đối tượng đầu vào khác nhau (bao gồm số dòng và chỉ báo tệp) thay vì các đối tượng so sánh khác nhau (không có).
sort-object
sau đó đặt tất cả các dòng trở lại thành chuỗi.
out-string dừng việc cắt ngắn mặc định của đầu ra để vừa với chiều rộng màn hình (như được lưu ý bởi Marc Towersap) bằng cách chỉ định chiều rộng đủ lớn để tránh cắt ngắn. Thông thường, đầu ra này sẽ được đưa vào một tệp mà sau đó được xem bằng trình chỉnh sửa cuộn (ví dụ: notepad).
Ghi chú
Định dạng số dòng {0,6} cung cấp một số dòng ký tự 6 ký tự được đệm hợp lý, đúng chỗ (để sắp xếp). Nếu các tệp có hơn 999.999 dòng thì chỉ cần thay đổi định dạng để rộng hơn. Điều này cũng yêu cầu thay đổi $_.substring
tham số (nhiều hơn 3 chiều rộng số dòng) và giá trị xx ngoài chuỗi (độ dài dòng tối đa + $_.substring
tham số).