fc.exe
จะดีกว่าสำหรับการเปรียบเทียบข้อความเนื่องจากมันออกแบบมาเพื่อทำงานเช่น * nix diff คือเปรียบเทียบบรรทัดตามลำดับแสดงความแตกต่างที่เกิดขึ้นจริงและพยายามซิงโครไนซ์อีกครั้ง (หากส่วนต่างกันมีความยาวต่างกัน) นอกจากนี้ยังมีตัวเลือกการควบคุมที่มีประโยชน์ (ข้อความ / ไบนารีความไวตัวพิมพ์เล็กหมายเลขบรรทัดความยาวการซิงโครไนซ์ขนาดบัฟเฟอร์ไม่ตรงกัน) และให้สถานะการออก (ไวยากรณ์ที่ไม่ดี -1, 0 ไฟล์เดียวกัน 1 ไฟล์แตกต่างกัน เนื่องจากเป็นยูทิลิตี้ DOS เก่า (มาก) จึงมีข้อ จำกัด เล็กน้อย โดยเฉพาะอย่างยิ่งมันไม่ทำงานกับ Unicode โดยอัตโนมัติรักษา 0 MSB ของอักขระ ASCII เป็นตัวยุติบรรทัดดังนั้นไฟล์จะกลายเป็นลำดับของอักขระ 1 บรรทัด (@kennycoc: ใช้ตัวเลือก / U เพื่อระบุไฟล์ทั้งสองเป็น Unicode, WinXP เป็นต้นไป ) และมันก็มีขนาดบัฟเฟอร์ฮาร์ดไลน์ที่ 128 อักขระ (128 ไบต์ ASCII,
Compare-object ได้รับการออกแบบมาเพื่อตรวจสอบว่า 2 วัตถุเป็นสมาชิกที่ฉลาดเหมือนกัน ถ้าวัตถุนั้นเป็นคอลเลกชันก็จะถือว่าเป็นชุด (ดู help help-object) เช่นคอลเลกชัน UNORDERED โดยไม่ซ้ำกัน 2 ชุดมีค่าเท่ากันหากมีรายการสมาชิกเดียวกันโดยไม่คำนึงถึงลำดับหรือการทำซ้ำ ข้อ จำกัด นี้มีประโยชน์อย่างมากสำหรับการเปรียบเทียบไฟล์ข้อความสำหรับความแตกต่าง ประการแรกพฤติกรรมเริ่มต้นจะรวบรวมความแตกต่างจนกระทั่งวัตถุทั้งหมด (ไฟล์ = อาร์เรย์ของสตริง) ได้รับการตรวจสอบจึงสูญเสียข้อมูลเกี่ยวกับตำแหน่งของความแตกต่างและปิดบังความแตกต่างที่ถูกจับคู่ (และไม่มีแนวคิดของหมายเลขบรรทัดสำหรับตลาดหลักทรัพย์ ของสตริง) การใช้ -synchwindow 0 จะทำให้เกิดความแตกต่างในขณะที่เกิดขึ้น แต่พยายามหยุดการซิงโครไนซ์อีกครั้งดังนั้นหากไฟล์หนึ่งมีบรรทัดพิเศษการเปรียบเทียบบรรทัดถัดไปอาจล้มเหลวแม้ว่าไฟล์นั้นจะเหมือนกัน (จนกว่าจะมีการชดเชย บรรทัดพิเศษในไฟล์อื่นจึงจัดแนวบรรทัดที่ตรงกัน) อย่างไรก็ตาม PowerShell นั้นมีความหลากหลายอย่างมากและการเปรียบเทียบไฟล์ที่มีประโยชน์สามารถทำได้โดยการใช้ฟังก์ชั่นนี้แม้ว่าจะมีค่าใช้จ่ายของความซับซ้อนมากมายและมีข้อ จำกัด บางประการเกี่ยวกับเนื้อหาของไฟล์ หากคุณต้องการเปรียบเทียบไฟล์ข้อความที่มีเส้นยาว (> 127 ตัวอักษร) และตำแหน่งที่บรรทัดส่วนใหญ่ตรงกับ 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
โดยที่ xx คือความยาวของบรรทัดที่ยาวที่สุด +9
คำอธิบาย
(gc file | % -begin { $ln=0 } -process { '{0,6}<<:{1}' -f ++$ln,$_ })
รับเนื้อหาของไฟล์และเติมหมายเลขบรรทัดและตัวบ่งชี้ไฟล์ (<< หรือ >>) ให้กับแต่ละบรรทัด (ใช้โอเปอเรเตอร์สตริงรูปแบบ) ก่อนส่งต่อไปยัง diff
-property { $_.substring(9) }
บอกให้ diff เปรียบเทียบแต่ละคู่ของออบเจ็กต์ (สตริง) โดยไม่สนใจอักขระ 9 ตัวแรก (ซึ่งเป็นหมายเลขบรรทัดและตัวบ่งชี้ไฟล์) สิ่งนี้ใช้ความสามารถในการระบุคุณสมบัติที่คำนวณได้ (ค่าของบล็อกสคริปต์) แทนที่จะเป็นชื่อของคุณสมบัติ
-passthru
ทำให้ diff แตกต่างกันไปกับวัตถุอินพุตที่แตกต่างกัน (ซึ่งรวมถึงหมายเลขบรรทัดและตัวบ่งชี้ไฟล์) แทนที่จะเป็นวัตถุเปรียบเทียบที่แตกต่างกัน (ซึ่งไม่)
sort-object
จากนั้นใส่บรรทัดทั้งหมดกลับเป็นลำดับ
out-string หยุดการตัดทอนเริ่มต้นของเอาท์พุทให้พอดีกับความกว้างของหน้าจอ (ตามที่ระบุไว้โดย Marc Towersap) โดยการระบุความกว้างที่ใหญ่พอที่จะหลีกเลี่ยงการตัดทอน โดยปกติเอาต์พุตนี้จะถูกใส่ลงในไฟล์ซึ่งจะถูกดูโดยใช้ตัวเลื่อนการเลื่อน (เช่น notepad)
บันทึก
รูปแบบหมายเลขบรรทัด {0,6} ให้ความถูกต้องอย่างสมเหตุสมผลช่องว่างขนาด 6 อักขระ (สำหรับการจัดเรียง) หากไฟล์มีมากกว่า 999,999 บรรทัดให้เปลี่ยนรูปแบบให้กว้างขึ้น สิ่งนี้ยังต้องการการแก้ไข$_.substring
พารามิเตอร์ (มากกว่าความกว้างของหมายเลขบรรทัด 3) และค่า xx ของ out-string (ความยาวบรรทัด + $_.substring
พารามิเตอร์สูงสุด)