7

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 コマンドラインから。2 番目のオプションでは["this" "is" "arg1" "this" "is" "arg2"]、createOptions ベクトルに変換されます。したがって、と の代わりにと をそれぞれval1取得"this"します。val2"is""this is arg1""this is arg2"

boost::program_option を使用してこれを機能させるにはどうすればよいですか?

4

2 に答える 2

2

コマンドライン引数を異なる方法で処理するネイティブWindows関数を使用して修正しました。詳細については、 CommandLineToArgvWを参照してください。それをprocessCommands()に渡す前に、上記のメソッドを使用してargv[]とargcを変更しています。バート・ヴァン・インゲン・シェナウ、コメントありがとうございます。

#ifdef _WIN32
    argv = CommandLineToArgvW(GetCommandLineW(), &argc);
    if (NULL == argv)
    {
        std::wcout << L"CommandLineToArgvw failed" << std::endl;
        return -1;
    }
#endif
于 2010-11-04T20:57:24.710 に答える
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);
于 2017-12-14T05:02:38.740 に答える