boost :: program_options - анализ нескольких аргументов командной строки, где некоторые являются строками, включая пробелы и символы - PullRequest
7 голосов
/ 04 ноября 2010

Я хочу проанализировать несколько аргументов командной строки, используя 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"

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

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

Ответы [ 3 ]

2 голосов
/ 04 ноября 2010

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

#ifdef _WIN32
    argv = CommandLineToArgvW(GetCommandLineW(), &argc);
    if (NULL == argv)
    {
        std::wcout << L"CommandLineToArgvw failed" << std::endl;
        return -1;
    }
#endif
0 голосов
/ 14 декабря 2017

Вы должны быть в состоянии достичь этого с 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);
0 голосов
/ 04 ноября 2010

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

cmdparsing.exe --create1 arg1 --create2 arg2

или

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

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

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

...