如何在 QProcess 中使用 cmd.exe 命令

Posted

技术标签:

【中文标题】如何在 QProcess 中使用 cmd.exe 命令【英文标题】:How to use cmd.exe commands in QProcess 【发布时间】:2020-08-18 15:49:43 【问题描述】:

我尝试在 Windows 命令提示符中运行命令类型,但进程没有启动。如果我尝试通过命令提示符直接使用此命令,它会起作用。 这是代码:

void MainWindow::firmware()

    QProcess *proc = new QProcess(this);
    QString dir("C:/Qtstatic/Examples/My/build-RBoxReader-Desktop_Qt_5_15_0_MSVC2019_64bit-Debug");
    proc->setWorkingDirectory(dir);
    QMessageBox msgBox;
    QString msg = "Current dir: %1";
    msg = msg.arg(proc->workingDirectory());
    msgBox.setText(msg);
    msgBox.exec();
    QString command("type");
    QStringList arguments;
    arguments << "my_file.txt";
    proc->start(command, arguments);
    if(!proc->waitForStarted()) 
        QMessageBox msgBox1;
        QString msg1 = "Process state: %1";
        msg1 = msg1.arg(proc->state());
          msgBox1.setText(msg1);
          msgBox1.exec();
        QMessageBox msgBox;
        QString msg = "Process didn't start";
          msgBox.setText(msg);
          msgBox.exec();
          return;
    
    msg = "Process state: %1";
    msg = msg.arg(proc->state());
      msgBox.setText(msg);
      msgBox.exec();
    proc->waitForFinished (-1);

【问题讨论】:

【参考方案1】:

鉴于我在您的代码中没有看到"cmd.exe",因此我无法理解您的期望。您的系统上没有 type.exe。您必须自己实际运行cmd.exe,并将type 作为参数传递给它:

你会想要这样的东西:

QString command = QStringLiteral("cmd.exe");
QStringList argumentsQStringLiteral("/K"),
                      QStringLiteral("type"),
                      QStringLiteral("my_file.txt");

【讨论】:

谢谢,它正在工作。我想,QProcess 像 system() 一样直接诉诸于 cmd。再问一个问题,但是为什么proc-&gt;start("fsutil file createnew m_file.txt 1000"); 在不运行 cmd.exe 的情况下工作?我尝试了这个命令并制作了文件。 @CaboomBom fsutil 是您可以找到的可执行文件。 type 不是。这就是区别。 cmd.exe 通过混合内部和外部命令来搅浑水,所以在任何时候你都无法确定什么是什么。恕我直言,这是典型命令 shell 的最大问题。内部和外部命令具有如此重大的性能差异,以至于将这种边界隐藏在荒谬中。它总是困扰着我,数以百万计的初学者被绊倒了。不好。

以上是关于如何在 QProcess 中使用 cmd.exe 命令的主要内容,如果未能解决你的问题,请参考以下文章

Qt:无法使用 QProcess 启动 Windows 控制台

如何限制管道(windows)的缓冲区大小?

SSH 在 QProcess 中不起作用,但在控制台中起作用

通过Qt GUI向CMD传递/发出命令

使用包含空格的参数调用 Qpr​​ocess - Windows

如何在 QProcess 中使用队列?