2015-12-15 44 views
0

我想使用命令行(CMD.exe)执行一个函数(如“DIR”; CD等)并读出结果。我用POPEN试了一下,但问题是,我只能执行1个命令。 像C++执行命令行并得到结果

cd .. 
dir 

wouldnt工作的方式,我这样做。

这里是我的“假代码”,我要怎么做,

Get Order from USER 
Execute in Commandline 
Print out the Result 
Jump to start 

我做的那样。对象“S”是我的套接字类的一部分。

while (1) 
{ 
    //GET THE ORDER 
    std::string r = s->ReceiveLine(); 

    if (r.empty()) break; 
    cout<<r<<endl; 
    //EXECUTE THE ORDER 
    FILE *fp = popen(r.c_str(),"r"); 

    char buf[2560]; 
    //READ THE RESULT AND SEND TO USER 
    while (fgets(buf, 2560, fp)) 
    { 
     s->SendBytes(buf); 
    } 

    s->SendLine("123++END"); 


} 

希望您选择能理解我的问题,我的心不是英语的好:$

谢谢!

+1

然后把一切都放在一个.cmd或.bat文件,并执行。 – OldProgrammer

+0

不适用于我的程序。 – Maik

回答

0

你必须明白,当你使用popen时,你正在创建一个新的进程,然后是一个到那个进程的管道。当你运行一个命令行“cd ..”时,你只会改变该进程的工作目录。你可以根据需要多次使用popen,但是在完成之后确保使用pclose。

例如,这将是一个基本的shell:

#include <cstdio> 
#include <iostream> 
#include <cstdlib> 
#include <string> 
using namespace std; 

int main() { 
    for (;;) { 
     cout << "% "; 
     string line; 
     getline(cin, line); 
     if (line == "exit") 
      break; 
     auto fp = popen(line.c_str(), "r"); 
     string out; 
     for (;;) { 
      char buf[512]; 
      auto n = fread(buf, 1, sizeof(buf), fp); 
      if (!n) 
       break; 
      out.append(buf, n); 
     } 
     pclose(fp); 
     cout << out; 
    } 
    return 0; 
} 
+0

该dosent帮助执行另一个功能, – Maik

+0

例如更改目录,然后得到目录 – Maik

+0

由于这里概述的原因,不能可靠地完成http://stackoverflow.com/questions/5905574/how-to-get-the -environment变量 - 对的一子,后它,结束运行的 – austere