qprocess get shell 喜欢的行为

qprocess get shell like behaviour

我在 windows(不知道这是否重要)应用程序中使用 QT,并希望使用 QProcess 从我的应用程序启动一些进程。 (实际上是通过使用 QProcess 的 qtscript 包装器)

这似乎可行,但我在使用更高级的命令行(如使用管道连接程序)时遇到问题。

如果我使用以下程序行启动一个进程:

QProcess proc;
QString command = "grep \"false negatives\" test.txt | cut -f2";
proc.start(command);

grep 命令抱怨找不到文件“2”。很明显命令行没有像我期望的那样被解释。

如果我在命令前加一个 cmd /C 前缀,它运行良好,但这显然不再是 OS 独立的,并且可能有一些关于命令行参数的额外警告。

有没有类似 Qt 的方法来处理这个问题并强制 Qt 使用一些默认的命令行解释器?

Is there any Qt like way to handle that and force Qt to use some default command line interpreter?

简单的答案是否定的,没有 Qt 默认命令行解释器

QString command = "grep \"false negatives\" test.txt | cut -f2";

此命令不起作用,因为 QProcess 获取第一个标记 (grep) 并将其用作命令,然后将每个项目(由 space 分隔)传递给该命令。在这种情况下,管道命令不是 grep 的有效参数,也不是 cut 和 -f2.

我评论说 this question 的答案可能 相似,因为它演示了如何成功地将管道命令与 QProcess 一起使用;请注意,参数用引号括起来。

由于您不想调用 cmd 或 *nix 等价物,例如 bash,您可以通过两次调用 QProcess 来处理这个问题;第一个用于 grep 命令,第二个用于剪切,传入第一个 QProcess 调用的输出。

函数 QProcess::setStandardOutputProcess 使这更容易,允许您直接在两个 QProcess 对象之间创建管道。

因此你会做这样的事情:-

QProcess proc1;
QProcess proc2;

proc1.setStandardOutputProcess(&process2);

QString cmd1("grep \"false negatives\" test.txt");
QString cmd2("cut -f2");

proc1.start(cmd1);
proc2.start(cmd2);