2014-05-13 5 views
6

यह प्रश्न Passing empty arguments to executables using powershell जैसा है लेकिन मैं सवाल और उत्तर दोनों पर विस्तार करना चाहता हूं और "क्यों" बेहतर समझता हूं, क्योंकि यह पावरशेल pitfall की तरह लगता है।पावरशेल कमांड लाइन पर अलग-अलग खाली स्ट्रिंग को क्यों संभालता है?

आप PSCX लोड और echoargs (एक बाहरी कमांड, एक exe फ़ाइल यानी) चलाने आप देख सकते हैं कि रिक्त स्ट्रिंग तर्क को छोड़ दिया जाता है:

PS> echoargs word "two words" "" 123 
Arg 0 is <word> 
Arg 1 is <two words> 
Arg 2 is <123> 

लेकिन अगर आप "सीएमडी भागने" का उपयोग करें (इसी प्रकार यदि कोई लिखता है एक PowerShell से काम रिक्त स्ट्रिंग ठीक से नियंत्रित किया जाता है

PS> echoargs --% word "two words" "" 123 
Arg 0 is <word> 
Arg 1 is <two words> 
Arg 2 is <> 
Arg 3 is <123> 

:

) आप इसे "ठीक से" प्रदर्शित कर सकता हूँ

यह अंतर निम्नलिखित कारणों से मेरे लिए एक बड़ा सौदा लगता है। ऊपर दिखाए गए उदाहरण कमांड लाइन पर एक शाब्दिक खाली स्ट्रिंग का उपयोग करते हैं, इसलिए कम से कम आपको समस्या का संकेत मिलता है। लेकिन परिणाम बिल्कुल वही हैं यदि कोई एक रिक्त स्ट्रिंग युक्त चर का उपयोग करता है। - और किसी भी PowerShell लाइन के बाकी पर निर्माण का उपयोग कर त्याग (%)

  1. कड़ाई से पुलिस सभी चर बाहरी आदेशों को खिलाया जा रहा है, या
  2. सीएमडी भागने का उपयोग करें: एक जिसका मतलब है या तो करना पड़ता है
  3. `"this`" या `"$this`" या `"`"

तरह backquote/दोहरे उद्धरण के साथ एक बाहरी कमांड के लिए हर तर्क बोली ... या बुरा बातें होती होगी!

(@KeithHill ऊपर तो मैं यह पूर्णता के लिए वहाँ जोड़ा तीसरे वैकल्पिक हल बताया। यह शाब्दिक या चर के लिए काम करता है, इसलिए हालांकि बदसूरत, शायद तीन समाधान का सबसे अच्छा विकल्प है।)

तो पावरशेल एक बाहरी कमांड के तर्कों के मुकाबले अलग-अलग फ़ंक्शन में तर्कों को संभालता है - नाटकीय रूप से। क्या यह पावरशेल के व्यवहार में असंगतता है? यदि नहीं, तो क्यों नहीं?


परिशिष्ट

संदर्भ के लिए, PowerShell समारोह शरीर के ऊपर का इस्तेमाल किया है:

function Show-Args() 
{ 
    for ($i = 0; $i -lt $args.length; $i++) 
    { 
     Write-Host ("Arg {0} is <{1}>" -f $i, $args[$i]) 
    } 
} 

और यहाँ है एक echoargs-बराबर सी # में:

class Program 
{ 
    static void Main(string[] args) 
    { 
     for (int i = 0; i < args.Length; i++) 
     { 
      System.Console.WriteLine("Arg {0} is <{1}>", i, args[i]); 
     } 
    } 
} 

उत्तर

2

व्यवहार को "डिजाइन द्वारा" माना जा सकता है (यह मुश्किल है ओयू निश्चित रूप से कार्यान्वयन और परीक्षण के आधार पर), लेकिन मुझे नहीं लगता कि इस मामले को बहुत अधिक विचार दिया गया था और आप उत्कृष्ट अंक लाएंगे।

व्यक्तिगत रूप से मुझे लगता है कि आप सही हैं और पावरशेल असंगत है। एक बदलाव को सुसंगत होने पर विचार करना उचित है, हालांकि मौजूदा स्क्रिप्ट को तोड़ने का कुछ जोखिम है।

+1

हाँ, अनुप्रयोगों के लिए खाली स्ट्रिंग तर्कों का संचालन प्रतीत होता है, उम, गलत। ;-) निष्पक्ष होने के लिए, यह समस्या कम से कम V2 के रूप में मौजूद है। –

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