QProcess - 正在运行的进程,其路径包含空格

Posted

技术标签:

【中文标题】QProcess - 正在运行的进程,其路径包含空格【英文标题】:QProcess - running process whose path contain spaces 【发布时间】:2016-06-14 20:08:34 【问题描述】:

在我的应用程序中,我从本地应用程序数据文件夹中运行了一个分离的进程。下面的代码适用于大多数情况。

void executeApp(const QString &id)

    QString program = QStandardPaths::writableLocation(QStandardPaths::AppLocalDataLocation);
    program = program + "\\..\\Programs\\MyApp.exe";
    QStringList arguments;
    arguments << "--app_id="+id; //it is only one argument
    QProcess* process = new QProcess(this);
    bool success = process->startDetached(program, arguments);
    if (!success) //TODO: Error handling
        qDebug() << "Couldn't start process at " << program << process->errorString();


运行一些测试,我发现当 Windows 帐户用户名中包含空格时它不起作用(Windows 实际上允许这样做)。

如何解决?

--- 编辑:

根据发布的答案,我对代码进行了一些更改。但是,我仍然从下面的代码中收到 QMessageBox 上的“未知错误”:

void executeApp(const QString &id)

    QString program = QStandardPaths::writableLocation(QStandardPaths::AppLocalDataLocation);
    program = QDir(program + "/../Programs/MyApp.exe").absolutePath();
    QStringList arguments;
    arguments << "--app_id="+id; //it is only one argument
    QProcess* process = new QProcess(this);
    bool success = process->startDetached(program, arguments);

    if (!success) 
        QMessageBox::critical(NULL, tr("Launching App"), process->errorString());

强调一下,只有在用户名中有一个空格的用户时才会发生这种情况......

【问题讨论】:

我尝试过使用引号 (""),但没有成功 【参考方案1】:

QString QDir::absolutePath() const

返回绝对路径(以“/”或驱动器开头的路径 规范),它可能包含符号链接,但从不包含 多余的“.”、“..”或多个分隔符。

将路径从根转换为绝对形式是有意义的:

QString dataPath = QStandardPaths::writableLocation(QStandardPaths::AppLocalDataLocation);
QString exePath = QDir(dataPath + "/../Programs").absolutePath();
qDebug() << "Executable path" << exepath;
qDebug() << "File exists" << QFile(exepath + "/MyApp.exe").exists();

关于另一个问题,即由于路径中包含的用户名中的空格,它无法运行可执行文件。我们应该将整个路径括在引号中,以便满足 Windows CreateProcess:

process->startDetached(QStringLiteral("\"") + exepath + "/MyApp.exe" + QChar("\""), arguments);

请注意,Qt 通常能够接受路径参数的反斜杠“\”和斜杠“/”分隔符。

【讨论】:

提到两个“斜线”方向到“转义”必须转义每个反斜杠 +1 的好答案 感谢斜线提示。但是,即使使用 QDir,我仍然在 process->errorString() 上收到“未知错误”,遵循您的代码... 路径下是否存在exe文件? 是的,确实如此。如果用户名没有空格,它将按预期运行 然后尝试用引号将路径括起来。【参考方案2】:

你可以尝试使用QDir来解析路径:

QDir dataDir(QStandardPaths::writableLocation(QStandardPaths::AppLocalDataLocation));
QString program = dataDir.absolutePath("../Programs/MyApp.exe");

【讨论】:

我仍然在 process->errorString() 上收到“未知错误”,即使使用 QDir,遵循您的代码...

以上是关于QProcess - 正在运行的进程,其路径包含空格的主要内容,如果未能解决你的问题,请参考以下文章

监控正在运行的 qprocess 并在 qprocess 完成时返回值

如何在 Windows 上通过 QProcess 启动提升的子进程?

在 PyQt 中使用 QProcess 运行类方法

QProcess 无缘无故死亡

如何使用 QProcess 等待子进程?

使用 QProcess 通过 PyQt 运行和监控系统进程