将参数传递给控制台应用程序时遇到问题
trouble passing parameters to console application
我无法使用 qprocess 从 windows 命令行正确启动 cloc 1.62。这是我拥有的:
具有 cloc 可识别的所有语言的 QStringList;
QStringList languages;
languages<<"\"ABAP\""<<"\"ActionScript\""<<"\"Ada\""<<"\"ADSO/IDSM\""<<"\"AMPLE\""<<"\"Ant\""<<"\"Apex Trigger\"";
然后我创建一个 qstring,其中包含列表的所有元素,用逗号分隔,一个除外,它存储在 lang 变量中;
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);
}
}
}
然后我构建一个参数字符串列表并启动进程:
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/");
但不知何故,语言名称中的 spaces 不被视为转义,并且每个由 space 分隔的单词都被视为 cloc 的不同参数,即使两个单词都在双引号中(例如"\"Apex Trigger\"") 和时钟产生一堆错误。
(50 个错误:
无法读取:触发器","Arduino
无法阅读:Sketch","ASP","ASP.Net","Assembly","AutoHotkey","awk","Bourne)
这是当您没有将包含 spaces 的语言名称放在双引号中时发生的错误,即 --exclude-lang= 选项(例如 --exclude-lang=Apex触发器会导致错误,--exclude-lang="Apex Trigger"不会)
但是,如果我只保存我在 qt 中构建的整个命令并将其保存在一些批处理文件中,它运行得很好。
我是否遗漏了正确转义双引号的内容?
好的,我只需要单独传递参数,而不是作为单个字符串。
arguments<<"/k"<<"cloc-1.62.exe" <<"--xml"<<"--by-file"<<"--report-file="+
list1.at(1).trimmed()+'/'+name+'/'+"report.xml"<<"--exclude-lang="+langsinuse<<distr;
我无法使用 qprocess 从 windows 命令行正确启动 cloc 1.62。这是我拥有的:
具有 cloc 可识别的所有语言的 QStringList;
QStringList languages;
languages<<"\"ABAP\""<<"\"ActionScript\""<<"\"Ada\""<<"\"ADSO/IDSM\""<<"\"AMPLE\""<<"\"Ant\""<<"\"Apex Trigger\"";
然后我创建一个 qstring,其中包含列表的所有元素,用逗号分隔,一个除外,它存储在 lang 变量中;
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);
}
}
}
然后我构建一个参数字符串列表并启动进程:
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/");
但不知何故,语言名称中的 spaces 不被视为转义,并且每个由 space 分隔的单词都被视为 cloc 的不同参数,即使两个单词都在双引号中(例如"\"Apex Trigger\"") 和时钟产生一堆错误。
(50 个错误:
无法读取:触发器","Arduino
无法阅读:Sketch","ASP","ASP.Net","Assembly","AutoHotkey","awk","Bourne)
这是当您没有将包含 spaces 的语言名称放在双引号中时发生的错误,即 --exclude-lang= 选项(例如 --exclude-lang=Apex触发器会导致错误,--exclude-lang="Apex Trigger"不会)
但是,如果我只保存我在 qt 中构建的整个命令并将其保存在一些批处理文件中,它运行得很好。
我是否遗漏了正确转义双引号的内容?
好的,我只需要单独传递参数,而不是作为单个字符串。
arguments<<"/k"<<"cloc-1.62.exe" <<"--xml"<<"--by-file"<<"--report-file="+
list1.at(1).trimmed()+'/'+name+'/'+"report.xml"<<"--exclude-lang="+langsinuse<<distr;