6

Voglio analizzare più argomenti della riga di comando utilizzando boost :: program_options. Tuttavia, alcuni argomenti sono stringhe racchiuse tra virgolette. Questo è ciò che ho -boost :: program_options - analisi di più argomenti della riga di comando in cui alcuni sono stringhe inclusi spazi e caratteri

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

questo funziona bene quando faccio

cmdparsing.exe --create arg1 arg2 

Ma non lo fa lavoro quando faccio

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

da linea di comando di Windows. Per la seconda opzione, viene convertita in ["this" "is" "arg1" "this" "is" "arg2"] nel vettore createOptions. Pertanto, val1 ottiene "this" e val2 ottiene "is" anziché "this is arg1" e "this is arg2" rispettivamente.

Come posso utilizzare boost :: program_option per farlo funzionare?

+0

Questo funziona su Linux. –

+2

La prima cosa da verificare è il modo in cui il sistema operativo fornisce tali opzioni al programma. Se 'cmdparsing.exe --create this è arg1' e' cmdparsing.exe --create "questo è arg1" 'si ottiene lo stesso contenuto per l'array' argv', quindi devi trovare un altro modo per convincere il tuo SO che la parte tra virgolette deve essere tenuta insieme. –

risposta

-1

Scriverò il mio parser da riga di comando che ha attraversato argv e analizza manualmente le opzioni. In questo modo si può fare quello che vuoi, che si tratti di dividendo sul " oppure solo spaccare il -- in tale,

cmdparsing.exe --create1 arg1 --create2 arg2

o

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

In farlo manualmente, si risparmia tempo e implora correttamente quello che stai veramente cercando, invece di combattere una biblioteca che non fa quello che vuoi che faccia.

(è necessario il \ altrimenti sarà rotto in su come si sta già vedendo.

2

ho riparato usando una funzione nativa di Windows che gestisce gli argomenti della riga di comando in modo diverso. Vedi CommandLineToArgvW per i dettagli. Prima di passare a processCommands(), sto modificando il mio argv [] e argc utilizzando il metodo di cui sopra Grazie Bart van Ingen Schenau per il tuo commento

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

si dovrebbe essere in grado di raggiungere questo obiettivo con positional options:..

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

Poi, quando si analizza la riga di comando aggiungere questo pos_desc:

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