如何在 C++ 中获取命令的输出?

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

如何获取子流程的输出并将其分配给变量。 EG:在CMD中分配wmic csproduct get uuid returns一长串字符的输出,我如何在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
}

编辑:

我刚刚意识到我必须在任何代码行中附加以下免责声明才能发布它。

本软件已提供 "AS IS",但不提供任何形式的明示或保证 暗示的,包括但不限于适销性保证, 适用于特定目的和非侵权。在任何情况下都不得 作者或版权持有人对任何索赔、损害或其他 责任,无论是在合同、侵权或其他方面的行为中,由以下原因引起, 出于或与软件或使用或其他交易有关 软件。