qprocess得到类似shell的行为

时间:2015-01-15 14:26:01

标签: qt shell qprocess

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

的qtscript包装器

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

如果我使用以下程序行启动流程:

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

grep命令抱怨找不到文件" 2"。很明显,命令行不会被解释为我希望它能做到的。

如果我在命令前加cmd /C它运行良好,但这显然不再与操作系统无关,并且可能对命令行参数有一些额外的警告。

是否有任何Qt方式来处理它并强制Qt使用一些默认的命令行解释器?

1 个答案:

答案 0 :(得分:2)

  

是否有任何Qt方式来处理它并迫使Qt使用一些默认的命令行解释器?

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

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

此命令不起作用,因为QProcess接受第一个标记(grep)并将其用作命令,然后传递每个项目,用空格分隔到该命令。在这种情况下,pipe命令不是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);