如何在 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",但不提供任何形式的明示或保证
暗示的,包括但不限于适销性保证,
适用于特定目的和非侵权。在任何情况下都不得
作者或版权持有人对任何索赔、损害或其他
责任,无论是在合同、侵权或其他方面的行为中,由以下原因引起,
出于或与软件或使用或其他交易有关
软件。
如何获取子流程的输出并将其分配给变量。 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",但不提供任何形式的明示或保证 暗示的,包括但不限于适销性保证, 适用于特定目的和非侵权。在任何情况下都不得 作者或版权持有人对任何索赔、损害或其他 责任,无论是在合同、侵权或其他方面的行为中,由以下原因引起, 出于或与软件或使用或其他交易有关 软件。