Feedback

C# - Command Line parsen

Veröffentlicht von am 09.12.2013
(0 Bewertungen)
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.

Hinweis
Für die Ausführungszeile des aktuellen Programms kann man auch einfach Environment.GetCommandLineArgs() aufrufen.

Test-Code
Mit 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

 

Logge dich ein, um hier zu kommentieren!