Qt Qprocess和命令MSDOS

Qt Qprocess和命令MSDOS,qt,qprocess,Qt,Qprocess,我想用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\es

我想用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

您能帮助我吗?

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

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

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

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

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


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

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脚本将知道最终输入参数将用于输出重定向。

谢谢,您的答案有用谢谢,您的答案有用我遇到了另一个问题,通常该文件的大小必须为4140KO,但是使用QProcess的命令,它的大小只有521KO。哪个文件-重定向的输出?您正在调用进程函数waitForFinished吗?我在proc->start(appli)之后添加了If(!proc->waitForStarted(-1)){proc->close();};而且效果很好,谢谢你,梅林069