Entwickler-Ecke
Basistechnologien - popen() ?
sharpx - Mo 05.01.09 14:37
Titel: popen() ?
Folgende Situation:
Ich bekomme von einem Client systemnahe Befehle wie: dir, cd, help, etc.
Diese sollten ausgeführt werden. Wie kann ich das am besten realisieren?
System.Threading.Thread.Start() hilft hier nicht wirklich.
danke für die hilfe
Moderiert von
Christian S.: Topic aus C# - Die Sprache verschoben am Mo 05.01.2009 um 13:43
jaenicke - Mo 05.01.09 14:43
Was ist denn jetzt genau das Problem? Das Ausführen der Befehle? Wie du sie von dem Client bekommst? :gruebel:
sharpx - Mo 05.01.09 14:53
1) Muss ich die Antwort der Befehle dem Client zurück senden. Dies geht nicht mit einem System.Thread.Thread.Start()
2) Die Lösung befehl + "> out.txt" und dann out.txt auslesen und dem Client senden:
a) Funktioniert nicht weil er "out.txt" nicht finden kann... verstehe das selber nicht ganz
b) wäre sehr unschön.
Es muss doch sowas wie popen() geben, wo ich nicht die Kontrolle des auszuführenden Programmes verliere?
JüTho - Mo 05.01.09 15:36
Hallo,
es geht auch mit einer Console-Anwendung. Der Eingabe-Stream In und vor allem der Ausgabe-Stream Out können umgeleitet werden; dadurch kannst Du auch die Ergebnisse eines Befehls wie dir abfragen. (Aber das habe ich noch nie gemacht, kann deshalb nicht mehr sagen.)
Gruß Jürgen
sharpx - Mo 05.01.09 16:46
Dann bin ich wohl mal richtig mit dem Code hier:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33:
| public static void p_OutputDataReceived(object sender, DataReceivedEventArgs e) { cmdvalue = e.Data; Console.WriteLine(cmdvalue); StreamWriter sw = new StreamWriter("out.txt"); sw.Write(cmdvalue); sw.Close(); }
public static string execute_p (string cmd) { string tmp = ""; try { Process p = new Process(); p.StartInfo.UseShellExecute = false; p.StartInfo.RedirectStandardOutput = true; p.StartInfo.FileName = cmd; p.OutputDataReceived += new DataReceivedEventHandler(p_OutputDataReceived); p.Start(); p.BeginOutputReadLine(); return cmdvalue; } catch { return "error"; } } |
Jedoch!
der Rückgabewert von cmdvalue ist einfach leer! Wenn ich jedoch Console.WriteLine(cmdvalue) vor return cmdvalue; mache, seh ich das ergebnis des befehls. (cmdvalue ist global als static string cmdvalue = ""; definiert)
der andere versuch war das ergebnis in eine datei zu schreiben.
egal ob ich sw.Write() oder sw.WriteLine() verwendet, die Datei blebit immer leer?
Irgendwas stimmt hier doch nicht? :(
Danke für die Hilfen
Moderiert von
Christian S.: Code- durch C#-Tags ersetzt
jaenicke - Mo 05.01.09 16:54
Ich werde gleich mal schauen, aber ich vermute, dass deine Prozedur einfach bereits beendet ist bevor das Event ausgelöst wird. Und dann wäre der Wert ja noch leer.
Du musst ereignisorientiert denken. ;-)
Das andere Problem: Du startest jedesmal einen neuen Prozess für jeden Befehl. Wie ich bereits sagte bringt dir das nichts bei einigen Befehlen. Bei cd wie in deinem oben genannten Beispiel wird bspw. das Arbeitsverzeichnis des Prozesses gewechselt. Also der laufenden cmd.exe. Jetzt wird diese beendet und damit ist die Wirkung auch verloren.
Du musst entweder die Befehle selbst verarbeiten (bei dir und cd usw. ginge das ja sehr einfach) oder einen Prozess cmd.exe bis zum Ende behalten und nur Ein- und Ausgaben damit verarbeiten.
sharpx - Di 06.01.09 19:28
Kannst du mir da ein Codebeispiel liefern?
Danke!
jaenicke - Di 06.01.09 20:37
Für was von dem was ich gesagt habe? :lol:
Wo ist denn konkret das Problem gerade? :gruebel:
sharpx - Di 06.01.09 22:36
jaenicke hat folgendes geschrieben : |
Für was von dem was ich gesagt habe? :lol:
Wo ist denn konkret das Problem gerade? :gruebel: |
Immer noch das selbe Problem:
| Zitat: |
Jedoch!
der Rückgabewert von cmdvalue ist einfach leer! Wenn ich jedoch Console.WriteLine(cmdvalue) vor return cmdvalue; mache, seh ich das ergebnis des befehls. (cmdvalue ist global als static string cmdvalue = ""; definiert)
der andere versuch war das ergebnis in eine datei zu schreiben.
egal ob ich sw.Write() oder sw.WriteLine() verwendet, die Datei blebit immer leer?
Irgendwas stimmt hier doch nicht? :(
|
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!