Qprocess和命令MSDOS

Posted

技术标签:

【中文标题】Qprocess和命令MSDOS【英文标题】:Qprocess and command MSDOS 【发布时间】:2013-06-26 08:47:45 【问题描述】:

我想用 QProcess 执行命令行:

  QString elf_path=C:\\files\\file.elf;
  QString appli = "readelf.exe -a "+elf_path+" >>C:\\work\\essai.txt";
  QProcess *process = new QProcess();
  process->execute(appli);

但 QT 显示此错误:

 readelf: Error: '>>C:\work\essai.txt': No such file

你能帮帮我吗?

【问题讨论】:

【参考方案1】:

QProcess::execute 命令将第一个参数作为可执行文件,并将接下来的每个参数作为参数传递给该可执行文件。所以错误是因为 readelf 可执行文件正在接收“>>C:\work\essai.txt”作为参数。

解决这个问题的方法不止一种。

您可以从 readelf 命令 (readAllStandardOutput) 读取输出,从 Qt 打开文件 essai.txt 并自己附加输出,而不是将输出重定向到文本文件。您可能应该在检索输出之前调用 waitForFinished()。

另外,QProcess 中有一个名为 setStandardOutputFile 的函数,它采用文件名将进程的输出重定向到该文件,这可能更容易:-

QProcess* proc = new QProcess;
QString appli = "readelf.exe -a " + elf_path;
proc->setStandardOutputFile("C:\\work\\essai.txt", QIODevice::Append);
proc->start(appli);

最后,您可以创建一个 shell 脚本并使用您的参数调用它,其中 shell 脚本会知道最终输入参数将用于输出重定向。

【讨论】:

我遇到了另一个问题,通常文件的大小必须是 4140 Ko,但是使用 QProcess 的命令,它的大小只有 521 Ko。 哪个文件 - 重定向输出? 你是在调用进程函数waitForFinished吗?如果没有,请尝试一下。 我添加了 if(!proc->waitForStarted(-1)) proc->close(); 之后 proc->start(appli);而且效果很好,谢谢 Merlin069【参考方案2】:

QProcess::execute 是静态方法。您不应该在您的情况下创建 QProcess 的实例。尝试下一个代码

const QString path2exe = "readelf.exe";
QStringList commandline;
commandline << "-a";
commandline << elfPath;
commandline << "c:\\work\\essai.txt"
QProcess::execute( path2exe, commandline );

【讨论】:

谢谢你的回答很有用【参考方案3】:

看起来readelf 将您的重定向视为另一个文件,这是有效的,因为readelf 可以在命令行上处理多个文件。

因此,Qt 进程的东西并没有像您期望的那样处理重定向。

在某种外壳中,重定向用于设置标准输入/输出(可能还有其他)然后它们从可执行程序看到的命令行中删除。换句话说,可执行文件通常看不到重定向,它只是输出到标准输出,shell 已连接到某种文件。

为了解决这个问题,您要么必须运行cmd 进程,确实 理解重定向(将 readelf 命令作为参数传递),要么使用类似方法 @ 987654326@ 将输出放入字节数组而不是写入临时文件。

【讨论】:

谢谢你的回答很有用

以上是关于Qprocess和命令MSDOS的主要内容,如果未能解决你的问题,请参考以下文章

Qt QProcess

和号(&)(非常命令执行)与 QProcess

QT中QProcess调用命令行的痛苦经历

QProcess 多平台命令

使用QT的QProcess执行cmd命令记录

QProcess没有从命令中读取结果