【发布时间】:2011-05-04 23:16:17
【问题描述】:
我正在尝试弄清楚 QProcess 的用途。我查看了 Qt 文档,没有运气。
http://doc.qt.io/qt-4.8/qprocess.html
问题示例。
示例 1:以下代码有效。
#include <QtCore/QCoreApplication>
#include <QTextStream>
#include <QByteArray>
#include <QProcess>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QTextStream qout(stdout);
QProcess cmd;
cmd.start("cmd");
if (!cmd.waitForStarted()) {
return false;
}
cmd.waitForReadyRead();
QByteArray result = cmd.readAll();
//qout << result.data() << endl; //console junk captured, doesn't show.
//My test command
cmd.write("echo hello");
cmd.write("\n");
//Capture my result
cmd.waitForReadyRead();
//This is my command shown by cmd, I don't show it, capture & discard it.
result = cmd.readLine();
//Read result of my command ("hello") and the rest of output like cur dir.
result = cmd.readAll();
qout << result.data();
qout << "\n\n---End, bye----" << endl;
return a.exec();
}
上述代码的输出是
你好
F:\Dev_Qt\expControllingExtConsoleApps-build-desktop> ---End, bye----
问题是,如果我尝试通过 Qprocess 和 cmd 控制台以这种方式使用 ipconfig 或 7zip,我将无法看到 ipconfig 或 7zip 的任何输出。我什至不知道是否完成了某些事情,如果完成了某些事情,那为什么我看不到输出?下面的代码说明了。
示例 2: 不起作用。无法使用 ipconfig。
#include <QtCore/QCoreApplication>
#include <QTextStream>
#include <QByteArray>
#include <QString>
#include <QProcess>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QTextStream qout(stdout);
QProcess cmd2;
cmd2.setWorkingDirectory("C:/Program Files/7-Zip"); //not needed in this example.
cmd2.setReadChannel(QProcess::StandardOutput);
cmd2.setProcessChannelMode(QProcess::MergedChannels);
cmd2.start("cmd");
if (!cmd2.waitForStarted())
{
qout << "Error: Could not start!" << endl;
return false;
}
cmd2.waitForReadyRead();
QByteArray result = cmd2.readAll();
qout << result.data() << endl; //Console version info, etc.
//My command
cmd2.write("ipconfig");
cmd2.write("\n");
//Capture output of ipconfig command
//DOES NOT WORK!!
cmd2.waitForReadyRead();
while (! cmd2.atEnd())
{
result = cmd2.readLine();
qout << result;
result.clear();
}
qout << endl;
qout << "\n\n---end----" << endl;
return a.exec();
}
输出如下,缺少ipconfig连接信息结果。根本没有捕获 ipconfig 的输出。
Microsoft Windows XP [版本 5.1.2600] (C) 版权所有 1985-2001 Microsoft Corp.
C:\Program Files\7-Zip> ipconfig
---结束----
应该更像这样(带有 ipconfig 结果)。
Microsoft Windows XP [版本 5.1.2600] (C) 版权所有 1985-2001 Microsoft Corp.
C:\文档和 设置\noname>ipconfig
Windows IP 配置
以太网适配器本地 连接:
Connection-specific DNS Suffix . : IP Address. . . . . . . . . . . . : 192.172.148.135 Subnet Mask . . . . . . . . . . . : 255.255.255.0 Default Gateway . . . . . . . . . : 192.172.148.177C:\Documents and Settings\noname>
显然输出应该比上面有一点差异,但是应该已经捕获了作为“ipconfig”输出的连接信息。同样,如果我尝试通过 cmd 控制台使用 7zip……我看不到/捕获 7zip 的任何输出。所以我的问题是如何通过 QProcess 和 cmd 控制台使用 ipconfig 和 7zip 等命令行应用程序并查看这些应用程序的输出结果?
示例 3: 7zip 不起作用
#include <QtCore/QCoreApplication>
#include <QTextStream>
#include <QByteArray>
#include <QProcess>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QTextStream qout(stdout);
QProcess cmd2;
cmd2.setWorkingDirectory("C:/Program Files/7-Zip");
cmd2.setReadChannel(QProcess::StandardOutput);
cmd2.setProcessChannelMode(QProcess::MergedChannels);
cmd2.start("cmd");
if (!cmd2.waitForStarted()) {
return false;
}
//My Command
cmd2.write("7z.exe");
cmd2.write("\n");
//Capture output of ipconfig command
cmd2.waitForReadyRead();
QByteArray result;
while (! cmd2.atEnd()) {
result = cmd2.readLine();
qout << result;
result.clear();
}
qout << endl;
qout << "\n\n---end----" << endl;
return a.exec();
}
输出。不显示 7zip 中的任何内容。
Microsoft Windows XP [版本 5.1.2600] (C) 版权所有 1985-2001 Microsoft Corp.
C:\Program Files\7-Zip>7z.exe
---结束----
预计输出将遵循...
Microsoft Windows XP [版本 5.1.2600] (C) 版权所有 1985-2001 Microsoft Corp.
C:\Documents and Settings\noname>cd C:\Program Files\7-Zip
C:\Program Files\7-Zip>7z.exe
7-Zip 9.15 beta 版权所有 (c) 1999-2010 伊戈尔·巴甫洛夫 2010-06-20
用法:7z [...] [...] []
a:将文件添加到存档
b:基准 d:删除文件 归档 e: 从中提取文件 存档(不使用目录 names) l: 列出档案的内容
t:测试存档的完整性 u: 将文件更新到存档 x:eXtract 具有完整路径的文件
-ai[r[-|0]]{@listfile|!wildcard}:包含档案
-ax[r[-|0]]{@listfile|!wildcard}:排除档案 -bd:禁用 百分比指标
-i[r[-|0]]{@listfile|!wildcard}:包含文件名 -m{Parameters}: 设置压缩方法
-o{Directory}:设置输出目录 -p{Password}:设置密码 -r[-|0]:递归子目录 -scs{UTF-8 | 赢 | DOS}:为列表文件设置字符集 -sfx[{name}]:创建 SFX 存档 -si[{name}]:从标准输入读取数据 -slt:显示 l(列表)命令的技术信息 -so:将数据写入 stdout -ssc[-]:设置敏感大小写 模式 -ssw:压缩共享文件
-t{Type}:设置存档类型 -u[-][p#][q#][r#][x#][y#][z#][!newArchiveName]: 更新选项 -v{Size}[b|k|m|g]: 创建卷 -w[{path}]: 分配 工作目录。空路径意味着 临时目录
-x[r[-|0]]]{@listfile|!wildcard}:排除文件名 -y:假设是 所有查询C:\Program Files\7-Zip>
【问题讨论】: