2012-03-07 21 views
12

में सरणी चर की तुलना में मेरे पास दो स्क्रिप्ट की तुलना करने के लिए यह स्क्रिप्ट है।PowerShell

$firstfolder = Get-ChildItem C:\firstfolder 
$secondfolder = Get-ChildItem C:\firstfolder 

if ($firstfolder -eq $secondfolder) { 
Write-Host "Folders are the same." 
} else { 
    Write-Host "Error: Doesn't match." 
} 

जैसा कि आप देख सकते हैं, मैं उसी फ़ोल्डर की तुलना करता हूं। समस्या यह है कि यह कभी भी विचार नहीं करेगा, कि सरणी बराबर हैं। क्यूं कर?

उत्तर

25

पावरशेल में, सरणी को इंगित करने वाले चर का मूल्यांकन एरे की सामग्री को समझाकर अभिव्यक्तियों में किया जाता है।

उदाहरण के लिए इस अभिव्यक्ति:

$firstFolder | Get-Member 

System.IO.DirectoryInfo प्रकार है, जो वास्तव में $firstFolder सरणी में पहले तत्व के प्रकार है के बारे में जानकारी वापस आ जाएगी। यदि आप सरणी ऑब्जेक्ट पर ही काम करना चाहते हैं, तो आपको , ऑपरेटर का उपयोग करके ऑब्जेक्ट को सरणी के रूप में इलाज करने के लिए PowerShell को स्पष्ट रूप से बताना होगा। निम्नलिखित अभिव्यक्ति:

,$firstFolder | Get-Member 

प्रत्याशित System.Object[] के बारे में जानकारी वापस आ जाएगी।

हालांकि, जब -eq ऑपरेटर दो सरणी चर के बीच उपयोग किया जाता है, तो चीजें थोड़ा अलग होती हैं। पावरशेल वास्तव में बाईं ओर पर सरणी की गणना करेगा और पूरे आइटम को पर दाएं तरफ सरणी में के रूप में तुलना करें। परिणाम मेल खाने वाले आइटमों की एक सरणी या कोई मिलान नहीं होने पर पर कुछ भी नहीं होगा। उदाहरण के लिए:

$a = 1..5 
$b = 1..5 
$a -eq $b   # returns zero-length array 
[bool]($a -eq $b) # returns $false 
$a -eq 3   # returns 3 

अपने विशेष मामले में, परिणाम (यदि एक boolean लिए casted या $false) के बाद से $firstFolder सरणी System.IO.DirectoryInfo वस्तुओं है कि काफी $secondFolder में सरणी से मेल नहीं खाते शामिल शून्य लंबाई सरणी हो जाएगा चर।

आप वास्तव में क्या चाहते हैं सामग्री एक दूसरे के खिलाफ दोनों सरणी की तुलना करना है। जब सरणियों बराबर हैं

Compare-Object $firstFolder $secondFolder -SyncWindow 0 

इस मतभेद के एक सरणी दो सरणियों या $null के बीच वापस आ जाएगी: यह जहां Compare-Object cmdlet काम में आता है। अधिक सटीक रूप से, परिणामस्वरूप सरणी में प्रत्येक आइटम के लिए एक ऑब्जेक्ट होगा जो केवल एक सरणी में मौजूद है, न कि दूसरे। -SyncWindow 0 तर्क ऑर्डर करेगा जिसमें ऑरेज़ में आइटम एक अंतर के रूप में गिने जाते हैं।

तो आप सभी की जरूरत क्या अलग है के विवरण में जाने के बिना बताने के लिए है कि क्या दो सरणियों अलग हैं एक सरल तरीका है, तो आप बस सरणी Compare-Object द्वारा वापस की लंबाई की जांच कर सकते हैं:

$areEqual = @(Compare-Object $firstFolder $secondFolder -SyncWindow 0).Length -eq 0 

ध्यान दें कि मैंने परिणामों को हमेशा सरणी में पैकेज करने के लिए PowerShell को कैसे बताया, क्योंकि Compare-Object$null लौटा सकता है जब सरणी में कोई अंतर नहीं होता है।

+0

धन्यवाद, एनरिको। क्या आपका मतलब था, कि यह उनकी सामग्री के बजाय सरणी के नामों की तुलना करता है? – culter

+0

@culter '-eq' ऑपरेटर वास्तव में प्रत्येक सरणी में पहली वस्तु की तुलना करता है। मेरा अद्यतन उत्तर देखें। –

+0

आपके लिए थकाऊ जवाब, एनरिको के लिए धन्यवाद। यह पूरी तरह से काम करता है। लेकिन जैसा कि आपने लिखा है, -ईक ऑपरेटर प्रत्येक सरणी के पहले ऑब्जेक्ट की तुलना करता है, जब मैंने उसी फ़ोल्डर की तुलना की तो यह झूठी क्यों लौटी? – culter

4
आप cmdlet compare-object का उपयोग करें और अगर वहाँ मतभेद या नहीं का मूल्यांकन करने की तुलना में इस तरह के लिए

!