2012-01-23 17 views
6

निम्नलिखित powershell स्क्रिप्टइसे ब्रैकेट की एक अतिरिक्त जोड़ी की आवश्यकता क्यों है?

"one","two","three" | % { "$(($l++)): $_" } 

 
1: one 
2: two 
3: three 

प्रिंट होगा हालांकि, के बाद चारों ओर $l++

"one","two","three" | % { "$($l++): $_" } 

ब्रैकेट को दूर यह प्रिंट होगा

 
: one 
: two 
: three 
+0

ओह लड़का आपको समुदाय इस पर जा रहा है! :-) –

उत्तर

12

ऐसा इसलिए है क्योंकि $l++शून्ययोग्य कथन है। शक्तियों में कुछ प्रकार के अभिव्यक्तियों, जब कथन के रूप में उपयोग किया जाता है, प्रदर्शित नहीं होते हैं। शून्ययोग्य बयानों में असाइनमेंट और वृद्धि/कमी ऑपरेटर शामिल हैं। जब वे अभिव्यक्ति में उपयोग किए जाते हैं, तो वे एक मान वापस करते हैं, लेकिन जब उन्हें स्टैंडअलोन कथन के रूप में उपयोग किया जाता है, तो वे कोई मूल्य नहीं लौटाते हैं। यह बहुत अच्छी तरह ब्रूस Payette द्वारा कार्रवाई में विंडोज PowerShell में समझाया गया है:

वेतन वृद्धि और घटती ऑपरेटरों लगभग PowerShell में शामिल नहीं थे क्योंकि वे एक समस्या की शुरुआत की। सी और सी # जैसी भाषाओं में, जब आप इन ऑपरेटरों में से एक कथन के रूप में उपयोग करते हैं: $ a ++ कुछ भी प्रदर्शित नहीं होता है। ऐसा इसलिए है क्योंकि सी और सी # में बयान मूल्य वापस नहीं करते हैं। पावरशेल में, हालांकि, सभी बयान एक मूल्य लौटाते हैं। इससे भ्रम पैदा हुआ। लोग इस तरह स्क्रिप्ट लिखने होगा:

$sum=0 
$i=0 
while ($i -lt 10) { $sum += $i; $i++ } 
$sum 

और के माध्यम से 1 10 दिखाया गया संख्या देख कर हैरान हो। ऐसा इसलिए था क्योंकि $ ++ ने एक मान वापस कर दिया और पावरशेल प्रत्येक कथन के परिणाम प्रदर्शित कर रहा था। यह इतना भ्रमित था कि हमने लगभग इन ऑपरेटरों को भाषा से हटा दिया। फिर हम एक शून्ययोग्य कथन के विचार पर हिट करते हैं। असल में, इसका मतलब है कि अभिव्यक्तियों के कुछ प्रकार, जब कथन के रूप में उपयोग किए जाते हैं, प्रदर्शित नहीं होते हैं। शून्ययोग्य बयान में असाइनमेंट और वृद्धि/कमी ऑपरेटर शामिल हैं। जब उन्हें अभिव्यक्ति में उपयोग किया जाता है, तो वे एक मान वापस करते हैं, लेकिन जब उन्हें स्टैंडअलोन कथन के रूप में उपयोग किया जाता है, तो वे कोई मूल्य नहीं लौटाते हैं। दोबारा, यह उन विवरणों में से एक है जो इस बात को प्रभावित नहीं करेंगे कि आप पावरशेल का उपयोग कैसे करते हैं, इसके अलावा आप इसे काम करने के अलावा अन्य काम करते हैं। (स्रोत: एक्शन में विंडोज पावरहेल)

+0

मुझे लगता है कि बहुत सारे जवाब का अच्छा जवाब :) – manojlds

+0

दीप डाइव पर, ब्रूस ने यह भी बताया कि अगर ऐसा होता है तो बयान और लूप काम करते हैं तो यह होता है: अगर ($ foo = get-randomTrueFalse) {"यह चलाया जा सकता है ! "} – JasonMArcher

0

मुझे लगता है कि दो कार्यों यह करने की जरूरत है देखते हैं:

  1. निष्पादित $l++ (चर बढ़ाने के) जो भीतरी कोष्ठक
  2. पुनः प्राप्त $l के मूल्य जो बाहरी कोष्ठक में क्या होता है पर होता है।

    $l = 0 
    "$($l++ ; $l)" 
    

    आउटपुट: 1 जहां

    $l = 0 
    "$($l++)" 
    

    नहीं करता है उत्पादन कुछ भी

यहाँ इस का एक उदाहरण है।

आउटपुट प्राप्त करने के लिए मुझे उप-अभिव्यक्ति के अंदर दो विवरणों की आवश्यकता है। अन्यथा केवल एक चीज होती है कि $l बढ़ी है लेकिन इसका मूल्य पुनर्प्राप्त नहीं किया गया है।

4

मेरा मानना ​​है कि यह PowerShell टीम द्वारा किए गए डिज़ाइन निर्णय के लिए PowerShell वापसी मूल्यों के कारण आश्चर्य से बचने के लिए किया गया था। कई सी/सी # लोग निम्नलिखित फ़ंक्शन को केवल आउटपुट 1 (0,1) तक उम्मीद करेंगे।

function foo { 
    $i = 0 
    $i++ 
    $i 
} 

तो बयान रूप $i++ $ i का नहीं उत्पादन मूल्य से पहले ही वृद्धि की जाती है करता है। हो जाएगा ताकि उत्पादन @ (0,1) आपको लगता है कि व्यवहार चाहते हैं, PowerShell आप वेतन वृद्धि (या घटती) बयान सीधे एक अभिव्यक्ति उदा .:

function foo { 
    $i = 0 
    ($i++) 
    $i 
} 

अंदर डाल कर उस व्यवहार प्राप्त करने के लिए अनुमति देता है।

ब्रूस पेटेट Windows PowerShell in Action 2nd Edition के अध्याय 5 में इस पर चर्चा करता है। वृद्धि और कमी ऑपरेटर "शून्ययोग्य बयान" हैं। पुस्तक से उद्धरण:

असल में, इसका मतलब है कि कथन के रूप में उपयोग किए जाने वाले कुछ प्रकार के भाव प्रदर्शित नहीं होते हैं। शून्ययोग्य बयानों में असाइनमेंट कथन और वृद्धि/कमी ऑपरेटर शामिल हैं। जब अभिव्यक्ति में वृद्धि और कमी का उपयोग किया जाता है, तो वे एक मान वापस करते हैं, लेकिन जब वे स्टैंडअलोन कथन के रूप में उपयोग किए जाते हैं, तो वे कोई मूल्य नहीं लौटाते हैं।

1

है ऐसा इसलिए है क्योंकि $l++ कुछ भी वापस नहीं करता है, ताकि कोई भ्रम है जब आप पाइपलाइन लिए लौट रहे हैं

$l = 0 
$l++ #nothing 
$l #gives 1 
$l++ #nothing 
($l++) #gives 2 

यह किया जाता है। प्रभावी रूप से,

$l++$l = $l+ 1 है, इसलिए यह कुछ भी वापस नहीं करता है।

आप जो देखना चाहते हैं वह $l = $l + 1; $l है, यही कारण है कि आपको ($l++) करना है।

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