2009-03-17 23 views
16

में कमांड लाइन तर्क मैं एक सी # आवेदन करने के लिए कमांड लाइन तर्क पारित करने के लिए कोशिश कर रहा हूँ, लेकिन फिर भी अगर मैं तर्क को " " जोड़ने मैं समस्या यहपासिंग सी #

"C:\Documents and Settings\All Users\Start Menu\Programs\App name" 

की तरह कुछ गुजर की है।

यहाँ मेरी कोड है:

public ObjectModel(String[] args) 
    { 
     if (args.Length == 0) return; //no command line arg. 
     //System.Windows.Forms.MessageBox.Show(args.Length.ToString()); 
     //System.Windows.Forms.MessageBox.Show(args[0]); 
     //System.Windows.Forms.MessageBox.Show(args[1]); 
     //System.Windows.Forms.MessageBox.Show(args[2]); 
     //System.Windows.Forms.MessageBox.Show(args[3]); 
     if (args.Length == 3) 
     { 
      try 
      { 
       RemoveInstalledFolder(args[0]); 
       RemoveUserAccount(args[1]); 
       RemoveShortCutFolder(args[2]); 
       RemoveRegistryEntry(); 
      } 
      catch (Exception e) 
      { 
      } 
     } 
     } 

और यहाँ मैं क्या कर रहा हूँ गुजर रहा है:

C:\WINDOWS\Uninstaller.exe "C:\Program Files\Application name\" "username" "C:\Documents and Settings\All Users\Start Menu\Programs\application name" 

समस्या मैं पहले और दूसरे आर्ग सही ढंग से है, लेकिन पिछले एक प्राप्त कर सकते है यह C:\Documents के रूप में मिलता है।

कोई मदद?

+1

क्या आप से शुरू करने के लिए कोशिश कर रहे हैं:

कि इस समस्या को ठीक करने के लिए, आप इस के साथ StartToken मामले की जगह ले सकता?कमांड लाइन या कोई अन्य प्रोग्राम? यदि उत्तरार्द्ध - भाषा क्या है? – sharptooth

+0

क्या होता है जब आप इस तरह के तर्क को अपने आवेदन में पास करते हैं? – Draco

+0

क्या आप अपना कोड चिपका सकते हैं जो तर्क तक पहुंचने की कोशिश करता है और आप जिस पूर्ण कमांड लाइन टाइप कर रहे हैं, जैसे c: \ myapp.exe "c: \ document \ appname" –

उत्तर

25

मैं बस एक चेक चलाया और समस्या की पुष्टि की। यह मुझे आश्चर्यचकित कर दिया, लेकिन यह पहली तर्क में आखिरी \ है।

"C:\Program Files\Application name\" <== remove the last '\' 

इसे और स्पष्टीकरण की आवश्यकता है, क्या किसी के पास कोई विचार है? मैं इसे एक बग कहने के इच्छुक हूं।


भाग 2, मैं भाग गया कुछ और परीक्षण और

"X:\\aa aa\\" "X:\\aa aa\" next 

हो जाता है

X:\\aa aa\ 
X:\\aa aa" next 

एक छोटी सी गूगल कार्रवाई एक blog by Jon Galloway से कुछ जानकारी देता है, बुनियादी नियम हैं:

  • बैकस्लैश es है केप चरित्र
  • हमेशा उद्धरण से बचें
  • केवल उद्धरण से पहले जब वे बैकस्लैश से बचें।
+0

यह पहले तर्क से \ को हटाकर तय किया गया है। बहुत धन्यवाद –

+0

यदि आप पिछली बैकस्लैश चाहते हैं, तो आप एक और जोड़ सकते हैं। यही है, "abd \ \ "कमांड लाइन पर" abd \ "के तर्क में परिणाम। –

+0

@Jim: हाँ, उदाहरण का पहला भाग दर्शाता है कि –

0

समस्या क्या है? है कमांड लाइन तर्क युक्त एक सरणी

void Main(string[] args) 

फिर आर्ग: वैसे भी यहाँ कुछ सामान्य सलाह है:

यकीन है कि (Program.cs में) अपने मुख्य विधि बनाएं के रूप में परिभाषित किया गया है।

5

इयान केम्प के जवाब जोड़ने के लिए

आप विधानसभा "myProg.exe" कहा जाता है और आप स्ट्रिंग में पारित "C: \ दस्तावेज़ और सेटिंग्स \ सभी उपयोगकर्ता \ प्रारंभ मेनू \ कार्यक्रम \ ऐप्लिकेशन का नाम" लिंक तो

C:\>myprog.exe "C:\Documents and Settings\All Users\Start Menu\Programs\App name" 

स्ट्रिंग "C: \ दस्तावेज़ और सेटिंग्स \ सभी उपयोगकर्ता \ प्रारंभ मेनू \ कार्यक्रम \ ऐप्लिकेशन का नाम"

आर्ग में हो जाएगा [0]।

+3

हालांकि: हाथ में मामला यह है कि यदि आप 'myprog.exe "c: \ one \" "दो" "तीन" कहते हैं, तो तर्क [0] 'c: \ one" दो तीन' होगा। इसे आज़माएं आउट! –

1

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

होना चाहिए की तरह कुछ:

C: \> myprog.exe "C: \\ दस्तावेज़ और सेटिंग्स \\ सभी उपयोगकर्ताओं \\ प्रारंभ मेनू \\ कार्यक्रमों \\ ऐप्लिकेशन का नाम"

+0

पहले तर्क में आखिरी बैकस्लैश _is_। मैंने जांच की है। –

+1

लेकिन डबल \\ इनपुट पर बकवास हैं, वे केवल सी # स्रोत में उपयोगी हैं। –

+0

लेकिन वे काम करते हैं :) इसे आजमाएं – Aamir

1

मैंने हाल ही में एक ही परेशान मुद्दा देखा, और कमांड लाइन तर्कों को स्वयं को बाहर निकालने के लिए एक पार्सर लिखने का फैसला किया।

नोट: मुद्दा यह है कि .NET कमांडलाइन तर्क स्थिर शून्य मुख्य (स्ट्रिंग [] args) फ़ंक्शन से निकलता है \ "और \\। यह डिज़ाइन द्वारा है, क्योंकि आप वास्तव में एक तर्क पारित करना चाहते हैं एक बोली या उस में बैकस्लैश है एक उदाहरण:।

कहते हैं कि तुम एक भी तर्क के रूप में निम्नलिखित पारित करने के लिए चाहता था:

-msg: "तुम कहाँ पर" अरे,

उदाहरण के लिए

SampleApp -msg: "अरे, \" तुम कहाँ पर \ ""

कैसे डिफ़ॉल्ट व्यवहार के साथ भेजने के लिए होगा?।

यदि आपको किसी के लिए उद्धरण या बैकस्लाश से बचने का कोई कारण नहीं दिखता है, तो आप नीचे दिए गए कमांड लाइन को पार्स करने के लिए अपने स्वयं के पार्सर का उपयोग कर सकते हैं।

आईई। [कार्यक्रम] .exe "C: \ test \": \ test "ARG1 ARG2

आप उम्मीद करेंगे क्या है आर्ग [0] = c ARG1 ARG2

एक args [0] = ग होगा: \ test \ और फिर args [1] = ARG1 और आर्ग [2] = aRG2।

नीचे समारोह इस सरलीकृत व्यवहार के साथ एक सूची में तर्क पार्स करता है।

ध्यान दें, आर्ग [0] कार्यक्रम है नीचे दिए गए कोड का उपयोग करके नाम। (परिणामस्वरूप सूची को स्ट्रिंग सरणी में कनवर्ट करने के लिए आप List.ToArray() को कॉल करते हैं।)

protected enum enumParseState : int { StartToken, InQuote, InToken }; 
public static List<String> ManuallyParseCommandLine() 
{ 
    String CommandLineArgs = Environment.CommandLine.ToString(); 

    Console.WriteLine("Command entered: " + CommandLineArgs); 

    List<String> listArgs = new List<String>(); 

    Regex rWhiteSpace = new Regex("[\\s]"); 
    StringBuilder token = new StringBuilder(); 
    enumParseState eps = enumParseState.StartToken; 

    for (int i = 0; i < CommandLineArgs.Length; i++) 
    { 
     char c = CommandLineArgs[i]; 
    // Console.WriteLine(c.ToString() + ", " + eps); 
     //Looking for beginning of next token 
     if (eps == enumParseState.StartToken) 
     { 
      if (rWhiteSpace.IsMatch(c.ToString())) 
      { 
       //Skip whitespace 
      } 
      else 
      { 
       token.Append(c); 
       eps = enumParseState.InToken; 
      } 


     } 
     else if (eps == enumParseState.InToken) 
     { 
      if (rWhiteSpace.IsMatch(c.ToString())) 
      { 
       Console.WriteLine("Token: [" + token.ToString() + "]"); 
       listArgs.Add(token.ToString().Trim()); 
       eps = enumParseState.StartToken; 

       //Start new token. 
       token.Remove(0, token.Length); 
      } 
      else if (c == '"') 
      { 
       // token.Append(c); 
       eps = enumParseState.InQuote; 
      } 
      else 
      { 
       token.Append(c); 
       eps = enumParseState.InToken; 
      } 

     } 
      //When in a quote, white space is included in the token 
     else if (eps == enumParseState.InQuote) 
     { 
      if (c == '"') 
      { 
       // token.Append(c); 
       eps = enumParseState.InToken; 
      } 
      else 
      { 
       token.Append(c); 
       eps = enumParseState.InQuote; 
      } 

     } 


    } 
    if (token.ToString() != "") 
    { 
     listArgs.Add(token.ToString()); 
     Console.WriteLine("Final Token: " + token.ToString()); 
    } 
    return listArgs; 
} 
+1

ऐसा लगता है कि पहला अक्षर उद्धरण – Jamezor

+0

@Jamezor - आप 'री राइट। सुधार के लिए मेरा जवाब देखें। – guesser

1

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

  if (eps == enumParseState.StartToken) 
      { 
       if (rWhiteSpace.IsMatch(c.ToString())) 
       { 
        //Skip whitespace 
       } 
       else if (c == '"') 
       { 
        eps = enumParseState.InQuote; 
       } 
       else 
       { 
        token.Append(c); 
        eps = enumParseState.InToken; 
       } 
      } 
संबंधित मुद्दे