Mehrere Befehle ausführen...



  • Hallo Leute ich habe vor eine Art Shell zu schreiben, bei der Befehle eingeben werden. Hierbei sollen Windows sowie meine eignen Befehle gestartet werden.
    Ein Beispiel, ich will unter WinXP die Festplatte defragmentieren und danach soll Windows heruntergefahren werden, die Eingabe soll ungefähr so aussehen:

    //shutdown ist ein eigenes Programm...

    defrag c: -f | shutdown

    Also als erstes soll defragmentiert werden, das Zeichen '|' soll beim parsen des Eingegebenen strings helfen um andere Befehle auszuführen. Das Problem hier wenn ich mit system() arbeite und das oben eingebe dann bekomme ich Fehler wegen dem '|' Zeichen da dies als Umleitung dient. Ich könnte auch ein anderes Zeichen nehemen.
    Könntet Ihr mir bitte Tipps geben, wie man sowas realisieren könnte und nebenbei welches Zeichen würdet Ihr nehmen um die Befehle zu teilen?



  • Versuch so etwas:

    Eine Schleife, die die Befehle in ein Array schreibt und die "|" weglässt.
    Dann musst du nur eine andere Schleife laufen lassen, die die einzelnen Befehle ausführt 😉



  • kernel64 schrieb:

    Könntet Ihr mir bitte Tipps geben, wie man sowas realisieren könnte und nebenbei welches Zeichen würdet Ihr nehmen um die Befehle zu teilen?

    Also ich würde den Befehlsstring einfach in Schleifen nach Befehlen 'abparsen'^^ und dann entsprechend abarbeiten...

    Außerdem würde ich optionale Zeichen zum trennen, also bsp.: | und ,
    Und sinnvoll wäre vllt auch, das man das einstellen kann...ich bin ein Freund von Flexibilität 😉 .



  • Meine Eingabe:

    //Befehl mit Parameter einlesen
    getline(cin, str);
    
    istringstream cmdline (str);
    string input;
    vector<string> params;
    
    if (cmdline >> input) 
    {
    string tmp;
    while (cmdline >> tmp) 
    {
    	params.push_back (tmp);
    }
    
    //...
    

    Wie schon gesagt in der Shell kann man einzelne Befehle ausführen und jetzt möchte ich mit bestimmten Trennzeichen mehrere solcher Befehle ausführen.

    Ein Beispiel, hier wird winamp.exe sofort beendet und der PC heruntergefahren:

    >kill winamp.exe | shutdown
    

    Jetzt habe ich ein Code der nach dem '|' Trennzeichen in str sucht und als Rückgabe die einzelnen Token zurückgibt:

    if(str.find("|") != string::npos)
    {		
    //Rückgabe der einzelnen strings
    vector<string> token = split(str,"|");
    
    string sToken;
    for(int i = 0; i < token.size(); i++)
    {		
    	sToken = token[i];
    }  	
    }
    
    token[0] = kill winamp.exe
    token[1] = shutdown
    

    Mein Problem:
    Wie kann ich die einzelnen Token weitergeben, damit sie weiter verarbeitet werden so als wären es normale Befehle.
    Ich dachte mir ich baue die Suchfunktion so ein:

    else if (cmdline >> input) 
    {
    if(str.find("|") != string::npos)
    {		
    //Rückgabe der einzelnen strings
    vector<string> token = split(str,"|");
    
    string sToken;
    for(int i = 0; i < token.size(); i++)
    {	
    	cout << token[i] << endl;	
    	sToken = token[i];
    }  	
    }
    
    string tmp;
    while (cmdline >> tmp) 
    {
    	params.push_back (tmp);
    }
    
    //...
    

    Wie weise ich cmdline sToken zu, damit dieser weiterverarbeitet wird?



  • Habs mit der Zuweisung geschafft:

    //...
    string sToken;
    for(int i = 0; i < token.size(); i++)
    {	
    cout << token[i] << endl;	
    sToken = token[i];
    }  
    //Zuweisung
    cmdline.str(sToken);	
    //...
    

    Bei dem Code müssten alle Befehle in der Schleife ausführt werden, da jedes Token abgearbeitet wird, dabei wird erst der Befehl ausgeführt und es werden weitere Vergleiche durchgeführt.

    Ist es möglich den weiteren Codeinhalt strukturierter aufzubauen, so dass ich nicht den halben Code in die Schleife reinkopieren muss?


Anmelden zum Antworten