1

TL;DR 如何将字符串发送到 cmd.exe,执行 grep/findstr 或排序,然后使用 popen 打印输出?

我有一个客户端和服务器设置。用户输入命令,例如'list X: | grep name',然后将其分解为 'list X:' 和 'grep name'。'list X:' 被发送到服务器,然后服务器执行一个列表函数并返回一个包含列表结果的 char[]。然后,客户端需要将其输入 cmd.exe 并对该数据执行“grep name”命令并将其打印给用户。我不需要将数据从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);
              }
           }
        }
        ...
4

2 回答 2

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));
于 2013-09-14T07:11:03.667 回答
0

好吧,如果您的应用程序已经作为控制台运行,您可以使用在 CMD 上执行命令的函数system(),如果没有,您可以使用AllocConsole()模拟控制台,然后使用 system(),如果你想真正模拟,你可以使用管道

于 2013-09-17T00:29:22.790 回答