ค้นหาเว็บไซต์

เปรียบเทียบเนื้อหาของสองโฟลเดอร์ใน PowerShell [2 วิธี]


การเปรียบเทียบเนื้อหาของสองโฟลเดอร์ใน PowerSHell

PowerShell เป็นเครื่องมืออันทรงพลังที่สามารถช่วยผู้ดูแลระบบและผู้เชี่ยวชาญด้านไอทีทำงานตามปกติได้โดยอัตโนมัติ และงานทั่วไปอย่างหนึ่งคือการเปรียบเทียบเนื้อหาของสองโฟลเดอร์ สิ่งนี้มีประโยชน์ในการระบุความแตกต่างระหว่างสองเวอร์ชันของไดเร็กทอรีหรือการค้นหาไฟล์ที่หายไปในข้อมูลสำรอง

เพื่อดำเนินการต่อไป จำเป็นอย่างยิ่งที่จะต้องทราบรายการต่างๆ ในไดเร็กทอรีปัจจุบัน ตัวอย่างเช่น ไดเรกทอรีปัจจุบันสำหรับการสาธิตนี้อยู่ที่ C:\Test1 และ C:\Test2

  • C:\Test1 ประกอบด้วยไฟล์ข้อความสองไฟล์และโฟลเดอร์ชื่อ FolderA และ FolderB รายการในไดเร็กทอรีประกอบด้วย File1.txt และ File2.txt

    • C:\Test1\FolderA - ประกอบด้วยไฟล์ข้อความหนึ่งไฟล์ ( File4.txt)
    • C:\Test1\FolderB - มีไฟล์ข้อความหนึ่งไฟล์ (File5.txt และ File7.txt)
  • C:\Test2 ประกอบด้วยไฟล์ข้อความสองไฟล์และโฟลเดอร์ชื่อ FolderC และ FolderD รายการในไดเร็กทอรีประกอบด้วย File1.txt และ File3.txt

    • C:\Test2\FolderC - ประกอบด้วยไฟล์ข้อความหนึ่งไฟล์ ( File5.txt)
    • C:\Test2\FolderD - นอกจากนี้ยังมีไฟล์ข้อความหนึ่งไฟล์ (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 บิต ที่มีความยาวคงที่จากข้อความที่มีความยาวเท่าใดก็ได้ นี่คือคำอธิบายทีละขั้นตอนของโค้ดตามที่กล่าวไว้ข้างต้น:

  1. ขั้นตอนแรกคือการกำหนดเส้นทางไปยังโฟลเดอร์ทั้งสองที่เราต้องการเปรียบเทียบ เราสร้างตัวแปรสองตัวคือ $folder1 และ $folder2 และกำหนดเส้นทางให้กับทั้งสองโฟลเดอร์
  2. ต่อไป เราใช้ Get-ChildItem cmdlet เพื่อดึงไฟล์ทั้งหมดในทั้งสองไดเร็กทอรีและไปป์เอาต์พุตไปยัง Get-FileHash cmdlet ซึ่งสร้างค่าแฮช MD5 สำหรับแต่ละไฟล์ ค่าแฮชที่ได้จะถูกจัดเก็บไว้ในตัวแปร $hash1 และ $hash2
  3. จากนั้นเราจะวนซ้ำค่าแฮชแต่ละค่าใน $hash1 และเปรียบเทียบกับ $hash2 เราใช้ cmdlet "Where-Object" เพื่อค้นหาค่าแฮชที่ตรงกันใน $hash2 และหากพบค่าที่ตรงกัน เราจะส่งข้อความไปยังคอนโซลเพื่อระบุว่าไฟล์มีอยู่ในทั้งสองโฟลเดอร์และ เหมือนกัน หากไม่พบรายการที่ตรงกัน เราจะส่งข้อความระบุว่าไฟล์มีอยู่ใน $folder1 เท่านั้น
  4. จากนั้นเราจะวนซ้ำแต่ละค่าแฮชใน $hash2 และตรวจสอบไฟล์ที่มีอยู่ใน $folder2 เท่านั้น ต่อไป เราใช้ Where-Object cmdlet เพื่อค้นหาค่าแฮชที่ตรงกันใน $hash1 และหากไม่พบรายการที่ตรงกัน เราจะส่งข้อความไปยังคอนโซลเพื่อระบุว่า ไฟล์มีอยู่ใน $folder2 เท่านั้น

เมื่อพิจารณาจากโซลูชันข้างต้น การเปรียบเทียบเนื้อหาของสองโฟลเดอร์ใน PowerShell อาจเป็นเครื่องมือที่มีประสิทธิภาพในการระบุความแตกต่างในเนื้อหาและโครงสร้างไฟล์ การเพิ่มแฮช MD5 ช่วยให้เปรียบเทียบไฟล์ได้แม่นยำยิ่งขึ้น ด้วยสคริปต์ที่ถูกต้อง งานนี้สามารถทำได้อย่างรวดเร็วและง่ายดาย แม้ในโครงสร้างไดเร็กทอรีขนาดใหญ่และซับซ้อน

นั่นคือทั้งหมดที่เกี่ยวกับวิธีเปรียบเทียบเนื้อหาของสองโฟลเดอร์ใน PowerShell

บทความที่เกี่ยวข้อง