如何在C ++中输出命令?

时间:2016-11-11 07:07:57

标签: c++ winapi uuid wmic

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

2 个答案:

答案 0 :(得分:0)

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

  • 将其重定向到文件,然后稍后阅读该文件。
  • 使用烟斗。

标准库不支持管道,除了隐藏在公共流抽象之后。实际上,这意味着创建进程B的进程A无法通过管道与B通信,除非使用特定于平台的功能。在Windows中,脚本支持Windows脚本宿主具有管道方法的直接功能,基于轮询来自B的输出。在更低的级别,您可以使用CreateProcess API函数。但这样做并非易事。

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

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

cmd /c "b.exe >tempfile"

您可以通过C ++ system执行此类命令。 system函数已经通过命令intepreter执行指定的命令,该命令在Windows中为cmd.exe。所以system的论证只需要

b.exe > tempfile

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

您可以通过tmpnam功能创建新的临时文件名。

答案 1 :(得分:-4)

我认为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
}

编辑:

我刚刚意识到在发布之前我必须将以下免责声明附加到任何代码行。

本软件按原样提供&#34;不提供任何形式的保证,不论是 暗示,包括但不限于对适销性的保证, 适用于特定用途和不侵权的适用性。在任何情况下都不应该 作者或版权所有者对任何索赔,损害或其他内容负责 无论是合同,侵权行为还是其他行为,由此产生的责任, 在软件之外或与之相关的软件或使用或其他交易 软件