如何获取子流程的输出并将其分配给变量。 EG:分配wmic csproduct get uuid
的输出在CMD中返回一长串字符,如何在C ++中运行该命令并将其分配给变量?
答案 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;不提供任何形式的保证,不论是 暗示,包括但不限于对适销性的保证, 适用于特定用途和不侵权的适用性。在任何情况下都不应该 作者或版权所有者对任何索赔,损害或其他内容负责 无论是合同,侵权行为还是其他行为,由此产生的责任, 在软件之外或与之相关的软件或使用或其他交易 软件