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

时间:2018-08-06 12:55:29

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

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

QTcpServer chatServer

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

这是我的mainwindow.cpp文件

@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

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

有人可以告诉我为什么吗,我该如何解决?我真的是菜鸟,任何反馈都可以帮忙

2 个答案:

答案 0 :(得分:2)

如果要启动诸如notepad.exe之类的程序,则应使用proc->waitForFinished();等待命令终止,否则MainWindow启动后将立即关闭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;

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

 @echo %1%
 pause

答案 1 :(得分:0)

如果您传递参数“ 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");