2008-09-29 16 views
17

मुझे पावरशेल के साथ कुछ अजीब व्यवहार दिखाई दे रहा है, ऐसा लगता है कि कस्टम फ़ंक्शंस को "कैंथेसिस रैपर" की आवश्यकता हो सकती है ताकि आप उनका अनुमान लगा सकें। एक सरल PowerShell समारोह को देखते हुए:पावरशेल फ़ंक्शन रिटर्न व्यवहार

function Return-True { return $true } 

और फिर कुछ नमूना कोड में यह आह्वान करने के लिए:

PS C:\> Return-True 
True 
PS C:\> Return-True -eq $false 
True 
PS C:\> (Return-True) -eq $false 
False 

विचार? टिप्पणियाँ?

उत्तर

34

जब पावरशेल टोकन Return-True देखता है तो यह इसे कमांड के रूप में और कथन का मूल्यांकन या अंत तक पहचानता है, बाकी सब कुछ एक तर्क है जो फ़ंक्शन Return-True पर पास किया जाता है।

आप कार्रवाई में देख सकते हैं यदि आप कार्य करें:

PS > function Return-True { "The arguments are: $args"; return $true } 
PS > Return-True -eq $false 
The arguments are: -eq False 
True 

है यही कारण है कि निम्नलिखित वापसी के सभी 'यह सच है', क्योंकि तुम सब देख रहे हैं विभिन्न तर्क के साथ Return-True बुला का परिणाम है:

PS > Return-True -eq $false 
True 
PS > Return-True -ne $false 
True 
PS > Return-True -eq $true 
True 
PS > Return-True -ne $true 
True 

(Return-True) का उपयोग करके PowerShell को फ़ंक्शन का मूल्यांकन करने के लिए मजबूर करता है (बिना तर्क के)।

5

दूसरी पंक्ति एक बूलियन मूल्यांकन नहीं कर रही है। देखो कि क्या होता है यदि आप तारों के साथ एक ही काम करते हैं।

PS C:\> function Return-True { return "True string" } 
PS C:\> Return-True 
True string 
PS C:\> Return-True -eq "False string" 
True string 
PS C:\> (Return-True) -eq "False string" 
False 

दूसरी पंक्ति बस कार्य के मूल्य को वापस कर रही है, और तुलना नहीं कर रही है। मुझे यकीन नहीं है कि यह व्यवहार क्यों हो रहा है, लेकिन यह व्यवहार को "ट्रू" और "गलत" तारों में परिवर्तित करने वाले बुलियन मानों का उपयोग करते समय देखना आसान बनाता है।

4

आप PowerShell V2 के संपादक का उपयोग करते हैं, तो आप, देखना होगा कि पहले उदाहरण में -eq नीले रंग की है, क्योंकि यह एक तर्क और दूसरे उदाहरण में -eq है ग्रे है, क्योंकि यह एक ऑपरेटर

भी है वी 2 में, आप तर्क के बारे में सख्त हो सकते हैं, सीएमडीलेट बाइंडिंग और पैरा

function Return-True 
{ 
    [CmdletBinding()] 
    param() 
    return $true 
} 
Return-True -eq $false 

Return-True -eq $false 
Return-True : A parameter cannot be found that matches parameter name 'eq'. 
At line:7 char:16 
+ Return-True -eq <<<< $false 
    + CategoryInfo   : InvalidArgument: (:) [Return-True], ParameterBindingException 
    + FullyQualifiedErrorId : NamedParameterNotFound,Return-True 
+0

मुझे सीएमडीलेट बाइंडिंग के बारे में पता नहीं था, धन्यवाद – neontapir

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