Noté el mismo problema molesto recientemente, y decidí escribir un analizador para analizar la matriz de argumentos de la línea de comandos.
Nota: el problema es que los argumentos de .NET CommandLine pasados a la función void estática principal (string [] args) escapa \ "y \\. Esto es por diseño, ya que es posible que desee pasar un argumento que tiene un presupuesto o barra invertida en ella un ejemplo:.
dicen que quería pasar a la siguiente como un solo argumento:
-msg: "¿Dónde estás" Hey,
por ejemplo,
SampleApp -msg: "Hey, \" Donde en \ ""
Sería la forma de enviar con el comportamiento por defecto?.
Si no ve un motivo para que alguien tenga que escapar de las comillas o barras diagonales para su programa, puede utilizar su propio analizador para analizar la línea de comandos, como se muestra a continuación.
IE. [programa] .exe "C: \ test \" arg2 arg1
tendría un args [0] = c: \ test" arg2 arg1
Lo que cabe esperar es args [0] = c: \ test \ y luego args [1] = arg1 y args [2] = arg2.
la función debajo analiza los argumentos en una lista con este comportamiento simplificado.
Nota, arg [0] es el programa nombre usando el código siguiente. (Usted llama a List.ToArray() para convertir la lista resultante en una matriz de cadenas.)
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;
}
¿Qué está tratando de empezar esto desde?Línea de comando u otro programa? Si este último, ¿cuál es el idioma? – sharptooth
¿Qué sucede cuando pasa un argumento como este a su aplicación? – Draco
¿Puede pasar el código que intenta acceder al argumento y también la línea de comando completa que está escribiendo, como c: \ myapp.exe "c: \ documents \ appname" –