C++ 使用qprocess将参数传递给批处理

C++ 使用qprocess将参数传递给批处理,c++,qt,batch-file,arguments,qtwidgets,C++,Qt,Batch File,Arguments,Qtwidgets,我正在尝试做一个QtWidgets应用程序,我得到了一个批处理文件:包含 @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%

我正在尝试做一个QtWidgets应用程序,我得到了一个批处理文件:包含

@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*父项):
QMainWindow(父级),
用户界面(新用户界面::主窗口)
{
用户界面->设置用户界面(此);
自动进程=新的QProcess();
QString程序=QString(\%1%2\).arg(“C:/Users/firstname/secondname/desktop/”).arg(“mybatchfile.bat”);
QStringList参数;
参数setWorkingDirectory(“C:/Users/firstname/secondname/desktop/”;
proc->start(程序、参数);
}
MainWindow::~MainWindow()
{
删除用户界面;
}
我所期望的是,它运行我的批处理并向我显示hi 5次 但我得到的是什么,我没有得到任何错误,但我没有得到想要的输出


有人能告诉我为什么会这样,我该怎么解决?我真的是一个noob,任何反馈都会有帮助

如果你传递参数“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

...
或者您可以使用stdin向进程发送一些数据

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

如果传递参数“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

...
或者您可以使用stdin向进程发送一些数据

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

如果要启动notepad.exe之类的程序,应使用
proc->waitForFinished()等待命令终止,否则主窗口将在启动QProcess后立即关闭它

良好的做法还包括实现错误捕获功能,例如
readyReadStandardError()

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

cmd.exe有点棘手:cmd.exe可以使用控制台启动,也可以不使用控制台启动,因为主窗口已经有了ui,任何启动的从cmd.exe都没有控制台窗口

因此,您必须使用
proc->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;

如果要启动notepad.exe之类的程序,应使用
proc->waitForFinished()等待命令终止,否则主窗口将在启动QProcess后立即关闭它

良好的做法还包括实现错误捕获功能,例如
readyReadStandardError()

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

cmd.exe有点棘手:cmd.exe可以使用控制台启动,也可以不使用控制台启动,因为主窗口已经有了ui,任何启动的从cmd.exe都没有控制台窗口

因此,您必须使用
proc->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;

谢谢你抽出时间,但我不太明白你的意思。。如果我改变了我的问题,或者把它变成有条件的(如果你知道我的意思,我的英语不是很好),那是无意的。。我希望问题能够正常提问,我是否应该添加proc->write(“2\n”);我的代码还是用它替换一行?再次感谢您的回复谢谢您让它更容易理解!但不幸的是,它仍然没有像我所希望的那样执行,我只得到了空的主窗口,就是这样:/ldquot代码不应该启动cmd和hi 5次吗?真的很感谢你的编辑!谢谢你:谢谢你抽出时间,但我不太明白你的意思。。如果我改变了我的问题,或者把它变成有条件的(如果你知道我的意思,我的英语不是很好),那是无意的。。我希望问题能够正常提问,我是否应该添加proc->write(“2\n”);我的代码还是用它替换一行?再次感谢您的回复谢谢您让它更容易理解!但不幸的是,它仍然没有像我所希望的那样执行,我只得到了空的主窗口,就是这样:/ldquot代码不应该启动cmd和hi 5次吗?真的很感谢你的编辑!谢谢:谢谢!我把这个添加到我的代码中了!,它所做的唯一一件事就是花了更长的时间来显示我的主窗口。这是预期的行为吗?我的主要问题是它不执行任何操作:(编辑了我的回答谢谢你的帮助!虽然我只是使用了你提供的代码,也没有输出..没有错误,但也没有预期的输出。我只是得到了空的主窗口:/a你能告诉我/c是做什么的吗?再次非常感谢!你能像上面建议的那样使用一个简化的批处理文件吗?嗨,我试着使用简化的批处理文件file,不幸的是,它仍然是一样的,我在应用程序输出中得到的唯一东西是i:\build-path-Desktop\u Qt\u 5\u 9\u 3\u MinGW\u 32bit-Debug\Debug\myapp.exe,代码为0…我需要检查/打开任何东西才能工作吗?另外,请您澄清这是什么:QString(“%1”).arg(“cmd.exe”);在您的代码中是什么意思?非常感谢您的回答!谢谢!我将此添加到了我的代码中!它所做的唯一一件事就是花了一点时间才显示我的主窗口。这是预期的行为吗?我的主要问题是它没有执行任何操作:(编辑了我的回答谢谢你的帮助!虽然我只是使用了你提供的代码,也没有输出..没有错误,但也没有预期的输出。我只是得到了空的主窗口:/a你能告诉我/c是做什么的吗?再次非常感谢!你能像上面建议的那样使用一个简化的批处理文件吗?嗨,我试着使用简化的批处理文件file,不幸的是,它仍然是一样的,我在应用程序输出中得到的唯一东西是i:\build-path-Desktop\u Qt\u 5\u 9\u 3\u MinGW\u 32bit-Debug\Debug\myapp.exe,代码为0…我需要检查/打开任何东西吗