Search code examples
qtcmdqprocesscloc

trouble passing parameters to console application


I have trouble with correctly launching cloc 1.62 from windows command line using qprocess. Here is what i have:

A QStringList with all the languages cloc recognizes;

QStringList languages;
languages<<"\"ABAP\""<<"\"ActionScript\""<<"\"Ada\""<<"\"ADSO/IDSM\""<<"\"AMPLE\""<<"\"Ant\""<<"\"Apex Trigger\"";                                    

Then i create a qstring consisting of all of the list's elements separated by comma, exept for one, which is stored in a lang variable;

QString langsinuse;

                 for (int i=0;i<languages.length();i++)
                 {
                     if (languages.at(i) != lang)
                     {
                         if (langsinuse.isEmpty())
                         {
                             langsinuse=langsinuse+languages.at(i);
                         }
                         else
                         {
                             langsinuse=langsinuse+','+languages.at(i);
                         }
                     }
                 }

then i build an arguments stringlist and launch the process:

QStringList arguments;
QProcess cloc;
QString params="cloc-1.62.exe --xml --by-file --report-file="+
list1.at(1).trimmed()+'/'+name+'/'+"report.xml"+" --exclude-lang="+langsinuse+" "+distr;
arguments<<"/k"<<params;
cloc.startDetached("cmd.exe",arguments,"cloc/");

But somehow the spaces in the languages names are not considered escaped and every word separated by space considered a different parameter for cloc, even though both words are in double quotes (for example "\"Apex Trigger\"") and clock produces a bunch of errors.

(50 errors:

Unable to read: Trigger","Arduino

Unable to read: Sketch","ASP","ASP.Net","Assembly","AutoHotkey","awk","Bourne)

It's the error that happens when you don't put a language's name that contains spaces in double quotes, int the --exclude-lang= option (for example --exclude-lang=Apex Trigger will cause an error, --exclude-lang="Apex Trigger" won't)

However if i just save the whole command i build in qt and save it in some batch file it runs just fine.

Am i missing something in escaping the double quotes correctly?


Solution

  • Ok i just had to pass arguments separately and not as a single string.

    arguments<<"/k"<<"cloc-1.62.exe" <<"--xml"<<"--by-file"<<"--report-file="+
    list1.at(1).trimmed()+'/'+name+'/'+"report.xml"<<"--exclude-lang="+langsinuse<<distr;