我如何在c++中得到命令的输出

How do I get output of command in C++?

本文关键字:命令 输出 c++      更新时间:2023-10-16

如何获得子流程的输出并将其分配给变量?例如:分配wmic csproduct get uuid的输出在CMD中返回一长串字符,我如何在c++中运行该命令并将其分配给变量?

捕获流程的输出有两个主要选项:

  • 将其重定向到一个文件,然后稍后读取该文件。
  • 使用管道
标准库不支持

管道,除了隐藏在公共流抽象之后。实际上,这意味着创建进程B的进程a不能通过管道与B通信,除非使用了特定于平台的功能。在Windows中,脚本支持,Windows Script Host,有管道方法的直接功能,基于轮询b的输出。在一个更低的级别,你可以使用CreateProcess API函数。但这并不是一件小事。

使用临时文件作为通信通道,并且仅使用标准c++功能,您只需通过可以重定向B的输出的命令解释器调用程序B。这个命令解释器和它的语法构成了特定于平台的部分。因此,即使这种方法是特定于平台的,但c++代码本身是可移植的。


在Windows中,标准的命令解释器是cmd.exe,它使用普通的Unix >语法来重定向程序的输出,因此要执行的命令可以像

cmd /c "b.exe >tempfile"

您可以通过c++ system执行这样的命令。system函数已经通过命令解释器执行指定的命令,在Windows中是cmd.exe。所以system的参数只需要是

b.exe > tempfile

其中tempfile是您希望得到结果的文件的名称或完整路径。

您可以通过tmpnam函数创建一个新的临时文件名

我假设winapi标记指向您需要的答案,并且它还提示了平台。所以,我认为答案是_popen

的例子:

#include <stdio.h>
int main()
{
    FILE*  CommandResult = _popen("wmic csproduct get uuid", "rt"); //send the command to the cmd and return a pointer to the command result
    char   line[256]; //a buffer to read from the file
    while(fgets(line, 256, CommandResult)) printf(line); //read and print all lines one by one
    _pclose(CommandResult);
    scanf(line); //prevent the console from closing immediately
}

编辑:

我刚刚意识到,在发布之前,我必须在每一行代码中附加以下免责声明。

软件是"按原样"提供的,没有任何形式的、明示的或明示的保证默示,包括但不限于对适销性的保证;适合某一特定目的和不侵权。在任何情况下都不得作者或版权持有人应对任何索赔、损害赔偿或其他责任在合同诉讼、侵权诉讼或其他诉讼中,因下列原因引起的责任:不属于或与本软件或本软件的使用或其他交易有关软件。