6

Я хочу проанализировать несколько аргументов командной строки, используя boost :: program_options. Однако некоторые аргументы - это строки, заключенные в двойные кавычки. Это то, что у меня есть -boost :: program_options - разбор нескольких аргументов командной строки, где некоторые строки, включая пробелы и символы

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

это прекрасно работает, когда я

cmdparsing.exe --create arg1 arg2 

Но не работать, когда я

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

из командной строки окна. Для второго варианта он преобразуется в ["this" "is" "arg1" "this" "is" "arg2"] в вектор createOptions. Таким образом, val1 получает "this" и val2 получает "is" вместо "this is arg1" и "this is arg2" соответственно.

Как использовать boost :: program_option, чтобы сделать эту работу?

+0

Это работает на Linux. –

+2

Первое, что нужно проверить, - это то, как ОС предоставляет эти параметры вашей программе. Если 'cmdparsing.exe -create это arg1' и' cmdparsing.exe -create ", это arg1" 'приводит к тому же содержимому для массива' argv', тогда вам нужно найти другой способ убедить вашу ОС что часть в кавычках должна храниться вместе. –

ответ

-1

Я бы написал свой собственный синтаксический анализатор командной строки, который прошел через argv и вручную анализирует параметры. Таким образом, вы можете делать все, что вы хотите, будь то разделив на " или только расщепление на -- в таких,

cmdparsing.exe --create1 arg1 --create2 arg2

или

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

Делая это вручную, вы сэкономите время и правильно внедрять то, что вы действительно ищете, вместо того, чтобы бороться с библиотекой, которая не делает то, что вы хотите, чтобы она делала.

(Вы нуждаетесь в \ или иначе он будет сломан, как вы уже видите.

2

Я установил его с помощью родной функции Windows, который обрабатывает аргументы командной строки по-разному. См CommandLineToArgvW для деталей. Перед передачей его processCommands(), я модифицируя свой ARGV [] и ARGC используя метод, упомянутый выше Спасибо Барт ван Ingen Schenau за комментарий

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

Вы должны быть в состоянии добиться этого с positional options:..

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

Затем, когда вы разбора командной строки добавьте этот pos_desc:

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