Kommandozeilen-Parameter mit Spaces und Backslash



  • Ich benötige in meinem Programm zwei Parameter. Sie geben zwei Ordnernamen an, die miteinander auf bestimmte Weise verglichen werden sollen. Dieses Programm wird mit einem Commander benutzt, der als zu vergleichende Ordnernamen, die Ordner des linken und rechten Fensters einsetzt.

    *\ = linkes Fenster, */ = rechtes Fenster
    

    Und weil die Namen Leerzeichen enthalten können, müssen diese Parameter in doppelte Hochkommas gesetzt werden.

    Die Kommandozeile sieht dann folgendermaßen aus:

    Programm.exe "*\" "*/"
    

    Als Testbeispiel durch konkrete Angaben ersetzt

    Programm.exe "C:\Mein Order Eins\" "C:\Mein Order Zwei\"
    

    Mein c# Programm liefert merkwürdige Ergebnisse

    <1> : wäre ein korrekter Programmaufruf, unbrauchbares Ergebnis
    <7> : Merkwürdige Codierung des Aufrufes, aber gewünschtes Ergebnis.

    Warum macht es c# nicht so, wie alle anderen Sprachen auch, z.B. Delphi mit ParamStr(x) ? Bei einem Programm-Aufruf muss der Nutzer doch nicht wissen, in welcher Sprache das Programm entwickelt wurde.

    
    ######################################################
    <1>
    CmdLine = "C:\Mein Order Eins\" "C:\Mein Ordner Zwei\"
    
    args[0] = C:\Mein Ordner Eins" C:\Mein
    args[1] = Ordner
    args[2] = Zwei"
    
    CommandLineArgs[1] = C:\Mein Ordner Eins" C:\Mein
    CommandLineArgs[2] = Ordner
    CommandLineArgs[3] = Zwei"
    
    ######################################################
    <2>
    CmdLine = "Mein Order Eins" "Mein Ordner Zwei"
    
    args[0] = Mein Ordner Eins
    args[1] = Mein Ordner Zwei
    
    CommandLineArgs[1] = Mein Ordner Eins
    CommandLineArgs[2] = Mein Ordner Zwei
    
    ######################################################
    <3>
    CmdLine = "C:Mein Order Eins" "C:Mein Ordner Zwei"
    
    args[0] = C:Mein Order Eins
    args[1] = C:Mein Ordner Zwei
    
    CommandLineArgs[1] = C:Mein Order Eins
    CommandLineArgs[2] = C:Mein Ordner Zwei
    
    ######################################################
    <4>
    CmdLine = "C:\Mein Order Eins" "C:\\Mein Ordner Zwei"
    
    args[0] = C:\Mein Order Eins
    args[1] = C:\\Mein Ordner Zwei
    
    CommandLineArgs[1] = C:\Mein Order Eins
    CommandLineArgs[2] = C:\\Mein Ordner Zwei
    
    ######################################################
    <5>
    CmdLine = "C:\Mein Order Eins" "C:\Mein Ordner Zwei\"
    
    args[0] = C:\Mein Order Eins
    args[1] = C:\Mein Ordner Zwei"
    
    CommandLineArgs[1] = C:\Mein Order Eins
    CommandLineArgs[2] = C:\Mein Ordner Zwei"
    
    ######################################################
    <6>
    CmdLine = "C:\Mein Order Eins" "C:\Mein Ordner Zwei\\"
    
    args[0] = C:\Mein Order Eins
    args[1] = C:\Mein Ordner Zwei\
    
    CommandLineArgs[1] = C:\Mein Order Eins
    CommandLineArgs[2] = C:\Mein Ordner Zwei\
    
    ######################################################
    <7>
    CmdLine = "C:\Mein Order Eins\\" "C:\Mein Ordner Zwei\\"
    
    args[0] = C:\Mein Order Eins\
    args[1] = C:\Mein Ordner Zwei\
    
    CommandLineArgs[1] = C:\Mein Order Eins\
    CommandLineArgs[2] = C:\Mein Ordner Zwei\
    
    ######################################################
    
    


  • @hkdd sagte in Kommandozeilen-Parameter mit Spaces und Backslash:

    Warum macht es c# nicht so, wie alle anderen Sprachen auch

    Wer ist tot?



  • Bei c++ bekommt man die CmdLine, also den Original-String des Programmaufrufes. Aus dem kann man sich die Parameter korrekt heraus suchen, die CmdLine-Funktion gibt es auch bei Delphi. Evtl. gibt es sie auch bei C# und ich habe sie nur noch nicht gefunden ...

    Wer ist tot?
    

    Ich benutze derzeit Delphi 10.3 Rio, das ist von Ende 2018 und noch sehr lebendig.



  • Da dürfte doch wohl eher die Shell das \“ als maskiertes Anführungszeichen interpretieren.

    Ich würde / als Pfadtrenner versuchen.



  • Ich habe den Test in einem CMD-Fenster durchgeführt.
    Dazu benutze ich eine BAT-Datei, wo ich einfach immer wieder mir anderen Parametern testen kann.

    Ich werde folgende Variante benutzen:

    CompDirW.exe "C:\Mein Order Eins" "C:\Mein Ordner Zwei"
    
    args[0] = C:\Mein Order Eins
    args[1] = C:\Mein Ordner Zwei
    
    CommandLineArgs[1] = C:\Mein Order Eins
    CommandLineArgs[2] = C:\Mein Ordner Zwei
    

    Die abschließenden

    "\"
    

    fehlen dabei, die muss das Programm selbst setzen, wenn sie fehlen - das ist kein Problem.

    Auch mit dem Schrägstrich klappt es, den muss man aber auch durch Backslash ersetzen

    CompDirW.exe "C:\Mein Order Eins/" "C:\Mein Ordner Zwei/"
    
    args[0] = C:\Mein Order Eins/
    args[1] = C:\Mein Ordner Zwei/
    
    CommandLineArgs[1] = C:\Mein Order Eins/
    CommandLineArgs[2] = C:\Mein Ordner Zwei/
    


  • @hkdd

    den muss man aber auch durch Backslash ersetzen

    Im Windows API funktioniert im Regelfall auch der /.



  • Nun habe ich die Lösung gefunden, sie ist völlig analog zu C++ und Delphi, und liefert die komplette Kommandozeile in einem String, den man dann selbst analysieren muss.

    Das von mir gesuchte Ergebnis ist

     string cl = Environment.CommandLine;
    

    Hier der Test-Code

                string cl = Environment.CommandLine;
                string[] CommandLineArgs = Environment.GetCommandLineArgs();
                AnzPara = CommandLineArgs.Length;
    
                string iPar = "";
    
                PutLst(" ");
                PutLst("cl=" + cl);
                PutLst(" ");
    
                for (int i = 0; i < AnzPara; i++)
                {
                    iPar = CommandLineArgs[i];
                    PutLst(i.ToString()+" .) "+iPar);
                }
    

    und das Ergebnis:

    cl="D:\VC20xx\HKcs\CompHK\bin\Debug\CompHK.exe" /H /? "Y:\##x\a b c\" "Y:\##x\a b c\" /A /U /M:3
     
    0.) D:\VC20xx\HKcs\CompHK\bin\Debug\CompHK.exe
    1.) /H
    2.) /?
    3.) Y:\##x\a b c" Y:\##x\a
    4.) b
    5.) c"
    6.) /A
    7.) /U
    8.) /M:3
    
    

Anmelden zum Antworten