我正在尝试实时显示命令的结果。我已经能够检索结果,但我想要一个实况流。每当我在代码中放入while循环来重复该命令时,就会打开一个窗口,执行该命令,然后关闭该窗口,然后打开另一个窗口,重复该过程,直到程序崩溃。我希望命令提示符在接收命令时在后台运行,因为我在它前面运行的是一个QT gui。
下面是我目前的代码:
cmd = _popen("snmpget -v 2c -c public 192.168.127.101 .1.3.6.1.4.1.8691.8.4.6.1.1.3.1.1.4.1", "r"); //input command in format (snmp_function -v version -c community_string IP_address OID)
if (cmd == NULL)
{
perror("_popen");
exit(EXIT_FAILURE);
}
while (fgets(result, sizeof(result), cmd)) //gets full responce string to snmpget and passes string to result variable
{
std::string str = result; //sets string to values in variable result
std::regex rgx("\"([^\"]*)\""); //retrieves only the section of the output string that is between double air quotes
std::smatch match;
std::string buffer;
std::stringstream ss(str);
std::vector<std::string> strings;
//necessary? whitespace
while (ss >> buffer)
strings.push_back(buffer);
for (auto& i : strings)
{
if (std::regex_match(i, match, rgx))
{
std::ssub_match submatch = match[1];
std::string str = submatch.str();
for (size_t j=0; j<str.length(); j++)
{
output[j] = str[j];
}
}
}
}
_pclose(cmd);
std::string
只是为了得到我想要的那部分返回值。我通常可以通过在while
循环的末尾放入一个getchar()
来保持窗口打开,但我不希望依赖于用户按enter来获得更新的结果。
发布于 2018-07-26 06:06:37
我建议您在执行第一个命令时使用嵌套cmd。类似于:
cmd.exe /c cmd.exe /k "Put the command you want to execute here!"
我不确定是否有必要引用该命令,但我知道它确实适用于引号,因此这意味着您需要将第一行更改为:
cmd = _popen("cmd.exe /c cmd.exe /k \"snmpget -v 2c -c public 192.168.127.101 .1.3.6.1.4.1.8691.8.4.6.1.1.3.1.1.4.1\"", "r"); //Note the escaped quotes
以上是未经测试的,但我相信它应该会给你预期的结果。请注意,这将每次打开一个内部cmd,因此使用此解决方案时,您可能希望跟踪出口。基本上,对于不是第一个命令的每个命令,您都需要发送exit来关闭该内部->内部cmd。
https://stackoverflow.com/questions/51528047
复制相似问题