Frage

Ich versuche, Befehlszeilenargumente auf eine C # Anwendung zu übergeben, aber ich habe Probleme etwas wie dies vorbei

"C:\Documents and Settings\All Users\Start Menu\Programs\App name"

auch wenn ich " " das Argument hinzuzufügen.

Hier ist mein Code:

    public ObjectModel(String[] args)
    {
        if (args.Length == 0) return; //no command line arg.
        //System.Windows.Forms.MessageBox.Show(args.Length.ToString());
        //System.Windows.Forms.MessageBox.Show(args[0]);
        //System.Windows.Forms.MessageBox.Show(args[1]);
        //System.Windows.Forms.MessageBox.Show(args[2]);
        //System.Windows.Forms.MessageBox.Show(args[3]);
        if (args.Length == 3)
        {
            try
            {
                RemoveInstalledFolder(args[0]);
                RemoveUserAccount(args[1]);
                RemoveShortCutFolder(args[2]);
                RemoveRegistryEntry();
            }
            catch (Exception e)
            {
            }
        }
        }

Und hier ist, was ich übergeben:

C:\WINDOWS\Uninstaller.exe  "C:\Program Files\Application name\"  "username"  "C:\Documents and Settings\All Users\Start Menu\Programs\application name"

Das Problem ist, ich die erste und die zweite args richtig zu bekommen, aber der letzte wird es als C:\Documents.

Jede Hilfe?

War es hilfreich?

Lösung

Ich lief einfach einen Scheck und überprüfte das Problem. Es überrascht mich, aber es ist der letzte \ im ersten Argument.

"C:\Program Files\Application name\" <== remove the last '\'

Das braucht mehr Erklärung, hat jemand eine Idee? Ich bin geneigt, nennen es einen Fehler.


Teil 2, lief ich ein paar Tests und

"X:\\aa aa\\" "X:\\aa aa\" next

wird

X:\\aa aa\
X:\\aa aa" next

Ein wenig Google Aktion gibt einen kleinen Einblick von einem Blog von Jon Galloway , sind die Grundregeln:

  • der Backslash ist das Escape-Zeichen
  • immer entkommen Anführungszeichen
  • nur Schrägstriche entkommen, wenn sie ein Zitat vorangestellt werden.

Andere Tipps

Um Ian Kemp Antwort hinzufügen

Wenn Sie Montage wird als "myprog.exe" und Sie passieren in der Zeichenfolge "C: \ Dokumente und Einstellungen \ All Users \ Startmenü \ Programme \ App-Name" -Link so

C:\>myprog.exe "C:\Documents and Settings\All Users\Start Menu\Programs\App name"

die Zeichenfolge "C: \ Dokumente und Einstellungen \ All Users \ Startmenü \ Programme \ App-Name"

wird bei args [0].

, um hinzuzufügen, was alle anderen schon gesagt hat, es könnte ein Problem sein, zu entkommen. Sie sollten Ihre Schrägstriche durch einen anderen Backslash.

Sollte so etwas wie:

C: \> myprog.exe "C: \\ Dokumente und Einstellungen \\ Alle Benutzer \\ Startmenü \\ Programme \\ Name der App"

bemerkte ich das gleiche lästige Problem vor kurzem, und beschlossen, einen Parser zu schreiben, die Befehlszeilenargumente Array aus mir selbst zu analysieren.

Argumente das Problem ist, dass die .NET Commandline auf die static void Main (string [] args) übergeben Funktion entkommt \“und \\ Das ist von Entwurf, da Sie tatsächlich ein Argument zu übergeben, möchten hat:

Hinweis. ein Zitat oder Backslash in ihm ein Beispiel:.

sagen Sie das folgende als ein einziges Argument übergeben wollte:

  

-msg: Hey, "Wo bist du?"

zB.

  

SampleApp -msg: "Hey, \" Wo Sie   bei? \ ""

Wäre, wie es mit dem Standardverhalten zu senden.

Wenn Sie nicht sehen keinen Grund für jedermann zu haben Anführungszeichen oder Schrägstriche für Ihr Programm zu entkommen, können Sie Ihre eigenen Parser verwenden könnten die Befehlszeile zu analysieren, wie weiter unten.

IE. [Programm] .exe "C: \ test \" arg1 arg2

würde eine args [0] = c: \ test“arg1 arg2

Was man erwarten würde ist args [0] = c:. \ Test \ und dann args [1] = arg1 und args [2] = arg2

Die unten Funktion analysiert die Argumente in eine Liste mit diesem vereinfachten Verhalten.

Beachten Sie, arg [0] ist der Programmname den folgenden Code verwenden. (Sie nennen List.ToArray () die resultierende Liste in ein String-Array zu konvertieren.)

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;
}

Als Reaktion auf WWC Antwort, kommentierte Jamezor, dass sein Code wird fehlschlagen, wenn das erste Zeichen ein Zitat ist.

, dieses Problem zu beheben, können Sie den StartToken Fall mit dieser ersetzen:

            if (eps == enumParseState.StartToken)
            {
                if (rWhiteSpace.IsMatch(c.ToString()))
                {
                    //Skip whitespace
                }
                else if (c == '"')
                {
                    eps = enumParseState.InQuote;
                }
                else
                {
                    token.Append(c);
                    eps = enumParseState.InToken;
                }
            }

Was genau ist das Problem? Wie dem auch sei hier einige allgemeine Hinweise:

Stellen Sie sicher, dass Ihre Hauptmethode (in Program.cs) ist definiert als:

void Main(string[] args)

Dann args ist ein Array, die Befehlszeilenargumente enthalten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top