2015-12-15 26 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