Lösungsvorschläge für eine Shell
-
Hallo, ich habe hier einmal mein Projekt xmd-tools (www.xmd-tools.de.vu) vorgestellt, alle Befehle befinden sich im Unterordner bin\. Die Shell führt alle Befehle in diesem Ordner aus, jetzt möchte eine Art Umgebungsvariable für auszuführende Befehle/Programme erstellen, damit man auch andere Pfade setzen kann so ist die Shell flexibler und kann auch andere Befehle ausführen.
Beispiel: Die Umgebungsvariable bin soll alle Pfade mit einem bestimmten Zeichen z.B. ; trennen:
C:\xmd-tools\bin;C:\Windows\system32;C:\windows;...Hier wird zuerst der eingegebene Befehl im Pfad 1 durchsucht, wenn dieser nicht gefunden oder ausgeführt wegen kann, geht dieser weiter zum 2. Pfad usw...ähnlich wie bei VS2005 mit den Include Pfaden.
Problem:
1) Wo würdet ihr so eine Umgebungsvariable erstellen, also wo sollte dieser stehen, eher in der Registry oder als eine Art Config Datei?2) Wie kriege ich raus ob der Befehl ausgeführt wurde, damit in den anderen Pfaden weitergesucht wird?
Beispiel: Ich gebe den Befehl net view ein, zuerst wird im Pfad: C:\xmd-tools\bin nachgeschaut, doch dieser Befehl befindet sich nicht dort und sucht weiter in C:\Windows\system32 dieser wird gefunden und ausgeführt.Bitte um Tipps
-
-
Ich vermute, dem typischen CLI-Sheller ist eine config.ini näher als Registry-Keys.
-
Wenn in diesem Verzeichnis die Datei vorhanden ist, brichst du die Schleife ab.
-
-
1. Lade einfach ein Shell-Skript, wenn die Shell geöffnet wird. Da kann der Benuter dann sein bin hinpacken. So wird das zumindest unter Unix gemacht
2. Einfach schauen ob die Datei im Verzeichnis vorhanden ist.
btw. findest du das nicht ein bisschen merkwürdig, wenn du das Symbol eines anderen Projektes für dein Projekt klaust, vor allem wenn das eine Projekt Linux ist und du eine Windows-Software schreibst?
-
Danke erstmal für die Tipps
btw. findest du das nicht ein bisschen merkwürdig, wenn du das Symbol eines anderen Projektes für dein Projekt klaust, vor allem wenn das eine Projekt Linux ist und du eine Windows-Software schreibst?
Bin auch Linux User, ich wollte mir eine Shell basteln welche unter Windows läuft, deshalb hab ich den Pingu genommen, naja aber ganz zufrieden bin ich damit auch nicht. Wollte eigentlich ein Icon mit einer Prompt, wie kann man Icon selbst erstellen, gibt es hierfür spezielle Programme'?
-
Hallo erstmal, ich habe weiter an dem Problem mit dem Pfaden, so dass der eingegebene Befehl in den jeweiligen Pfaden ausgeführt wird. In einer INI-Datei befindet sich der key bin:
[shell] bin=c:\xmd-tools\bin; c:\windows\system32; c:\windows; ...Hierbei wird der eingegebene Befehl zuerst versucht im Pfad c:\xmd-tools\bin auszuführen, wenn nicht soll dieser weiter gehen. Mein Problem ist es jetzt wenn sich der Befehl im ersten Ordner befindet wie breche ich dann die Schleife ab?
Kurzer Einblick bei der Verarbeitung und Ausführung:
Befehl einlesen -> str parseComman(str) //Prüft ob Befehl Aliase ist,... | + - linkCommand(str) // Auslesen der Pfade aus INI -> bin=... dann weiterleiten | + - createCommand(path, str) // Pfad und Befehl zusammensetzen | + - execCommand(str) // Führt den Befehl mit system() ausWie Ihr seht sind mehrere Funktionen erforderlich, da meistens in Schleifen die weiteren Unterfunktionen aufgerufen werden. In der Funktion linkCommand() wird die Unterfunktion createCommand() aufgerufen:
for(int i = 0; i < token.size(); i++) { createCommand(token[i], str); }token[i] ist jeweils der Pfad der in bin steht, und str ist der eingegebene Befehl. Wie kann ich jetzt die for schleife beenden wenn der Befehl ausgeführt wurde? Noch ein Problem, wenn der befehl nicht gleich im ersten pfad ist dann wird mehrere male die typische Fehlermeldung von cmd ausgegeben:
Der Befehl "..." ist entweder falsch geschrieben.....
Der Befehl "..." ist entweder falsch geschrieben.....
....Liegt es an der Funktion system()?
-
Kann mir bitte jemand helfen, ich bin ganz wild darauf meine Shell fertig zu erstellen. Ich will versuchen die Befehle mit CreateProcess() zu erstellen welche in der Funktion execCommand() ausgeführt wird. Der Rückgabewert ist der Statuswert ob der Prozess gestartet wurde, hierbei wird dieser Wert an linkCommand() zurückgegeben und dann die For-Schleife beendet.
//linkCommand()
for(int i = 0; i < token.size(); i++) { int stat = createCommand(token[i], str); if(stat == 1) break; else cout << "Nicht gefunden, weiter suchen..." << endl; }//execCommand()
int execCommand(string Command) { STARTUPINFO siStartupInfo; PROCESS_INFORMATION piProcessInfo; memset(&siStartupInfo, 0, sizeof(siStartupInfo)); memset(&piProcessInfo, 0, sizeof(piProcessInfo)); siStartupInfo.cb = sizeof(siStartupInfo); int stat = CreateProcess(NULL, cvt.StringToChar(Command), 0, 0, TRUE, REALTIME_PRIORITY_CLASS, 0, 0, &siStartupInfo, &piProcessInfo); CloseHandle(piProcessInfo.hProcess); CloseHandle(piProcessInfo.hThread); cout << "STAT:" << stat << endl; if(stat) return true; else return false; }Mein einziges Problem ist jetzt, wenn ich z.b. ein windows befehl eingegebe wie z.B. ipconfig oder net view wird die ausgabe später in der Konsole ausgegeben als mit system(). Ich glaube es liegt daran das CreateProcess() einen neuen Prozess erstellt und in der gleichen Zeit meine Shell wieder die PRompt ausgibt, ich hoffe ihr versteht mich.
Wie kann ich der Shell sagen sie soll so lange warten bie der Prozess etwas ausgibt dann kann sie weiter arbeiten, so wie bei system()Bitte um Hilfe!!!
-
kernel64 schrieb:
Wie kann ich der Shell sagen sie soll so lange warten bie der Prozess etwas ausgibt dann kann sie weiter arbeiten, so wie bei system()
'WaitForSingleObject(process_handle, INFINITE);' würde warten, bis der prozess sich beendet hat. nachteil ist halt, das man's nicht abbrechen kann. jedenfalls fällt mir jetzt nicht ein wie...
:xmas2:
-
Danke, es klappt alles prima nur es gibt noch ein Schönheitsfehler, wenn ein Prozess gestartet wird, so wird es auch ausgegeben doch meine Prompt Leiste fehlt.
Also sie fehlt nicht richtig ich muss nur einmal Enter drücken dann ist sie wieder da, aber trotzdem dürfte das nicht passieren, überschreibt CreateProcess() vielleicht STDOUT?Beispiel: Ich gebe net view ein, so sollte es Aussehen:
Eingabe>net view //Ausgabe Eingabe>Doch mit meinem Code wird die letzte PRompt Zeile wahrscheinlich von CreateProcess() überschrieben:
Eingabe>net view //Ausgabe //erst bei ENTER ist die prompt da