मैं विंडोज पॉवर्सशेल में दो फ़ोल्डर्स कैसे अलग करूं?


11

मैं विंडोज पॉवर्सशेल का उपयोग करके दो फ़ोल्डर संरचनाओं की सामग्री में अंतर खोजने की कोशिश कर रहा हूं। मैंने निम्नलिखित विधि का उपयोग यह सुनिश्चित करने के लिए किया है कि फ़ाइल नाम समान हैं, लेकिन यह विधि मुझे यह नहीं बताती है कि क्या फ़ाइलों की सामग्री समान है:

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

इस सर्वरफॉल्ट प्रश्न में वर्णित तकनीक एकल फ़ाइल को अलग करने के लिए काम करती है, लेकिन इन फ़ोल्डरों में कई प्रकार की गहराई में सैकड़ों फाइलें होती हैं।

समाधान के लिए मुझे यह बताने की आवश्यकता नहीं है कि विशेष रूप से फाइलों में क्या अलग है - बस वे ही हैं। मुझे मेटाडेटा में अंतर के बारे में कोई दिलचस्पी नहीं है, जैसे कि तारीख, जिसे मैं पहले से ही जानता हूं।

जवाबों:


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 के उत्तर को एक विस्तारित फाइल में आउटपुट करने के लिए लिया है जो एक में मौजूद हैं, लेकिन दूसरे के लिए नहीं जो उस प्रकार की कार्यक्षमता में हैं। कृपया ध्यान दें कि यह प्रगति को दर्शाता है क्योंकि मेरे लिए यह देखना बहुत कठिन था कि बहुत अधिक अंतर के साथ विशाल फ़ोल्डर नहीं दिए गए हैं। ऐसा लग रहा था कि स्क्रिप्ट मुझे लटका दी गई है। यहाँ इसके लिए पॉवरशेल कोड दिया गया है:

$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/…
कैस्पर लियोन नीलसन 14

1

आप बस अपने लिंक किए गए प्रश्न से सही उत्तर के चारों ओर एक लूप लपेटते हैं, जो पहले से ही इसका उत्तर देता है, और उसी नाम से हर फ़ाइल की तुलना करते हुए डायरेक्टरी ट्री पर चलते हैं।

/ संपादित करें: यदि यह वास्तव में आपका प्रश्न है, तो यह एसओ के लिए अधिक उपयुक्त है, जहां आप एक नियमित योगदानकर्ता लगते हैं। आप एक प्रोग्रामिंग सवाल पूछ रहे हैं। मैं समझता हूं कि आप इसे sysadmin-type उद्देश्य के लिए कर रहे हैं, इस स्थिति में, मैं आपको WinDiff जैसे उद्देश्य-निर्मित उपकरण का उपयोग करने के लिए कहूंगा।


2
ठीक है, यह साइट "मुझे कूट दो" प्रकार के प्रश्नों के लिए उपयुक्त नहीं है। यदि आपको पॉवरशेल में लूप कैसे करना है, यह सीखने की शुरुआत करने की आवश्यकता है, एक पुस्तक खरीदें या ऑनलाइन ट्यूटोरियल खोजें; वहां कई हैं।
mfinni

2
मुझे लगता है कि आप बिस्तर के गलत पक्ष पर जाग गए। मैं एक नियमित पॉवरशेल उपयोगकर्ता नहीं हूं। मैंने अपने प्रश्न में एक तकनीक का प्रदर्शन किया है जिसे मैं वर्तमान में प्रयास कर रहा हूं, और एक प्रश्न का लिंक जो मेरी समस्या के लिए अतिरिक्त उपयोगी जानकारी है। मुझे नहीं पता कि दोनों तकनीकों को कैसे जोड़ा जाए, जो कि मेरी समस्या है, और जिस कारण से मैंने यह प्रश्न पूछा है। यह भी एक सवाल है जिसका मैं Google खोजों का उपयोग करने में उत्तर देने में असमर्थ हूं। यदि आप मददगार नहीं हैं, तो कृपया अपना उत्तर हटाने पर विचार करें।
डेविड स्मिथ

2
@BigDave सचमुच पहला परिणाम के लिए PowerShell loop through filesगूगल पर । चलो अब - अपने हिस्से पर एक छोटा सा प्रयास?
voretaq7

2
@ voretaq7 मुझे लगता है कि आप लोग मुझे PowerShell उपयोगकर्ता के रूप में गलत समझते हैं। मैंने वह Google खोज की, उस तकनीक का प्रयास किया, और सफल नहीं हुआ। मैंने यह समझाने की कोशिश की कि ऊपर के प्रश्न में मैं कहाँ हूँ। प्रश्न आप फ़ाइलों के एक सेट पर काम करने के लिए लिंक करते हैं। मेरे पास दो सेट हैं जिनकी मुझे तुलना करने की आवश्यकता है, नाम-से-नाम। मैं वास्तव में यहाँ आलसी होने की कोशिश नहीं कर रहा हूँ। मुझे पता है कि कैसे लूप करना है, और मुझे पता है कि कैसे तुलना करनी है। मैं कैसे लूप करूं, और दो सेटों की तुलना करूं?
डेविड स्मिथ

1
मुझे लगता है कि पीएस के साथ ऐसा करना एक बहुत छोटी परियोजना है। हालांकि, WinMerge (सोचा कि यह WinDiff था, मुझे मूर्खतापूर्ण) वास्तव में एक महान उपकरण है अगर आप बहुत बार ऐसा करने जा रहे हैं। यह सचमुच नौकरी के लिए बनाया गया है। यह कोशिश करो, डाउनलोड मुफ्त है। यह अधिकांश फ़ाइल प्रकारों के लिए डेकोम्पोज़र है, और हाइलाइटिंग का एक बड़ा काम करता है, जिसमें आप व्हॉट्सएप को कैसे संभालना चाहते हैं, इसके विकल्प भी शामिल हैं।
एमफिनी

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)

और भूलना भी मुश्किल है :)

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.