เปรียบเทียบเนื้อหาของสองโฟลเดอร์ใน PowerShell [2 วิธี]
การเปรียบเทียบเนื้อหาของสองโฟลเดอร์ใน PowerSHell
PowerShell เป็นเครื่องมืออันทรงพลังที่สามารถช่วยผู้ดูแลระบบและผู้เชี่ยวชาญด้านไอทีทำงานตามปกติได้โดยอัตโนมัติ และงานทั่วไปอย่างหนึ่งคือการเปรียบเทียบเนื้อหาของสองโฟลเดอร์ สิ่งนี้มีประโยชน์ในการระบุความแตกต่างระหว่างสองเวอร์ชันของไดเร็กทอรีหรือการค้นหาไฟล์ที่หายไปในข้อมูลสำรอง
เพื่อดำเนินการต่อไป จำเป็นอย่างยิ่งที่จะต้องทราบรายการต่างๆ ในไดเร็กทอรีปัจจุบัน ตัวอย่างเช่น ไดเรกทอรีปัจจุบันสำหรับการสาธิตนี้อยู่ที่ C:\Test1 และ C:\Test2
C:\Test1 ประกอบด้วยไฟล์ข้อความสองไฟล์และโฟลเดอร์ชื่อ
FolderAและFolderBรายการในไดเร็กทอรีประกอบด้วยFile1.txtและFile2.txt- C:\Test1\FolderA - ประกอบด้วยไฟล์ข้อความหนึ่งไฟล์ (
File4.txt)
- C:\Test1\FolderA - ประกอบด้วยไฟล์ข้อความหนึ่งไฟล์ (
- C:\Test1\FolderB - มีไฟล์ข้อความหนึ่งไฟล์ (
File5.txtและFile7.txt)
C:\Test2 ประกอบด้วยไฟล์ข้อความสองไฟล์และโฟลเดอร์ชื่อ FolderC และ FolderD รายการในไดเร็กทอรีประกอบด้วย File1.txt และ File3.txt
- C:\Test2\FolderC - ประกอบด้วยไฟล์ข้อความหนึ่งไฟล์ (
File5.txt)
File6.txt)ตอนนี้คุณรู้รายละเอียดไดเร็กทอรีแล้ว มาเรียนรู้การเปรียบเทียบเนื้อหาของสองโฟลเดอร์กันต่อ
ใช้ Compare-Object Cmdlet
ใช้ compare-object เพื่อเปรียบเทียบสองโฟลเดอร์ใน PowerShell compare-object cmdlet เปรียบเทียบชุดข้อมูลสองชุดใน PowerShell
ใช้ Compare-Object Cmdlet:
$folder1 = "C:\Test1"
$folder2 = "C:\Test2"
$folder1Items = Get-ChildItem $folder1 -Recurse
$folder2Items = Get-ChildItem $folder2 -Recurse
Compare-Object -ReferenceObject $folder1Items -DifferenceObject $folder2Items -Property Name -IncludeEqualเอาท์พุต :
Name SideIndicator
---- -------------
File1.txt ==
File5.txt ==
FolderC =>
FolderD =>
File3.txt =>
File6.txt =>
FolderA <=
FolderB <=
File2.txt <=
File4.txt <=
File7.txt <=ในโค้ดข้างต้น เรากำหนดโฟลเดอร์สองโฟลเดอร์ที่เราต้องการเปรียบเทียบ ได้แก่ $folder1 และ $folder2 ขั้นแรก สัญลักษณ์ $ จะสร้างตัวแปรใน PowerShell จากนั้น Compare-Object cmdlet จะเปรียบเทียบชุดข้อมูลทั้งสองชุด
ReferenceObject (Get-ChildItem $folder1) ระบุออบเจ็กต์อ้างอิงและชุดข้อมูลที่จะใช้เป็นพื้นฐานสำหรับการเปรียบเทียบ ในกรณีนี้ เรากำลังใช้ Get-ChildItem cmdlet เพื่อรับรายการไฟล์และไดเร็กทอรีใน $folder1 โดยมี -Recurse เป็นพารามิเตอร์ และส่งรายการนั้นไปยังพารามิเตอร์ -ReferenceObject ของ Compare-Object cmdlet ซึ่งจะเป็นการบอกให้ PowerShell ใช้ไฟล์และไดเรกทอรีใน $folder1 เป็นข้อมูลอ้างอิงสำหรับการเปรียบเทียบ
พารามิเตอร์ -DifferenceObject ของ Compare-Object cmdlet บอกให้ PowerShell เปรียบเทียบไฟล์และไดเรกทอรีใน $folder2 กับที่อยู่ใน $folder1 . สุดท้าย -Property ระบุคุณสมบัติของวัตถุที่เราต้องการเปรียบเทียบ ในกรณีนี้ เราจะเปรียบเทียบคุณสมบัติ Name ของไฟล์และไดเร็กทอรีในแต่ละโฟลเดอร์
-IncludeEqual ระบุว่าเราต้องการรวมวัตถุที่เหมือนกันในทั้งสองโฟลเดอร์ในการเปรียบเทียบ ตามค่าเริ่มต้น cmdlet Compare-Object จะส่งกลับวัตถุที่แตกต่างกันระหว่างวัตถุอ้างอิงและวัตถุต่างกันเท่านั้น
ผลลัพธ์นี้บ่งชี้ว่ามีสองไฟล์ สามโฟลเดอร์ที่แตกต่างกัน และหนึ่งไฟล์เหมือนกันระหว่างสองโฟลเดอร์ คอลัมน์ SideIndicator ในเอาต์พุตจะแสดงด้านที่ไฟล์หรือโฟลเดอร์ไม่ซ้ำกัน <= สำหรับด้านซ้าย => สำหรับด้านขวา และ == สำหรับทั้งคู่
เมื่อพิจารณาโซลูชันข้างต้น cmdlet Compare-Object ใน PowerShell มอบวิธีที่มีประสิทธิภาพและทรงพลังในการเปรียบเทียบและระบุความแตกต่างระหว่างชุดข้อมูลสองชุด ด้วยการระบุวัตถุอ้างอิงและวัตถุที่แตกต่าง คุณสมบัติที่เราต้องการเปรียบเทียบ และตัวเลือกเพิ่มเติมใดๆ เช่น การรวมวัตถุที่เหมือนกันในชุดข้อมูลทั้งสอง ทำให้เราสามารถระบุการเปลี่ยนแปลงระหว่างสองโฟลเดอร์ได้อย่างรวดเร็วและง่ายดาย
ใช้การแฮช MD5
หากต้องการเปรียบเทียบเนื้อหาของสองโฟลเดอร์:
- ใช้
Get-ChildItemเพื่อดึงข้อมูลรายการทั้งหมดในไดเร็กทอรีที่ระบุ - ใช้
Get-FileHashเพื่อสร้างค่าแฮช MD5 สำหรับแต่ละไฟล์ - ใช้ลูป
foreachสองลูปเพื่อวนซ้ำค่าแฮชสำหรับทั้งสองไดเร็กทอรี - ในการวนซ้ำแต่ละครั้งของทุกวง:
- ใช้ Where-Object เพื่อกรองค่าที่ตรงกันและพิมพ์ข้อความหากคำสั่ง
ifเป็นจริง
ใช้การแฮช MD5:
$folder1 = "C:\Test1"
$folder2 = "C:\Test2"
$hash1 = Get-ChildItem $folder1 -Recurse | Get-FileHash -Algorithm MD5
$hash2 = Get-ChildItem $folder2 -Recurse | Get-FileHash -Algorithm MD5
foreach ($hash in $hash1) {
$match = $hash2 | Where-Object { $_.Hash -eq $hash.Hash }
if ($match) {
Write-Host "File $($hash.Path) exists in both folders and is identical."
} else {
Write-Host "File $($hash.Path) exists only in $folder1."
}
}
foreach ($hash in $hash2) {
$match = $hash1 | Where-Object { $_.Hash -eq $hash.Hash }
if (!$match) {
Write-Host "File $($hash.Path) exists only in $folder2."
}
}File C:\Test1\File1.txt exists in both folders and is identical.
File C:\Test1\File2.txt exists only in C:\Test1.
File C:\Test1\FolderA\File4.txt exists in both folders and is identical.
File C:\Test1\FolderB\File5.txt exists in both folders and is identical.
File C:\Test1\FolderB\File7.txt exists only in C:\Test1.
File C:\Test2\File3.txt exists only in C:\Test2.
File C:\Test2\FolderD\File6.txt exists only in C:\Test2.MD5 (Message Digest 5) เป็นฟังก์ชันแฮชการเข้ารหัสที่ใช้กันอย่างแพร่หลาย ซึ่งสร้างค่าแฮช 128 บิต ที่มีความยาวคงที่จากข้อความที่มีความยาวเท่าใดก็ได้ นี่คือคำอธิบายทีละขั้นตอนของโค้ดตามที่กล่าวไว้ข้างต้น:
- ขั้นตอนแรกคือการกำหนดเส้นทางไปยังโฟลเดอร์ทั้งสองที่เราต้องการเปรียบเทียบ เราสร้างตัวแปรสองตัวคือ
$folder1และ$folder2และกำหนดเส้นทางให้กับทั้งสองโฟลเดอร์ - ต่อไป เราใช้
Get-ChildItemcmdlet เพื่อดึงไฟล์ทั้งหมดในทั้งสองไดเร็กทอรีและไปป์เอาต์พุตไปยัง Get-FileHash cmdlet ซึ่งสร้างค่าแฮช MD5 สำหรับแต่ละไฟล์ ค่าแฮชที่ได้จะถูกจัดเก็บไว้ในตัวแปร$hash1และ$hash2 - จากนั้นเราจะวนซ้ำค่าแฮชแต่ละค่าใน
$hash1และเปรียบเทียบกับ$hash2เราใช้ cmdlet "Where-Object" เพื่อค้นหาค่าแฮชที่ตรงกันใน$hash2และหากพบค่าที่ตรงกัน เราจะส่งข้อความไปยังคอนโซลเพื่อระบุว่าไฟล์มีอยู่ในทั้งสองโฟลเดอร์และ เหมือนกัน หากไม่พบรายการที่ตรงกัน เราจะส่งข้อความระบุว่าไฟล์มีอยู่ใน$folder1เท่านั้น - จากนั้นเราจะวนซ้ำแต่ละค่าแฮชใน
$hash2และตรวจสอบไฟล์ที่มีอยู่ใน$folder2เท่านั้น ต่อไป เราใช้Where-Objectcmdlet เพื่อค้นหาค่าแฮชที่ตรงกันใน$hash1และหากไม่พบรายการที่ตรงกัน เราจะส่งข้อความไปยังคอนโซลเพื่อระบุว่า ไฟล์มีอยู่ใน$folder2เท่านั้น
เมื่อพิจารณาจากโซลูชันข้างต้น การเปรียบเทียบเนื้อหาของสองโฟลเดอร์ใน PowerShell อาจเป็นเครื่องมือที่มีประสิทธิภาพในการระบุความแตกต่างในเนื้อหาและโครงสร้างไฟล์ การเพิ่มแฮช MD5 ช่วยให้เปรียบเทียบไฟล์ได้แม่นยำยิ่งขึ้น ด้วยสคริปต์ที่ถูกต้อง งานนี้สามารถทำได้อย่างรวดเร็วและง่ายดาย แม้ในโครงสร้างไดเร็กทอรีขนาดใหญ่และซับซ้อน
นั่นคือทั้งหมดที่เกี่ยวกับวิธีเปรียบเทียบเนื้อหาของสองโฟลเดอร์ใน PowerShell
