ฉันจะแตกต่างสองโฟลเดอร์ใน Windows Powershell ได้อย่างไร


11

ฉันพยายามค้นหาความแตกต่างในเนื้อหาของโครงสร้างโฟลเดอร์ทั้งสองโดยใช้ Windows Powershell ฉันใช้วิธีการต่อไปนี้เพื่อให้แน่ใจว่าชื่อไฟล์เหมือนกัน แต่วิธีนี้ไม่ได้บอกฉันว่าเนื้อหาของไฟล์เหมือนกัน:

$firstFolder = Get-ChildItem -Recurse folder1
$secondFolder = Get-ChildItem -Recurse folder2
Compare-Object -ReferenceObject $firstFolder -DifferenceObject $secondFolder

เทคนิคที่อธิบายไว้ในคำถาม ServerFault นี้ทำงานเพื่อกระจายไฟล์เดียว แต่โฟลเดอร์เหล่านี้มีไฟล์หลายร้อยไฟล์ที่มีความลึกหลากหลาย

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

คำตอบ:


15

หากคุณต้องการห่อเปรียบเทียบเป็นวงฉันจะใช้วิธีการดังต่อไปนี้:

$folder1 = "C:\Users\jscott"
$folder2 = "C:\Users\public"

# Get all files under $folder1, filter out directories
$firstFolder = Get-ChildItem -Recurse $folder1 | Where-Object { -not $_.PsIsContainer }

$firstFolder | ForEach-Object {

    # Check if the file, from $folder1, exists with the same path under $folder2
    If ( Test-Path ( $_.FullName.Replace($folder1, $folder2) ) ) {

        # Compare the contents of the two files...
        If ( Compare-Object (Get-Content $_.FullName) (Get-Content $_.FullName.Replace($folder1, $folder2) ) ) {

            # List the paths of the files containing diffs
            $_.FullName
            $_.FullName.Replace($folder1, $folder2)

        }
    }   
}

หมายเหตุที่ว่านี้จะไม่สนใจไฟล์ที่ไม่อยู่ทั้งใน และ$folder1$folder2


5

ฉันได้คำตอบของ jscott และขยายมันออกไฟล์ที่มีอยู่ในหนึ่ง แต่ไม่อื่นสำหรับผู้ที่ insterest ในประเภทการทำงานที่ โปรดทราบว่ามันยังแสดงให้เห็นถึงความก้าวหน้าที่เกิดขึ้นเนื่องจากมันยากสำหรับฉันที่จะเห็นว่าโฟลเดอร์ขนาดใหญ่ที่มีความแตกต่างไม่มากนัก ดูเหมือนว่าสคริปต์จะถูกแขวนไว้กับฉัน นี่คือรหัส powershell สำหรับการที่:

$folder1 = "C:\Folder1"
$folder2 = "C:\Folder2"

# Get all files under $folder1, filter out directories
$firstFolder = Get-ChildItem -Recurse $folder1 | Where-Object { -not $_.PsIsContainer }

$failedCount = 0
$i = 0
$totalCount = $firstFolder.Count
$firstFolder | ForEach-Object {
    $i = $i + 1
    Write-Progress -Activity "Searching Files" -status "Searching File  $i of     $totalCount" -percentComplete ($i / $firstFolder.Count * 100)
    # Check if the file, from $folder1, exists with the same path under $folder2
    If ( Test-Path ( $_.FullName.Replace($folder1, $folder2) ) ) {
        # Compare the contents of the two files...
        If ( Compare-Object (Get-Content $_.FullName) (Get-Content $_.FullName.Replace($folder1, $folder2) ) ) {
            # List the paths of the files containing diffs
            $fileSuffix = $_.FullName.TrimStart($folder1)
            $failedCount = $failedCount + 1
            Write-Host "$fileSuffix is on each server, but does not match"
        }
    }
    else
    {
        $fileSuffix = $_.FullName.TrimStart($folder1)
        $failedCount = $failedCount + 1
        Write-Host "$fileSuffix is only in folder 1"
    }
}

$secondFolder = Get-ChildItem -Recurse $folder2 | Where-Object { -not $_.PsIsContainer }

$i = 0
$totalCount = $secondFolder.Count
$secondFolder | ForEach-Object {
    $i = $i + 1
    Write-Progress -Activity "Searching for files only on second folder" -status "Searching File  $i of $totalCount" -percentComplete ($i / $secondFolder.Count * 100)
    # Check if the file, from $folder2, exists with the same path under $folder1
    If (!(Test-Path($_.FullName.Replace($folder2, $folder1))))
    {
        $fileSuffix = $_.FullName.TrimStart($folder2)
        $failedCount = $failedCount + 1
        Write-Host "$fileSuffix is only in folder 2"
    }
}

เหตุใดคุณจึงแตกเนื้อหาจริงของไฟล์เมื่อเรียกเปรียบเทียบวัตถุ นั่นคือสิ่งที่เปรียบเทียบวัตถุ technet.microsoft.com/en-us/library/…
Casper Leon Nielsen

1

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

/ แก้ไข: ถ้านั่นเป็นคำถามของคุณจริง ๆ แล้วมันเหมาะสมกว่าสำหรับ SO ที่คุณดูเหมือนจะเป็นผู้มีส่วนร่วมปกติ คุณกำลังถามคำถามการเขียนโปรแกรม ฉันเข้าใจว่าคุณกำลังทำเพื่อวัตถุประสงค์ดูแลระบบในกรณีนี้ฉันจะบอกให้คุณใช้เครื่องมือที่สร้างขึ้นเพื่อวัตถุประสงค์เช่น WinDiff


2
ตกลงไซต์นี้ไม่เหมาะสำหรับคำถามประเภท "Give the codez" หากคุณต้องการเริ่มต้นเรียนรู้วิธีทำลูปใน Powershell ซื้อหนังสือหรือค้นหาบทเรียนออนไลน์ มีมากมาย.
mfinni

2
ฉันคิดว่าคุณตื่นขึ้นมาในด้านที่ผิดของเตียง ฉันไม่ใช่ผู้ใช้ Powershell ปกติ ฉันแสดงให้เห็นในคำถามทั้งเทคนิคที่ฉันพยายามและลิงก์ไปยังคำถามที่มีข้อมูลที่เป็นประโยชน์เพิ่มเติมสำหรับปัญหาของฉัน ฉันไม่ทราบวิธีรวมสองเทคนิคซึ่งเป็นปัญหาของฉันและเหตุผลที่ฉันถามคำถามนี้ เป็นคำถามที่ฉันไม่สามารถตอบโดยใช้การค้นหาของ Google หากคุณไม่ได้มีประโยชน์โปรดพิจารณาลบคำตอบของคุณ
David Smith

2
@BigDave แท้จริงผลแรกสำหรับPowerShell loop through filesใน Google ตอนนี้คุณมีความพยายามเล็กน้อยหรือยัง?
voretaq7

2
@ voretaq7 ฉันคิดว่าพวกคุณเข้าใจฉันผิดในฐานะผู้ใช้ PowerShell ฉันค้นหา google นั้นพยายามใช้เทคนิคนั้นและไม่ประสบความสำเร็จ ฉันพยายามอธิบายว่าฉันอยู่ที่ไหนในคำถามข้างต้น คำถามที่คุณลิงก์เพื่อทำงานกับไฟล์ชุดเดียว ฉันมีสองชุดที่ฉันต้องเปรียบเทียบชื่อต่อชื่อ ฉันไม่ได้ขี้เกียจที่นี่ ฉันรู้วิธีวนรอบและรู้วิธีเปรียบเทียบ ฉันจะวนซ้ำและเปรียบเทียบสองชุดได้อย่างไร
David Smith

1
ฉันคิดว่าการทำสิ่งนี้กับ PS เป็นโครงการเล็ก ๆ ที่ยอดเยี่ยม อย่างไรก็ตาม WinMerge (คิดว่ามันเป็น WinDiff, โง่ฉัน) เป็นเครื่องมือที่ยอดเยี่ยมจริง ๆ ถ้าคุณจะทำสิ่งนี้บ่อยมาก มันถูกสร้างขึ้นสำหรับงานอย่างแท้จริง ลองดาวน์โหลดฟรี มันมีตัวแยกประเภทสำหรับไฟล์ส่วนใหญ่และทำหน้าที่ได้ดีในการเน้นรวมถึงตัวเลือกสำหรับวิธีที่คุณต้องการจัดการกับช่องว่าง
mfinni

0

ทำเช่นนี้:

compare (Get-ChildItem D:\MyFolder\NewFolder) (Get-ChildItem \\RemoteServer\MyFolder\NewFolder)

และแม้แต่ซ้ำ:

compare (Get-ChildItem -r D:\MyFolder\NewFolder) (Get-ChildItem -r \\RemoteServer\MyFolder\NewFolder)

และยากที่จะลืม :)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.