2015-12-15 3 views
0

Я хочу использовать командную строку (CMD.exe) для выполнения функции (например, «DIR»; CD ect.) И считывать результат. Я попробовал его с POPEN, но проблема в том, что я могу выполнить только 1 заказ. Что-то вродеC++ Выполнить командную строку и получить результат

cd .. 
dir 

не работал бы в пути, что я могу это сделать.

Вот мой «поддельный код», как я хочу сделать это

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

Я сделал это так. Objekt "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"); 


} 

Надежда Youre в состоянии понять мою проблему, мой английский разве что хорошо: $

Спасибо!

+1

Затем положить все в CMD-файл или .bat, и выполнить это. – OldProgrammer

+0

не будет работать для моей программы. – Maik

ответ

0

Вы должны понимать, что при использовании popen вы создаете новый процесс, а затем канал для этого процесса. Когда вы запускаете командную строку «cd ..», вы меняете только рабочий каталог этого процесса. Вы можете использовать popen столько раз, сколько хотите, но обязательно используйте pclose, когда закончите с ним.

Например, это будет основной оболочки:

#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

Например, чтобы изменить каталог, а затем получить dir – Maik

+0

Это невозможно сделать надежно по причинам, изложенным здесь http://stackoverflow.com/questions/5905574/how-to-get-the Окружающая среда-переменные-оф-а-подпроцесса-после-это заканчивает-бег – austere

Смежные вопросы