Mit Hilfe dieser Methode kann man eine Befehlszeile in die einzelnen Argumente zerlegen. Dabei wird die Zeichenfolge an jedem Leerzeichen zerlegt. Leerzeichen, die von Anführungszeichen eingeschlossen sind, werden ignoriert.
HinweisFür die Ausführungszeile des aktuellen Programms kann man auch einfach
Environment.GetCommandLineArgs() aufrufen.
Test-CodeMit folgendem Code habe ich die Methode getestet.
string[] cmds = new string[]{
"anwendung.exe",
"anwendung.exe /d",
"anwendung.exe /t /d",
"anwendung.exe \"C:\\Neuer Ordner\\test.txt\"",
"anwendung.exe \"C:\\Neuer Ordner\\test.txt\" /d",
"anwendung.exe /a \"C:\\Neuer Ordner\\test.txt\"",
"anwendung.exe /a \"C:\\Neuer Ordner\\test.txt\" /b",
"anwendung.exe /a \"C:\\Neuer Ordner\\test.txt\" \"C:\\Neuer Ordner\\test.txt\"",
"anwendung.exe /a \"C:\\Neuer Ordner\\test.txt\" \"C:\\Neuer Ordner\\test.txt\" /b",
"anwendung.exe /a \"C:\\Neuer Ordner\\test.txt\" /b \"C:\\Neuer Ordner\\test.txt\" /c",
};
foreach (var cmd in cmds)
{
var x = ParseCmdLineArgs(cmd);
Console.WriteLine(cmd);
Console.WriteLine(String.Join(" ", x));
Console.WriteLine();
}
Console.ReadKey();
/// Analysiert eine Zeichenfolge und zerlegt diese danach in die einzelnen Argumente für die Eingabeaufforderung.
/// </summary>
/// <remarks>
/// Die Zeichenfolge wird bei jedem Leerzeichen auf gesplittet, das nicht zwischen 2 Anführungszeichen steht.
/// </remarks>
/// <param name="cmdLine">Die zu analysierende Zeichenfolge.</param>
/// <returns>Ein Array von Argumenten, die zusammen gesetzt <paramref name="cmdLine"/> ergeben.</returns>
public static string[] ParseCmdLineArgs(string cmdLine)
{
List<string> result = new List<string>();
StringBuilder sb = new StringBuilder();
bool quot = false;
for (int i = 0; i < cmdLine.Length; ++i)
{
switch (cmdLine[i])
{
case '"':
quot = !quot;
goto default;
case ' ':
if (quot)
goto default;
else
{
result.Add(sb.ToString());
sb.Clear();
}
break;
default:
sb.Append(cmdLine[i]);
break;
}
}
result.Add(sb.ToString());
return result.ToArray();
}
Kommentare zum Snippet