Ostatnio zauważyłem ten sam denerwujący problem i postanowiłem napisać parser, aby samemu przetworzyć zawartość tablicy argumentów z linii poleceń.
Uwaga: problem polega na tym, że argumenty Command Line Argumenty sieci .NET przekazane do funkcji static void Main (string [] args) powodują zaniknięcie \ "i \\. Jest to zgodne z projektem, ponieważ możesz chcieć przekazać argument, że ma cytatów lub ukośnik w nim jednym z przykładów.
powiedzieć chciałeś przekazać następujące jako pojedynczy argument:
-msg: „gdzie jesteś” Hej,
np.
sampleapp -msg: "Hej, \" Gdzie na \ ""
Byłoby jak wysłać go z domyślnego zachowania?.
Jeśli nie widzisz powodu, dla którego ktokolwiek musiałby uciec przed cudzysłowami lub ułamkami ukośnymi twojego programu, możesz użyć własnego parsera do parsowania wiersza poleceń, jak poniżej.
IE. [Program] .exe "C: \ test \" arg1 arg2
miałoby args [0] = c: \ test”arg1 arg2
Czego można oczekiwać jest args [0] = c: \ \ test a następnie arg [1] = arg1 i argumentów [2] = arg2.
poniżej funkcja analizuje argumenty na liście z tego uproszczonego postępowania.
Uwaga Arg [0] jest program nazwa za pomocą poniższego kodu. (Wywołujesz List.ToArray(), aby przekształcić wynikową listę w tablicę znaków.)
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;
}
Co chcesz zacząć od tego?Wiersz poleceń lub inny program? Jeśli to drugie - jaki jest język? – sharptooth
Co stanie się, gdy przekażesz taki argument do swojej aplikacji? – Draco
Czy możesz przekroczyć kod, który próbuje uzyskać dostęp do argumentu, a także pełny wiersz polecenia, który wpisujesz, na przykład c: \ myapp.exe "c: \ documents \ appname" –