2012-03-16 12 views
13

पढ़ें मैं एक सी # अनुप्रयोग में उपयोगकर्ता तर्क पढ़ने की कोशिश कर रहा हूं। मुझे पता है कि उन्हेंकमांड लाइन स्विच

string[] args = Environment.GetCommandLineArgs(); 

साथ स्थिति के आधार पर पढ़ने के लिए, लेकिन मैं इस तरह के रूप

app.exe /f /d:foo 

मैं वास्तव में यह कर के बारे में कोई जानकारी प्राप्त करने के लिए संघर्ष कर रहा हूँ स्विच से उन्हें पढ़ने के लिए करना चाहते हैं .. ।

+0

दुर्भाग्यवश, सी # आपको स्ट्रिंग के रूप में कमांड लाइन तर्कों की सूची की तुलना में अधिक जानकारी नहीं देता है। इसमें .exe नाम भी शामिल नहीं है। –

+0

यह शुरू करने के लिए एक अच्छी जगह की तरह दिखता है: [http://msdn.microsoft.com/en-us/library/acy3edy3(v=vs.80).aspx](http://msdn.microsoft.com/en -us/लाइब्रेरी/acy3edy3% 28v = vs.80% 29.aspx) –

उत्तर

21

आप क्यों नहीं बस पारित कर दिया तर्कों और अधिनियम उन पर आधारित की सरणी पार्स नहीं है, इस

की तरह शुरू हो सकता है समस्या आप अगले आइटम की जरूरत है आप स्विच आप देख रहे हैं हिट के बाद है -
foreach (string arg in args) 
{ 
    switch (arg.Substring(0, 2).ToUpper()) 
    { 
     case "/F": 
      // process argument... 
      break; 
     case "/Z": 
      // process arg... 
      break; 
     case "/D": 
      paramD = arg.Substring(3); 
      break; 
     default: 
      // do other stuff... 
      break; 
    } 
} 
4
void Main(string[] args) 
{ 
    foreach(var arg in args) 
    { 
     // process each arg if needed, i.e., 
     // remove '-', '/', uppercase, whatever 
     switch(arg) 
     { 
      case "blah": 
      // ... 
     } 
    } 
} 

पुस्तकालय इस उद्देश्य के जो पूरी प्रक्रिया एक बहुत आसान बनाने के लिए मौजूद है, लेकिन अगर यह एक एक बंद अनुप्रयोग है यह इसके लायक नहीं हो सकता है। इस पर निर्भर करता है कि आपके कमांड लाइन तर्क कितने जटिल हैं।

+2

@MTeck - [Mono.Options] (https://github.com/mono/mono/blob/master/mcs/class/Mono.Options /Mono.Options/Options.cs) ऐसी लाइब्रेरी का एक शानदार हल्का उदाहरण है। –

0

ठीक है, मूल रूप से आप पहले से ही कर चुके हैं। प्रक्रिया करें कि string[] सरणी आपको ढांचे से मिलती है और आपने किया है। आप जो भी मांग रहे हैं उसे प्राप्त करने के लिए कोई अंतर्निहित तरीका नहीं है। C# CLI:

3 पार्टियों समाधान की तरह मैं एक खुला स्रोत नेट कमांड लाइन पुस्तकालय है कि आपकी आवश्यकताओं के अनुरूप कर सकते हैं के लेखक हूँ

C#/.NET Command Line Arguments Parser

0

पर देख सकते हैं।

आप अन्य सुझावों के लिए this प्रश्न भी पढ़ना चाहेंगे।

0

मुझे विश्वास है कि आपको अपना खुद का कार्यान्वयन करना होगा। इकाई परीक्षण लेखन नई विधि का मूल्यांकन करने के बाद, मैं की तर्ज पर सोच ...

foreach (string arg in args) 
{ 
    flagF = flagF || arg == "/f"; // assuming F is boolean 
    flagD = flagD ?? (arg.Substring(0,3) =="/d:" ? arg.Substring(3) : null); 
} 
+0

फ्लैगएफ को गलत में प्रारंभ किया जाना चाहिए, फिर 'flagF | = arg == "/ f";' ताकि एक बार यह सच हो जाए, यह सच रहता है। जिस तरह से आपके पास अब है, फ्लैगएफ हमेशा सत्य है। –

+0

फिर फ्लैग डी के लिए, आपके '() 'में 2 से 3 को' '/ d:' के रूप में बदलें, '' 3 वर्ण हैं। –

+0

@ChuckSavage धन्यवाद; कोड को वैसे भी विचार मिला, भले ही जल्दी से लिखा गया हो :-)। अभी सुधार रहा है। – sfuqua

2

के बारे में क्या,

// first is exe of executing program 
string[] args = Environment.CommandLine.Split('/').Skip(1).ToArray(); 
foreach (string arg in args) 
{ 
    string value = arg.Trim(); 
    switch (value) 
    { 
     case "f": 
      //... 
      continue; 
    } 
    if (value.StartsWith("d:")) 
    { 
     value = value.Substring(2); 
     // ... 
     continue; 
    } 
} 
3

मैं जवाब की एक जोड़ी आर्ग स्ट्रिंग संग्रह के माध्यम से लूप कि देखा है । मैंने अगली वस्तु प्राप्त करने के लिए संग्रह की सरणी अनुक्रमणिका का उपयोग किया।

मेरे नमूने में मैं एक सर्वर और एक पोर्ट/एस और/पी की तलाश में हूं। मुझे उम्मीद है कि यह किसी की मदद करता है:

 var server = string.Empty; 
     var port = string.Empty; 

     for(var x = 0; x < args.Count(); x++) 
     { 
      switch (args[x].Trim().ToUpper()) 
      { 
       case "/S": 
        server = args[x + 1]; 
        break; 
       case "/P": 
        port = args[x + 1]; 
        break;           
      } 
     } 
+0

आप अगले तर्क पर मान सेट करने के बाद शायद x को अग्रिम करना चाहते हैं।अन्यथा, आप उस तर्क को अनिवार्य रूप से संसाधित करेंगे: सर्वर = तर्क [++ x]; –