tl;dr - 尝试使用任何编程语言无法捕获使用远程服务器的RPC的命令的输出,即使这些命令在手动输入时会返回到命令提示符
我有一个函数,它使用fpipe来发出netsh命令以显示DHCP服务器的统计信息。 我在程序中的其他位置也使用了相同的fpipe缓冲区读取技术,但是在这里我根本没有得到任何输出:
编辑:我将代码简化为更多的概念证明类型片段。它实际上是一个完全包含的.cpp源文件,仍然重现了这个问题。
#include <iostream>
#include <string>
#include <stdio.h> // for _popen() and _pclose()
using namespace std;
int main()
{
char buff[512];
buff[0]=0;
string cmd="netsh dhcp server 192.168.200.15 scope 192.168.200.0 show clients 1";
FILE *fpipe = _popen(cmd.c_str(),"r");
if(fpipe==NULL) cout<<"Failed to open"<<endl; else cout<<"Opened pipe successfully";
while(fgets(buff,sizeof(buff),fpipe)!=NULL) cout<<buff<<endl;
_pclose(fpipe);
}
我得到的唯一输出是:
Opened pipe successfully
但是,如果我将该命令复制/粘贴到另一个命令提示符窗口中,它就能成功运行并立即输出许多行。
那么它去哪了?为什么我的缓冲区里面没有任何东西?
此外,将"netsh"更改为"dir"命令的字符串将成功输出dir的输出。
编辑:即使是system(cmd.c_str());
也没有输出!
编辑:奇怪的是,cmd="netsh dump";
实际上可以正常输出,但是cmd="netsh dhcp server...
却不能。CMD路由netsh文本的方式有点奇怪,或者是其他问题?这已经超出了我的舒适区了。
编辑:显然,这是一个超出C++范畴的问题,因为当我在Python 2.7 shell中(顺便说一下,这是Windows 7 64位系统)时,我尝试了以下操作:
>>> import subprocess
>>> subprocess.call('dir', shell=True)
Volume in drive C has no label.
Volume Serial Number is 2E2B-B34F
Directory of C:\MyDir
09/30/2013 01:24 PM <DIR> .
09/30/2013 01:24 PM <DIR> ..
09/20/2013 10:11 AM 45 test.txt
1 File(s) 45 bytes
2 Dir(s) 162,260,246,528 bytes free
0
>>> subprocess.call('netsh dhcp server 192.168.200.15 scope 192.168.200.0 show clients 1', shell=True)
0
>>>
string cmd="netsh dhcp server 192.168.200.15 scope "+scopes[x]+" show clients 1 > out.txt"
这行代码会将输出写入到对应文件吗? - t7bdh3hdhb