पावरशेल में, सरणी को इंगित करने वाले चर का मूल्यांकन एरे की सामग्री को समझाकर अभिव्यक्तियों में किया जाता है।
उदाहरण के लिए इस अभिव्यक्ति:
$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
लौटा सकता है जब सरणी में कोई अंतर नहीं होता है।
धन्यवाद, एनरिको। क्या आपका मतलब था, कि यह उनकी सामग्री के बजाय सरणी के नामों की तुलना करता है? – culter
@culter '-eq' ऑपरेटर वास्तव में प्रत्येक सरणी में पहली वस्तु की तुलना करता है। मेरा अद्यतन उत्तर देखें। –
आपके लिए थकाऊ जवाब, एनरिको के लिए धन्यवाद। यह पूरी तरह से काम करता है। लेकिन जैसा कि आपने लिखा है, -ईक ऑपरेटर प्रत्येक सरणी के पहले ऑब्जेक्ट की तुलना करता है, जब मैंने उसी फ़ोल्डर की तुलना की तो यह झूठी क्यों लौटी? – culter