我正在尝试弄清楚QProcess的用法。我查看了Qt文档,但没有找到。
http://doc.qt.io/qt-4.8/qprocess.html 问题示例。 示例1:下面的代码可以工作。
上述代码的输出是:
示例2:不起作用。无法使用ipconfig。
输出如下,缺少ipconfig连接信息结果。根本没有捕获ipconfig的输出。
Microsoft Windows XP [版本5.1.2600] (C)版权所有1985-2001 Microsoft Corp.
C:\Program Files\7-Zip>ipconfig
---end----
应该更像这样(带有ipconfig结果)。
以下是输出结果。但没有显示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 Igor Pavlov 2010-06-20
用法: 7z [...]
<archive_name> [<file_names>...] [<@listfiles...>]
a: 将文件添加到压缩包中
b: 压力测试 d: 从压缩包中删除文件 e: 将文件从压缩包中解压出来(不使用目录名称) l: 显示压缩包的内容 t: 测试压缩包的完整性 u: 更新压缩包中的文件 x: 解压带完整路径的文件
-ai[r[-|0]]{@listfile|!wildcard}: 包含压缩包 -ax[r[-|0]]{@listfile|!wildcard}: 排除压缩包 -bd: 禁用百分比显示
-i[r[-|0]]{@listfile|!wildcard}: 包含文件名 -m{参数}: 设置压缩方式 -o{目录}: 设置输出目录 -p{密码}: 设置密码 -r[-|0]: 递归子目录 -scs{UTF-8 | WIN | DOS}: 设置列表文件的字符集 -sfx[{名称}]: 创建自解压缩包 -si[{名称}]: 从 stdin 中读取数据 -slt: 显示 l 命令的技术信息 -so: 将数据写入 stdout -ssc[-]: 设置大小写敏感模式 -ssw: 压缩共享文件
-t{类型}: 设置压缩包类型 -u[-][p#][q#][r#][x#][y#][z#][!newArchiveName]: 更新选项 -v{大小}[b|k|m|g]: 创建分卷 -w[{路径}]: 指定工作目录,空路径表示临时目录
-x[r[-|0]]]{@listfile|!wildcard}: 排除文件名 -y: 在所有提示中都选择“是”
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();
}
上述代码的输出是:
问题在于,如果我尝试通过Qprocess和cmd控制台以这种方式使用ipconfig或7zip,我将无法看到任何来自ipconfig或7zip的输出。 我不知道是否有任何操作,如果有操作,为什么我看不到输出?下面的代码说明了这一点。hello
F:\Dev_Qt\expControllingExtConsoleApps-build-desktop> ---End, bye----
示例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
---end----
应该更像这样(带有ipconfig结果)。
显然,输出应该与上面的略有不同,但是“ipconfig”的连接信息应该已经被捕获了。同样,如果我尝试通过cmd控制台使用7zip...我无法看到/捕获任何7zip的输出。所以我的问题是如何通过QProcess和cmd控制台使用命令行应用程序(如ipconfig和7zip)并查看这些应用程序的输出结果? 示例3: 7zip不起作用Microsoft Windows XP [Version 5.1.2600] (C) Copyright 1985-2001 Microsoft Corp.
C:\Documents and Settings\noname>ipconfig
Windows IP Configuration
Ethernet adapter Local Area Connection:
Connection-specific DNS Suffix . : IP Address. . . . . . . . . . . . : 192.172.148.135 Subnet Mask . . . . . . . . . . . : 255.255.255.0 Default Gateway . . . . . . . . . : 192.172.148.177
C:\Documents and Settings\noname>
#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 Igor Pavlov 2010-06-20
用法: 7z [...]
<archive_name> [<file_names>...] [<@listfiles...>]
a: 将文件添加到压缩包中
b: 压力测试 d: 从压缩包中删除文件 e: 将文件从压缩包中解压出来(不使用目录名称) l: 显示压缩包的内容 t: 测试压缩包的完整性 u: 更新压缩包中的文件 x: 解压带完整路径的文件
-ai[r[-|0]]{@listfile|!wildcard}: 包含压缩包 -ax[r[-|0]]{@listfile|!wildcard}: 排除压缩包 -bd: 禁用百分比显示
-i[r[-|0]]{@listfile|!wildcard}: 包含文件名 -m{参数}: 设置压缩方式 -o{目录}: 设置输出目录 -p{密码}: 设置密码 -r[-|0]: 递归子目录 -scs{UTF-8 | WIN | DOS}: 设置列表文件的字符集 -sfx[{名称}]: 创建自解压缩包 -si[{名称}]: 从 stdin 中读取数据 -slt: 显示 l 命令的技术信息 -so: 将数据写入 stdout -ssc[-]: 设置大小写敏感模式 -ssw: 压缩共享文件
-t{类型}: 设置压缩包类型 -u[-][p#][q#][r#][x#][y#][z#][!newArchiveName]: 更新选项 -v{大小}[b|k|m|g]: 创建分卷 -w[{路径}]: 指定工作目录,空路径表示临时目录
-x[r[-|0]]]{@listfile|!wildcard}: 排除文件名 -y: 在所有提示中都选择“是”