Bagaimana cara membedakan dua folder di Windows Powershell?


11

Saya mencoba untuk menemukan perbedaan dalam isi dua struktur folder menggunakan Windows Powershell. Saya telah menggunakan metode berikut untuk memastikan bahwa nama file sama, tetapi metode ini tidak memberi tahu saya jika isi file sama:

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

Teknik yang dijelaskan dalam pertanyaan ServerFault ini berfungsi untuk membedakan satu file, tetapi folder ini berisi ratusan file pada berbagai kedalaman.

Solusinya tidak perlu memberi tahu saya apa yang spesifik dalam file berbeda - hanya itu saja. Saya tidak tertarik pada perbedaan metadata seperti tanggal, yang saya tahu berbeda.

Jawaban:


15

Jika Anda ingin membungkus bandingkan menjadi satu lingkaran saya akan mengambil pendekatan berikut:

$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)

        }
    }   
}

Perhatikan bahwa ini akan mengabaikan file yang tidak ada di keduanya $folder1 dan $folder2.


5

Saya telah mengambil jawaban jscott yang diperluas untuk menampilkan file yang ada dalam satu tetapi tidak yang lain bagi mereka yang insterest dalam jenis fungsi tersebut. Harap dicatat juga menunjukkan kemajuan yang dibuat karena sulit bagi saya untuk melihat bahwa mengingat folder besar dengan perbedaan yang tidak terlalu banyak. Sepertinya skrip digantung kepada saya. Berikut adalah kode PowerShell untuk itu:

$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"
    }
}

Mengapa Anda mengekstrak konten aktual file saat memanggil Bandingkan-Obyek? Thats what Compare-Object tidak. technet.microsoft.com/en-us/library/…
Casper Leon Nielsen

1

Anda cukup membungkus lingkaran di sekitar jawaban yang benar dari pertanyaan Anda yang terhubung yang sudah menjawab ini, dan berjalan di pohon direktori membandingkan setiap file dengan nama yang sama.

/ Sunting: Jika itu sebenarnya pertanyaan Anda, itu lebih sesuai untuk SO, di mana Anda tampaknya menjadi kontributor tetap. Anda mengajukan pertanyaan pemrograman. Saya mengerti Anda melakukannya untuk tujuan sysadmin, dalam hal ini, saya akan memberitahu Anda untuk menggunakan alat yang dibuat khusus seperti WinDiff.


2
Oke, situs ini tidak sesuai untuk pertanyaan jenis "Beri aku kodez". Jika Anda perlu memulai mempelajari cara melakukan loop di Powershell, beli buku atau temukan tutorial online; ada banyak.
mfinni

2
Saya pikir Anda bangun di sisi tempat tidur yang salah. Saya bukan pengguna Powershell biasa. Saya telah menunjukkan dalam pertanyaan saya teknik yang sedang saya coba, dan tautan ke pertanyaan yang memiliki informasi bermanfaat tambahan untuk masalah saya. Saya tidak tahu bagaimana menggabungkan kedua teknik, yang merupakan masalah saya, dan alasan saya mengajukan pertanyaan ini. Ini juga merupakan pertanyaan yang saya tidak dapat jawab menggunakan pencarian Google. Jika Anda tidak akan membantu, silakan pertimbangkan untuk menghapus jawaban Anda.
David Smith

2
@BigDave Secara harfiah hasil pertama untuk PowerShell loop through filesdi Google . ayo sekarang - sedikit usaha di pihak Anda?
voretaq7

2
@ voretaq7 Saya pikir kalian salah mengerti saya sebagai pengguna PowerShell. Saya melakukan pencarian google, mencoba teknik itu, dan tidak berhasil. Saya mencoba menjelaskan di mana saya berada dalam pertanyaan di atas. Pertanyaan yang Anda tautkan berfungsi pada satu set file. Saya memiliki dua set yang harus saya bandingkan, nama-ke-nama. Aku benar-benar tidak berusaha menjadi malas di sini. Saya tahu cara mengulang, dan saya tahu cara membandingkan. Bagaimana cara mengulang, dan membandingkan dua set?
David Smith

1
Saya pikir melakukan ini dengan PS adalah proyek kecil yang hebat. Namun, WinMerge (mengira itu adalah WinDiff, konyol saya) benar-benar alat yang hebat jika Anda akan melakukan ini sangat sering. Ini benar-benar dibangun untuk pekerjaan itu. Cobalah, unduhannya gratis. Itu punya pengurai untuk sebagian besar jenis file, dan melakukan pekerjaan yang baik untuk menyoroti, termasuk opsi untuk bagaimana Anda ingin menangani spasi putih.
mfinni

0

Melakukan hal ini:

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

Dan bahkan secara rekursif:

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

dan bahkan sulit untuk dilupakan :)

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.