6

Ich möchte mehrere Befehlszeilenargumente mit boost :: program_options parsen. Einige Argumente sind jedoch in Anführungszeichen eingeschlossene Zeichenfolgen. Das ist, was ich habe -boost :: program_options - Parsen mehrerer Befehlszeilenargumente, wobei einige Zeichenfolgen einschließlich Leerzeichen und Zeichen sind

void processCommands(int argc, char *argv[]) { 
    std::vector<std::string> createOptions; 
    boost::program_options::options_description desc("Allowed options"); 
    desc.add_options() 
    ("create", boost::program_options::value<std::vector<std::string> >(&createOptions)->multitoken(), "create command") 
    ; 
    boost::program_options::variables_map vm; 
    boost::program_options::store(boost::program_options::parse_command_line(argc, argv, desc), vm); 
    boost::program_options::notify(vm); 
    if(vm.count("create") >= 1) { 
     std::string val1 = createOptions[0]; 
     std::string val2 = createOptions[1]; 
     ... 
     // call some function passing val1, val2. 
    } 
} 

dies funktioniert gut, wenn ich

cmdparsing.exe --create arg1 arg2 

tun Aber nicht Arbeit, wenn ich

cmdparsing.exe --create "this is arg1" "this is arg2" 

von Windows-Kommandozeile tun. Für die zweite Option wird es in createOptions vector in ["this" "is" "arg1" "this" "is" "arg2"] konvertiert. Somit erhält val1 statt "this is arg1" und "this is arg2" und val2.

Wie kann ich boost :: program_option verwenden, damit dies funktioniert?

+0

Dies funktioniert auf Linux. –

+2

Die erste Sache zu prüfen ist, wie das OS diese Optionen zu Ihrem Programm zur Verfügung stellt. Wenn 'cmdparsing.exe - create dies ist arg1' und' cmdparsing.exe --create "das ist arg1" 'ergibt sich der gleiche Inhalt für das' argv' Array, dann müssen Sie eine andere Möglichkeit finden, Ihr Betriebssystem zu überzeugen dass der Teil in Anführungszeichen zusammengehalten werden muss. –

Antwort

-1

Ich würde meinen eigenen Befehlszeilenparser schreiben, der argv durchlaufen und die Optionen manuell analysiert. Auf diese Weise Sie tun können, was Sie wollen, ob es auf " oder nur Splitting auf -- in solchen,

cmdparsing.exe --create1 arg1 --create2 arg2

oder

cmdparsing.exe --create \"First Arg\" \"Second Arg\"

Dadurch manuell aufteilen werden, sparen Sie Zeit und richtig, was du wirklich suchst, anstatt eine Bibliothek zu bekämpfen, die nicht das tut, was du willst.

(Sie müssen die \ sonst wird es, wie Sie schon sehen, sind aufgebrochen werden.

2

ich es fixiert, um eine native Windows-Funktion, die Argumente Befehlszeile unterschiedlich behandelt. Siehe CommandLineToArgvW für Details. Vor Übergabe an processCommands(), ich meine Modifizierung argv [] und argc die oben genannten Verfahren unter Verwendung von Vielen Dank Bart van Ingen Schenau für Ihren Kommentar

#ifdef _WIN32 
    argv = CommandLineToArgvW(GetCommandLineW(), &argc); 
    if (NULL == argv) 
    { 
     std::wcout << L"CommandLineToArgvw failed" << std::endl; 
     return -1; 
    } 
#endif 
0

sollten Sie in der Lage sein, dies zu erreichen, mit positional options:..

positional_options_description pos_desc; 
pos_desc.add("create", 10); // Force a max of 10. 

Dann, wenn Sie analysieren die Befehlszeile dieses Add pos_desc:

using namespace boost::program_options; 
command_line_parser parser{argc, argv}; 
parser.options(desc).positional(pos_desc); 
store(parser.run(), vm); 
Verwandte Themen