2012-10-11 14 views
6

कृपया मुझे बताएं कि मुझे यहां मेरे कोड में एक सूक्ष्म गलती मिली है और यह वास्तव में पावरहेल संचालित नहीं है।पावरहेल स्विच स्ट्रिंग में शून्य के बराबर खाली स्ट्रिंग का इलाज करता है लेकिन बयान

$in = "" 

if ($in -ne $null) 
{ 
    switch ($in) 
    { 
     $null { echo "This is impossible" } 
     default { echo "out here!" } 
    } 
} 

सभी अच्छे, ईमानदार तर्क का कहना है कि इस स्क्रिप्ट का प्रिंट आउट कभी नहीं करना चाहिए "यह असंभव है"। लेकिन ऐसा होता है, अगर $ एक खाली स्ट्रिंग है। तो पावरहेल में यह दिखाई देगा कि एक खाली स्ट्रिंग और null स्ट्रिंग को समकक्ष switch कथन में माना जाता है लेकिन if कथन में नहीं। यह है इसलिए उलझन में है और मुख्य कारणों में से एक है जो कई लोग पावरहेल का उपयोग करने से दूर रहते हैं।

क्या कोई मुझे इस बारे में बता सकता है कि ऐसा क्यों है? क्या किसी को पता है कि दृश्य वास्तव में दृश्यों के पीछे क्या कर रहा है? यह निश्चित रूप से एक सीधी तुलना नहीं कर रहा है।

+0

यहाँ देखें - http://rkeithhill.wordpress.com/2007/01/06/checking-for-a-null-or-empty-string/ –

+0

आप की जरूरत कभी नहीं करना चाहिए 'जाँच switch' नल के लिए। मेरे वीबी.NET कोड में कभी नहीं था। – Neolisk

उत्तर

8

PowerShell में ऑटो जादुई रिक्त स्ट्रिंग पर एक $ अशक्त डाले। नतीजतन, एक .NET एपीआई कॉल पर $ null का उपयोग करते समय, पावरहेल वास्तव में इसे एक खाली स्ट्रिंग पर रखता है। एपीआई कॉल में वास्तविक शून्य मान पास करने के लिए, [NullString] :: इसके बजाय वैल्यू का उपयोग करें।

+0

यह केवल तभी सही है जब आप एक [स्ट्रिंग] मान पर $ null को सहभागिता करते हैं। एक स्पष्ट स्ट्रिंग-टाइप पैरामीटर के साथ फ़ंक्शन को कॉल करते समय यह मजबूती स्पष्ट रूप से होती है। – Timbo

+3

यह भी ध्यान दें कि '[NullString] :: Value -eq $ null' झूठा रिटर्न देता है। आपको स्ट्रिंग की तुलना '[NullString] :: Value' से करने की आवश्यकता होगी ... जो इसे अक्सर अव्यवहारिक बनाता है। स्ट्रिंग तुलना के लिए '[स्ट्रिंग] :: IsNullOrEmpty() 'और' [string] :: IsNullOrWhiteSpace() 'का उपयोग करना आसान है, लेकिन इसका अर्थ है' '' एक शून्य स्ट्रिंग है। यदि आप एसक्यूएल के साथ काम कर रहे हैं, तो यह जीवन को जटिल बना सकता है, खासतौर से क्योंकि इसके लिए आपको अक्सर '[System.DBNull] :: Value' का उपयोग करने की आवश्यकता होगी, जो '$ null' के बराबर नहीं है और बराबर नहीं है '[NullString] :: मान'। –

+0

यह शानदार है - मैंने एक कक्षा के साथ घंटों बिताए हैं जो एक नल स्ट्रिंग के बजाय खाली स्ट्रिंग को आउटपुट करके कन्वर्ट टॉ-जेसन को खराब कर रहा था। –

5

मुझे लगता है कि पावरहेल 2.0 की एक बग है (यहां MSFT Connect पर कुछ जानकारी है)।

मैं कह सकता हूँ कि वी 3.0 आप कोड वापसी out here!

+0

यह सही है - ऐसा लगता है कि यह v2 में एक बग था। – Richiban

0

निम्नलिखित कथन बताते हैं कि $null स्विच कथन में खाली स्ट्रिंग के बराबर नहीं है।

$a=""; switch ($a){$null {"null"} "" {"empty string"}} 

$a=$null; switch ($a){$null {"null"} "" {"empty string"}} 
+0

आश्चर्यजनक रूप से, आपके कोड का दूसरा ब्लॉक स्विच स्टेटमेंट के _two शाखा_ निष्पादित करता है ... यह दोनों "शून्य" और "खाली स्ट्रिंग" प्रिंट करता है! – Richiban

+0

इतना आश्चर्यजनक नहीं - कोई ब्रेक स्टेटमेंट नहीं है, इसलिए अगले मामले में निष्पादन आता है। – Zastai

संबंधित मुद्दे