2017-04-12 9 views
5

मैं कंसोल एप्लिकेशन के लिए तर्क के रूप में कई पथ पारित करने की कोशिश कर रहा हूं लेकिन मुझे "पथ में अवैध वर्ण" त्रुटि मिल रही है। ऐसा प्रतीत होता है कि कुछ भागने वाले डबल-कोट के लिए तर्क "C:\test\" के अंतिम दो वर्णों को गलत समझ रहा है।सी # आंशिक रूप से कमांड लाइन तर्कों से बचने के लिए क्यों दिखाई देता है?

उदाहरण के लिए, अगर मैं तो जैसे सी # में एक नया खाली सांत्वना आवेदन बनाएँ: प्रोजेक्ट गुण के तहत

static void Main(string[] args) 
{ 
    Console.WriteLine(args[0]); 
    Console.ReadLine(); 
} 

और, -> डीबग मैं बहुत की तरह एक कमांड लाइन तर्क जोड़ें:

Project properties showing CLI Argument: "C:\test\"

फिर मेरे उत्पादन इस तरह दिखता है:

Command prompt showing output: C:\test"

यदि मूल्य का मूल्यांकन किया जा रहा है/अन-बच निकला है, तो \t क्यों टैब नहीं बनता है?

यदि मूल्य का मूल्यांकन नहीं किया जा रहा है/अन-बच निकला है, तो \" क्यों डबल-कोट बनता है?

(नोट: मैं जानता हूँ कि मैं, इस पर काम कर सकते हैं उदाहरण के लिए, बैकस्लैश आदि मैं मदद के लिए पूछ रहा हूँ समझने अनुगामी ट्रिमिंग क्यों तर्क आंशिक रूप से का मूल्यांकन होना दिखाई)

+0

संबंधित http://stackoverflow.com/questions/17168961/how-do-i-escape-in-verbatim-string और http://stackoverflow.com/questions/15932279/escaping-command-line-arguments- इन-सी-तेज-के-यूआरएल-और-स्थानीय-और-नेटवर्क-पथ –

उत्तर

5

बेशक इस से संबंधित है माइक्रोसॉफ्ट सी कमांड लाइन तर्क, लेकिन मैंने परीक्षण किया है कि इन नियमों का भी सी # के लिए पालन किया जाता है। कमांड लाइन तर्क को आवेदन में पारित होने से पहले string args[] सरणी में विभाजित किया गया है।

Parsing C Command-Line Arguments

  • तर्क सफेद स्थान है, जो या तो एक रिक्ति या एक टैब है द्वारा सीमांकित कर रहे हैं।

  • डबल उद्धरण चिह्नों से घिरा हुआ एक स्ट्रिंग को एक एकल तर्क के रूप में व्याख्या किया जाता है, भले ही सफेद जगह के भीतर निहित हो। एक उद्धृत स्ट्रिंग को तर्क में एम्बेड किया जा सकता है। ध्यान दें कि देखभाल (^) को बचने वाले चरित्र या डिलीमीटर के रूप में पहचाना नहीं जाता है।

  • बैकस्लैश से पहले एक डबल उद्धरण चिह्न, \ ", को शाब्दिक डबल उद्धरण चिह्न (") के रूप में व्याख्या किया जाता है।

  • बैकस्लाश का शाब्दिक अर्थ है, जब तक कि वे तुरंत दोहरा उद्धरण चिह्न से पहले न हों।

  • यदि बैकस्लैश की एक संख्या भी दोहरा उद्धरण चिह्न के बाद होती है, तो बैकस्लैश (\) की प्रत्येक जोड़ी के लिए argv सरणी में एक बैकस्लैश() रखा जाता है, और डबल उद्धरण चिह्न (") का अर्थ है एक स्ट्रिंग सीमांकक।

  • बैकस्लैश विषम संख्या में एक दोहरा उद्धरण चिह्न द्वारा पीछा किया जाता है, तो एक बैकस्लैश() बैकस्लैश की प्रत्येक जोड़ी (\) और दोहरा उद्धरण चिह्न के लिए argv सरणी में रखा गया है के रूप में व्याख्या की है शेष बैकस्लैश द्वारा एक एस्केप अनुक्रम, जिसके कारण एक शाब्दिक डबल उद्धरण चिह्न (") को argv में रखा जाना है।

ये नियम आपके द्वारा देखे जा रहे परिणामों से सहमत हैं।

static void Main(string[] args) 
{ 
    foreach (string s in args) 
    { 
     Console.WriteLine(s); 
    } 
    Console.ReadLine(); 
} 
निम्नलिखित आदेश पंक्ति तर्क के साथ

:

arg1 "arg2 arg3" arg4\" "arg5\"" arg6\\\" 

आउटपुट:

arg1 
arg2 arg3 
arg4" 
arg5" 
arg6\" 

कारण अपने इनपुट तर्क

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

+0

इसके लिए धन्यवाद। मुझे आश्चर्य है कि पागलपन ने "नियम" के उस सेट का नेतृत्व किया, और लोगों को कैसे पास फ़ोल्डर नामों को संभालने की उम्मीद है ... –

+1

@AlexMcMillan धन्यवाद किसी ने उन्हें लिखा है। – khargoosh

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