Làm cách nào để tìm khác biệt hai thư mục trong Windows Powershell?


11

Tôi đang cố gắng tìm sự khác biệt trong nội dung của hai cấu trúc thư mục bằng Windows Powershell. Tôi đã sử dụng phương pháp sau để đảm bảo rằng tên tệp giống nhau, nhưng phương pháp này không cho tôi biết nếu nội dung của các tệp giống nhau:

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

Kỹ thuật được mô tả trong câu hỏi ServerFault này hoạt động để phân biệt một tệp duy nhất, nhưng các thư mục này chứa hàng trăm tệp ở nhiều độ sâu khác nhau.

Giải pháp không nhất thiết phải cho tôi biết cụ thể trong các tệp là gì - chỉ là chúng là như vậy. Tôi không quan tâm đến sự khác biệt trong siêu dữ liệu như ngày tháng, mà tôi đã biết là khác nhau.

Câu trả lời:


15

Nếu bạn muốn kết hợp so sánh thành một vòng lặp, tôi sẽ thực hiện theo cách sau:

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

        }
    }   
}

Lưu ý rằng điều này sẽ bỏ qua các tập tin không tồn tại trong cả hai $folder1$folder2.


5

Tôi đã lấy câu trả lời của jscott mở rộng nó để xuất ra các tệp có trong một nhưng không phải là tệp khác cho những người kém nhất trong loại chức năng đó. Xin lưu ý rằng nó cũng cho thấy sự tiến bộ được thực hiện vì thật khó để tôi thấy rằng với các thư mục lớn không có nhiều khác biệt. Nó trông giống như kịch bản được treo cho tôi. Đây là mã powershell cho điều đó:

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

Tại sao bạn lại trích xuất nội dung thực tế của một tệp khi gọi So sánh đối tượng? Đó là những gì So sánh-Đối tượng làm. technet.microsoft.com/en-us/l Library / từ
Casper Leon Nielsen

1

Bạn chỉ cần quấn một vòng quanh câu trả lời đúng từ câu hỏi được liên kết của bạn đã trả lời câu hỏi này và đi trên cây thư mục so sánh mọi tệp có cùng tên.

/ Chỉnh sửa: Nếu đó thực sự là câu hỏi của bạn, nó phù hợp hơn với SO, nơi bạn dường như là người đóng góp thường xuyên. Bạn đang hỏi một câu hỏi lập trình. Tôi hiểu rằng bạn đang thực hiện nó cho mục đích kiểu sysadmin, trong trường hợp đó, tôi sẽ bảo bạn sử dụng một công cụ được xây dựng có mục đích như WinDiff.


2
OK, trang web này không phù hợp với các câu hỏi loại "Hãy cho tôi mã". Nếu bạn cần bắt đầu học cách làm các vòng lặp trong Powershell, hãy mua một cuốn sách hoặc tìm hướng dẫn trực tuyến; có nhiều.
mfinni

2
Tôi nghĩ rằng bạn thức dậy ở phía bên trái của giường. Tôi không phải là người dùng Powershell thông thường. Tôi đã chứng minh trong câu hỏi của mình cả một kỹ thuật mà tôi hiện đang cố gắng và liên kết đến một câu hỏi có thêm thông tin hữu ích cho vấn đề của tôi. Tôi không biết làm thế nào để kết hợp hai kỹ thuật, đó là vấn đề của tôi và lý do tôi đã hỏi câu hỏi này. Đó cũng là một câu hỏi mà tôi không thể trả lời bằng các tìm kiếm của Google. Nếu bạn không có ích, vui lòng xem xét xóa câu trả lời của bạn.
David Smith

2
@BigDave Nghĩa đen là kết quả đầu tiên cho PowerShell loop through filesGoogle . Bây giờ - một chút nỗ lực từ phía bạn?
voretaq7

2
@ voretaq7 Tôi nghĩ các bạn hiểu nhầm tôi là người dùng PowerShell. Tôi đã thực hiện tìm kiếm google, thử kỹ thuật đó và không thành công. Tôi đã cố gắng giải thích tôi đang ở đâu trong câu hỏi trên. Câu hỏi bạn liên kết để làm việc trên một tập hợp các tập tin. Tôi có hai bộ mà tôi cần so sánh, tên-tên. Tôi thực sự không cố gắng để lười biếng ở đây. Tôi biết cách lặp, và tôi biết cách so sánh. Làm thế nào để tôi lặp, và so sánh hai bộ?
David Smith

1
Tôi nghĩ rằng làm điều này với PS là một dự án nhỏ tuyệt vời. Tuy nhiên, WinMerge (nghĩ rằng đó là WinDiff, tôi thật ngốc) thực sự là một công cụ tuyệt vời nếu bạn sẽ làm việc này rất thường xuyên. Nó thực sự được xây dựng cho công việc. Hãy thử nó, tải về là miễn phí. Nó có bộ dịch ngược cho hầu hết các loại tệp và làm rất tốt việc làm nổi bật, bao gồm các tùy chọn về cách bạn muốn xử lý khoảng trắng.
mfinni

0

Làm cái này:

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

Và thậm chí đệ quy:

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

và thậm chí khó quên :)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.