TL; DR如何将字符串发送到cmd.exe,执行grep / findstr或sort,然后使用popen打印输出?
我有一个客户端和服务器设置。用户输入命令,例如'列表X:| grep name',然后分成'列表X:'和' grep name'。 '列出X:'被发送到服务器,然后服务器执行列表函数并返回包含列表结果的char []。然后,客户端需要将其提供给cmd.exe并执行' grep名称'命令该数据并将其打印给用户。我不需要将数据从cmd返回到客户端进程,只需输出它。
我知道我的代码目前还没有尝试写(我在阅读模式下打开文件)但是我尝试过其他一些东西并且似乎无法发送数据到cmd.exe)
代码如下:
...
int n = recv(clientSocket, reply, sizeof(reply), 0);
std::string* cmdStr = new std::string(cmd);
cmdStr->erase(std::remove(cmdStr->begin(), cmdStr->end(), '\n'), cmdStr->end());
if(cmdStr->compare("") != 0) //Something to pipe to command
{
char pipeBuffer[8192];
FILE* pipe;
char c [8192];
strcat(c, "cmd.exe /C ");
strcat(c, reply);
strcat(c, " | ");
strcat(c, cmdStr->c_str());
if((pipe = _popen(c, "r")) == NULL)
{
printf("Unable to create pipe!\n");
}
while(!feof(pipe))
{
if(fgets(pipeBuffer, 8192, pipe) != NULL)
{
printf(pipeBuffer);
}
}
}
...
答案 0 :(得分:0)
我最后用这个修复它,以防万一其他人遇到类似的问题:
FILE* pipe;
if((pipe = _popen(cmdStr->c_str(), "w")) == NULL)
{
printf("Unable to create pipe!\n");
}
fprintf(pipe, "%s", reply);
printf("\nPipe process returned %d\n", _pclose(pipe));
答案 1 :(得分:0)
好吧,如果您的应用程序已经作为控制台运行,您可以使用在CMD上执行命令的函数system(),如果没有,您可以使用AllocConsole()模拟控制台,然后使用系统(),如果你想真正模仿,你可以使用pipes