6

Je souhaite analyser plusieurs arguments de ligne de commande en utilisant boost :: program_options. Cependant, certains arguments sont des chaînes entre guillemets. Voilà ce que j'ai -boost :: program_options - analyse de plusieurs arguments de ligne de commande où certains sont des chaînes, y compris des espaces et des caractères

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

cela fonctionne très bien quand je fais

cmdparsing.exe --create arg1 arg2 

Mais ne quand je fais

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

de ligne de commande windows. Pour la deuxième option, il est converti en ["this" "is" "arg1" "this" "is" "arg2"] dans le vecteur createOptions. Ainsi, val1 obtient "this" et val2 obtient "is" au lieu de "this is arg1" et "this is arg2" respectivement. Comment puis-je utiliser boost :: program_option pour faire fonctionner ce programme?

+0

Cela fonctionne sur Linux. –

+2

La première chose à vérifier est la façon dont le système d'exploitation fournit ces options à votre programme. Si 'cmdparsing.exe --créer c'est arg1' et' cmdparsing.exe --create 'c'est arg1 "' résulter dans le même contenu pour le tableau 'argv', alors vous devez trouver un autre moyen de convaincre votre OS que la partie entre guillemets doit être conservée ensemble. –

Répondre

-1

J'écrirais mon propre analyseur de ligne de commande qui passait par argv et analysait manuellement les options. De cette façon, vous pouvez faire ce que vous voulez, que ce soit le fractionnement sur " ou le fractionnement uniquement sur -- dans un tel,

cmdparsing.exe --create1 arg1 --create2 arg2

ou

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

En faisant manuellement, vous économiserez Au lieu de lutter contre une bibliothèque qui ne fait pas ce que vous voulez qu'elle fasse, implémentez ce que vous cherchez vraiment.

(Vous devez le \ ou bien il sera brisé comme vous voyez déjà.

2

je fixe à l'aide d'une fonction native de Windows qui gère les arguments de ligne de commande différente. Voir CommandLineToArgvW pour plus de détails. Avant de passer à processCommands(), je modifie mon argv [] et argc selon la méthode mentionnée ci-dessus Merci Bart van Ingen Schenau pour votre commentaire

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

vous devriez être en mesure d'y parvenir avec positional options:..

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

Puis, quand vous analysez la ligne de commande ajouter cette pos_desc:

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