QProcess和命令行“/ c”参数

时间:2012-10-07 13:38:15

标签: escaping qstring qprocess

我对QProcess有一个非常奇怪的问题,这是一种奇怪的行为。

我最终想要的是这样的(这是Windows 7中的cmd.exe)

C:\path_to_somewhere>cmd /c "C:\Program Files\path_to_dir\executable"

(cmd与QProcess展示兼容)

所以要做这样的事情,我创造了这个:

QProcess proc;
QString command;
QStringList attributes;

command = "c:\\windows\\system32\\cmd.exe";
QStringList << QString("/c \"C:\\Program Files\\path_to-dir\\executable"");
proc.start(command, attributes);

我得到的错误输出是:

Name '\"c:\Program Files\Quantum GIS Wroclaw\bin\gdalwarp.exe\"' is not recognized as
internat or external command, executable or batch file.

(它是由我从波兰语翻译出来的,因此在英语方面可能有些不同。)

似乎\字符串中没有转义字符,在命令中留下“字符”。我做错了什么?

我试过了

proces.start(QString) 

函数与三\“\”\“并且它也不起作用。我想这个问题的解决方案必须太容易,我不会想到它。

2 个答案:

答案 0 :(得分:3)

好吧我不知道这是不是Qt bug,但在关于void QProcess::start(QString, QStringList, OpenMode)的文档中,有人说过这样的话:

  

Windows:包含空格的参数用引号括起来。

似乎不是这样,因为我的程序使用带空格的路径并且cmd shell在那里中断。

但是,我发现了为仅接受一个字符串参数的系统设计的函数(就像Windows一样)。

这是QProcess::setNativeArguments(QString)

接受一个QString作为参数,专门为Windows和Symbian创建。

毕竟,如果将Windows(或Symbian)中的参数传递给系统有问题,他应该尝试setNativeArguments(QString)

答案 1 :(得分:1)

正如您已经注意到的,Qt包含带引号的空格的参数,这意味着QProcess发出的实际命令看起来就像那样(不确定内部引号):

c:\windows\system32\cmd.exe "/c \"C:\Program Files\path_to_dir\executable\""

这不是你想要的:整个字符串传递给cmd,包括/c。由于/c和路径是两个参数,因此您应该将它们分别传递给QProcess,而不必担心空格,因为它们将自动处理:

QString command = "cmd.exe";
QStringList arguments = 
    QStringList() << "/c" << "C:\\Program Files\\path_to_dir\\executable";
// note there are two arguments now, and the path is not enclosed in quotes
proc.start(command, arguments);