【问题标题】:passing arguments to batch using qprocess使用 qprocess 将参数传递给批处理
【发布时间】:2019-01-13 10:41:51
【问题描述】:

我正在尝试做一个 qt 小部件应用程序,我有一个批处理文件:包含

@echo off

echo Hello Everyone!
echo ----------------
echo 1 - Exit Program
echo ----------------
echo 2 - Say Hi 5 times
echo ----------------
set /p QUESTION=What would you like to do today?:
echo:
IF %QUESTION%==1 GOTO :1
IF %QUESTION%==2 GOTO :2

:1
exit
:2
cls
echo HI
echo HI
echo HI
echo HI
echo HI

pause

并且我想在使用 QProcess 启动它时将“2”作为参数传递给它,例如与执行同时进行

这是我的 mainwindow.cpp 文件

MainWindow::MainWindow(QWidget *parent) :
  QMainWindow(parent),
  ui(new Ui::MainWindow)
{
  ui->setupUi(this);

  auto proc = new QProcess();
  QString program = QString("\"%1%2\"").arg("C:/Users/firstname secondname/desktop/").arg("mybatchfile.bat");
  QStringList arguments;
      arguments << "2";

  proc->setWorkingDirectory("C:/Users/firstname secondname/desktop/");
  proc->start( program, arguments );
}

MainWindow::~MainWindow()
{
  delete ui;
}

我所期望的是它运行我的批处理并向我显示 5 次 但我得到的是什么,我没有得到任何错误,但我没有得到想要的输出

谁能告诉我为什么会这样,我该如何解决?我真的是菜鸟,任何反馈都会有所帮助

【问题讨论】:

标签: c++ qt batch-file arguments qtwidgets


【解决方案1】:

如果你想启动notepad.exe这样的程序,你应该等待proc-&gt;waitForFinished();命令的终止,否则你的MainWindow会在启动后立即关闭你的QProcess。

良好的做法也是实现错误捕获功能,例如readyReadStandardError().

无法直接启动批处理文件,因为它不是可执行文件。 需要通过cmd.exe启动

cmd.exe 有点棘手:cmd.exe 可以在有或没有控制台的情况下启动,并且由于您的主窗口已经有一个 ui,任何启动的从属 cmd.exe 都将没有控制台窗口。

因此,您必须使用proc-&gt;startDetached(); 将 cmd.exe 作为独立进程启动。

所以完整的东西必须是这样的:

QProcess* proc = new QProcess();
QString program = "cmd.exe";
QStringList arguments;
arguments << "/c C:/Users/firstname secondname/desktop/mybatchfile.bat 2";

proc->startDetached( program, arguments );
delete proc;

使用简化的批处理来确保获得输出:

 @echo %1%
 pause

【讨论】:

  • 谢谢!我将此添加到我的代码中!,它所做的唯一一件事就是显示我的主窗口只需要更长的时间。这是预期的行为吗?我的主要问题是它没有执行任何东西:(
  • 编辑了我的答案
  • 感谢您的帮助!虽然我只是使用了您提供的代码,也没有输出.. 没有错误,但也不是预期的输出。我只是得到我的空主窗口:/ 你也能告诉我 /c 做什么吗?再次非常感谢!
  • 你可以使用上面建议的简化批处理文件吗?
  • 嗨,我尝试使用那个简化的批处理文件,不幸的是它仍然一样,我在应用程序输出中得到的唯一内容是 I:\build-path-Desktop_Qt_5_9_3_MinGW_32bit-Debug\debug\myapp.exe以代码 0 退出...我需要检查/打开任何东西才能使其工作吗?还请您澄清一下:QString("%1").arg("cmd.exe");在你的代码中是什么意思?非常感谢您的回答!
【解决方案2】:

如果你传递参数“2”,你实际上是在设置变量%1,所以你需要检查它,否则作为set /p的问题

set QUESTION=%1
GOTO check:
ask:
set /p QUESTION=What would you like to do today?:
check:
IF "%QUESTION%"=="" GOTO :ask

echo:
IF %QUESTION%==1 GOTO :1
IF %QUESTION%==2 GOTO :2

...

或者您可以使用标准输入向进程发送一些数据

proc->write("2\n");

【讨论】:

  • 感谢您抽出宝贵时间,但我不太明白您的意思.. 如果我要更改我的问题或使它像,有条件的(如果您知道我的意思,我的英语不是那么好) 那么那是无意的.. 我希望正常提出问题,我应该添加 proc->write("2\n");到我的代码或用它替换一行?再次感谢您的回复
  • 感谢您使它更容易理解!但不幸的是,它仍然没有像我想要的那样执行,我只是得到空的主窗口,就是这样:/代码不应该用 hi 5 次启动 cmd 吗?非常感谢编辑!谢谢:D
猜你喜欢
  • 1970-01-01
  • 2016-07-03
  • 2014-01-04
  • 2010-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多