मैंने हाल ही में एक ही परेशान मुद्दा देखा, और कमांड लाइन तर्कों को स्वयं को बाहर निकालने के लिए एक पार्सर लिखने का फैसला किया।
नोट: मुद्दा यह है कि .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;
}
क्या आप से शुरू करने के लिए कोशिश कर रहे हैं:
कि इस समस्या को ठीक करने के लिए, आप इस के साथ StartToken मामले की जगह ले सकता?कमांड लाइन या कोई अन्य प्रोग्राम? यदि उत्तरार्द्ध - भाषा क्या है? – sharptooth
क्या होता है जब आप इस तरह के तर्क को अपने आवेदन में पास करते हैं? – Draco
क्या आप अपना कोड चिपका सकते हैं जो तर्क तक पहुंचने की कोशिश करता है और आप जिस पूर्ण कमांड लाइन टाइप कर रहे हैं, जैसे c: \ myapp.exe "c: \ document \ appname" –