双引号传递给QProcess :: execute的参数?

时间:2018-10-04 12:47:27

标签: c++ escaping qt5 double-quotes qprocess

我正在使用QProcess在Windows上创建符号链接:

QStringList mklink = { "/c", "mklink" };
if(QFileInfo(src).isDir()) mklink << "/d";
mklink << dst << src;

if(QProcess::execute("cmd", mklink) == 0) result = SUCCESS;

当参数/路径不包含特殊字符时,此选项可以正常工作。 当参数/路径包含特殊字符空格时,它也适用,因为该参数已由QProcess正确地双引号。

问题是,当参数/路径包含空格,因此不会转义任何特殊字符时,不会发生这种情况。

我尝试手动添加双引号:

if(!path.contains(" ")) path.append("\"").prepend("\"");
-also tried-
if(!path.contains(" ")) path.append('"').prepend('"');

但是在两种情况下,输出结果都是\C:\path\without\space\。第一个和最后一个反斜杠是添加的双引号中的转义符。

一种替代方法是使用QProcess::setNativeArguments()

QProcess cmd(this);

QString mklink = "/c mklink";
if(QFileInfo(src).isDir()) mklink += " /d";
mklink += " \""+dst+"\" \""+src+"\"";

cmd.setNativeArguments(mklink);
cmd.start("cmd");
if(cmd.waitForFinished() && cmd.exitStatus() == QProcess::NormalExit && cmd.exitCode() == 0)
    result = SUCCESS;

这可行,但是我想坚持使用QProcess::execute,因为我可以静态使用它。

最简单的方法是使用WinAPI的CreateSymbolicLinkA,但在MinGW 5.3.0中不可用。

总而言之,我的问题是:如何正确地将传递给QProcess::execute的参数加双引号?

0 个答案:

没有答案