2012-04-12 14 views
6

PowerShell में, if के लिए वाक्य रचना के रूप में तो यह है: इन दोनों के साथ'अगर (टेस्ट-पथ ...) वास्तव में कैसे काम करता है?

write-output (get-date) 

तो:

if (<test1>) 
    {<statement list 1>} 
[elseif (<test2>) 
    {<statement list 2>}] 
[else 
    {<statement list 3>}] 

एक और वाक्य रचना नियम है कि subexpressions के लिए, आप कोष्ठक का उपयोग करने के लिए इस तरह की जरूरत है नियम संयुक्त, मैं उम्मीद करता हूं कि कुछ पथों के परीक्षण को इस तरह के कोष्ठक के दो सेटों के साथ लिखा जाना चाहिए:

if ((Test-Path ...)) { 
    # do something 
} 

बहरहाल, यह भी काम करता है:

if (Test-Path ...) { 
    # do something 
} 

और सिर्फ पूर्णता के लिए के लिए, इस नहीं काम:

if (!Test-Path ...) { 
    # do something 
} 

(यहाँ, आप उपसूचक रैप करने के लिए की आवश्यकता होगी सामान्य रूप से संश्लेषण में)।

क्या कोई यहां सिंटैक्स नियमों को समझा सकता है जो यहां लागू होते हैं और कैसे आता है कि मैं आईएफ परीक्षण का उपयोग केवल एक कोष्ठक के साथ कर सकता हूं? क्या यह कुछ पावरशेल जादू है या क्या मैं बुनियादी वाक्यविन्यास नियमों को गलत समझ रहा हूं?

उत्तर

3

ब्रूस Payette के Windows PowerShell in Action में Appendix C: The PowerShell grammar से C.2.2 का जिक्र करते हुए, हमने:

<ifStatementRule> = 
    'if' '(' <pipelineRule> ')' <statementBlockRule> 
    [ 'elseif' '(' <pipelineRule> ')' <statementBlockRule> ]* 
    [ 'else' <statementBlockRule> ]{0|1} 

यह ( और ) टोकन इंगित करता है if कथन को पहचानने के लिए शाब्दिक वाक्यविन्यास का हिस्सा, और दस्तावेज से <test> दस्तावेज एक पाइपलाइन को संदर्भित करता है जिसे एक बूलियन के लिए हल किया जाएगा।

पाइपलाइन नियमों का पालन, हम पाते हैं:

  • Test-Path ...<UnaryOperatorToken> <propertyOrArrayReferenceRule> के <expressionRule> में
  • !Test-Path ... परिणाम, <name> <parameterArgumentToken> के <cmdletCall> को पार्स करता है, जो विफल रहता है जब cmdlet कॉल सरल संपत्ति या सरणी से मेल नहीं कर सकते हैं नियम, जबकि
  • !(Test-Path ...) एक उप-अभिव्यक्ति के रूप में संश्लेषित cmdlet कॉल से मिलान करने में सक्षम है।

संपादित करें: भी देखें PowerShell 2.0 Language Specification (Roman's answer to another question करने के लिए धन्यवाद)।

3

कोष्ठकों के बाद if एक उपसूचक परिभाषित करते हैं (यदि कोष्ठकों Test-Path चारों ओर की जरूरत थी, तो हम चारों ओर कोष्ठक $num -eq 5 और हर दूसरे अभिव्यक्ति की आवश्यकता होगी) .. अतिरिक्त कोष्ठकों के बाद नहीं ऑपरेटर की आवश्यकता है क्योंकि Test-Path जरूरतों से पहले मूल्यांकन किया जाना इसे अस्वीकार किया जा सकता है। आप बिना किसी कथन के इसे आजमा सकते हैं।

यह काम नहीं करता:

PS> !Test-Path NonExistent.file 

यह करता है काम:

PS> !(Test-Path NonExistent.file) 
+0

इसे आज़माएं: 'यदि सही है'। यह आपको एक * पार्सर * त्रुटि देगा। मैं कोई विशेषज्ञ नहीं हूं लेकिन ऐसा लगता है कि ब्रांड्स वास्तव में एक भाषा का निर्माण करते हैं, न कि उप-अभिव्यक्ति ऑपरेटर। – Borek

+0

@ बोरेक: पावरशेल में मुझे लगता है कि आपको क्या लिखना है यदि $ True – wunth

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