Laden...

Dos-Befehle aufrufen

Erstellt von thomassa vor 19 Jahren Letzter Beitrag vor 18 Jahren 3.450 Views
thomassa Themenstarter:in
48 Beiträge seit 2005
vor 19 Jahren
Dos-Befehle aufrufen

Hallo,

ich möchte Dos-Befehle wie: ping, ipconfig oder netview aus meinem Programm aus aufrufen.
Ich möchte die "Dos übliche" Ausgabe weiterverwenden.
In C++ ging das z.B. mit --> System("ping www.google.de");
Aber einen vergleichbaren C# Aufruf habe ich noch nicht gefunden.

Danke für Eure Hilfe.

Gruß Sabine

"Versuche immer alles ein bißchen besser zu machen."
Zitat G.R.

P
939 Beiträge seit 2003
vor 19 Jahren

Hi Sabine,

in .Net gibt es dafür die Klassen System.Diagnostics.Process und System.Diagnostics.ProcessStartInfo. Mit ProcessStartInfo werden das zu startende Programm und dessen Einstellungen festgelegt. Über die Process-Klasse hat man Zugriff auf das laufende Programm.

MSDN: Process Class

Gruss
Pulpapex

thomassa Themenstarter:in
48 Beiträge seit 2005
vor 19 Jahren

Hallo pulpapex,

sieht ja mächtig kompliziert aus.

Verstehe ich es richtig: Ich muss diese Klasse verwenden um auf mein cmd.exe zu kommen. Dann kann ich da meinen Befehl eintragen... Und das geht alles so, dass der Bediener nachher nix davon mitkriegt?
Wichtig ist nämlich, dass der Bediener niemals Zugriff auf ein Dos-Fenster hat.

Ich werde mich mal da durchbeißen. Obwohl es sehr kompliziert aussieht und wohl nicht ganz "anfängergerecht" ist... 🙁

Gruß und danke
Sabine

"Versuche immer alles ein bißchen besser zu machen."
Zitat G.R.

P
939 Beiträge seit 2003
vor 19 Jahren

Es ist eigentlich gar nicht so kompliziert. Beispiel Google pingen:


Process p = new Process();
p.StartInfo.FileName = "ping";
p.StartInfo.Arguments = "www.google.de";
p.Start();

Soll kein Dos-Fenster angezeigt werden, fügt man noch folgendes ein:

p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardOutput = true;

Den umgeleiteten Standard-Output bekommt man über p.StandardOutput.

Gruss
Pulpapex

thomassa Themenstarter:in
48 Beiträge seit 2005
vor 19 Jahren

So, ich habe das jetzt mal versucht.

Mit folgendem Code kann ich die cmd.exe öffnen:


Process myProcess = new Process();

myProcess.StartInfo.FileName = "cmd.exe"; 
myProcess.StartInfo.CreateNoWindow = false;
myProcess.Start();

oder

Process.Start("cmd.exe");

Die erste Variante gefällt mir besser, da ich das Fenster auch im Hintergrund lassen kann.

Aber wie kriege ich jetzt irgendetwas in die Commandozeile? 🤔

Gruß
Sabine

"Versuche immer alles ein bißchen besser zu machen."
Zitat G.R.

thomassa Themenstarter:in
48 Beiträge seit 2005
vor 19 Jahren

Oh, grade sehe ich Dein Beispiel!

Werde das mal so probieren.

Warum findet man am Anfang solche Lösungen nicht. Ich sehe echt den Wald vor lauter Bäumen nicht mehr.

Gruß
Sabine

"Versuche immer alles ein bißchen besser zu machen."
Zitat G.R.

thomassa Themenstarter:in
48 Beiträge seit 2005
vor 19 Jahren

Hallo pulpapex,

habe das so ausprobiert wie Du es gepostet hast und jetzt kommt folgende Fehlermeldung:

⚠_Eine nicht behandelte Ausnahme des Typs 'System.InvalidOperationException' ist in system.dll aufgetreten.

Zusätzliche Informationen: StandardOut has not been redirected._

Ähm,
was ist da jetzt falsch?

So hab ichs gemacht:

p = new Process();
p.StartInfo.FileName = "ping";
p.StartInfo.Arguments = "pc013064";
p.Start(); 

p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardOutput = true; 

string str = p.StandardOutput.ReadLine();

Das ausgeführte Programm wird unterbrochen und string str = p.StandardOutput.ReadLine(); ist grün markiert und die Fehlermeldung (s.o) kommt.

Irgendwie hat der ping gar keine Zeit fertig zu werden. Kann es vielleicht daran liegen? Man kann es im Dos-Fenster sehen wie der Ping läuft und plötzlich vom Fehler unterbrochen wird. Ich habe versucht p.WaitForExit() zu verwenden, aber das klappt irgendwie auch nicht. Die Fehlermeldung kommt trotzdem.

Gruß
Sabine

"Versuche immer alles ein bißchen besser zu machen."
Zitat G.R.

E
100 Beiträge seit 2005
vor 19 Jahren

Für das p.Start erst aus, wenn du alle StartInfos zusammengetragen hast 🙂


p = new Process();
p.StartInfo.FileName = "ping";
p.StartInfo.Arguments = "pc013064";
p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardOutput = true;

p.Start();
string str = p.StandardOutput.ReadLine();

--
Man kann Scheisse nicht polieren!

P
939 Beiträge seit 2003
vor 19 Jahren

Tut mir leid, ich hätte den Code zusammenschreiben und den Text als Kommentar einfügen sollen. Die Umleitung muss vor dem Prozess-Start erfolgen:

p = new Process();
p.StartInfo.FileName = "ping";
p.StartInfo.Arguments = "pc013064";
p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardOutput = true;
p.Start();

string str = p.StandardOutput.ReadLine();
E
100 Beiträge seit 2005
vor 19 Jahren

übrigens solltest du statt


string str = p.StandardOutput.ReadLine();


string str = p.StandardOutput.ReadToEnd();

benutzen.... sonst bekommst du nicht alles. ...

--
Man kann Scheisse nicht polieren!

thomassa Themenstarter:in
48 Beiträge seit 2005
vor 19 Jahren

Hi,

hab das ganze jetzt so gemacht.

p = new Process();
p.StartInfo.FileName = "ping";
p.StartInfo.Arguments = "pc013064";
			
p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardOutput = true; 
p.StartInfo.CreateNoWindow = true;

p.Start(); 

string str = "";
string ausgabeString = "";

do
{
	str = p.StandardOutput.ReadLine();
	ausgabeString += str + "\n";
}while (null!=str);

p.Close();

Um allerdings gar kein Fenster zu bekommen musste ich noch p.StartInfo.CreateNoWindow = true; einfügen.

@Efftee ReadToEnd() ist natürlich viel eleganter. Das kannte ich noch gar nicht. Habs umgeschrieben und das ist viiiiel besser. 🙂

Danke! Danke! Danke!

Grüßle
Sabine

"Versuche immer alles ein bißchen besser zu machen."
Zitat G.R.

P
17 Beiträge seit 2005
vor 19 Jahren

Wieso fliegt er immer auf die Fresse, ich habe mehrere Parameter, und will so einen Registryexport tätigen, kann mir jemand helfen ?
greez bubu


string s="export KEY_CURRENT_USER\\... "+filename;
System.Diagnostics.Process proc = new System.Diagnostics.Process();
proc.EnableRaisingEvents = false;
proc.StartInfo.FileName = "reg";
proc.StartInfo.CreateNoWindow =true;
proc.StartInfo.Arguments = s;				
return proc.Start();

B
59 Beiträge seit 2005
vor 19 Jahren

Wieso fliegt er immer auf die Fresse

Wie meinen? Bitte etwas genauer!
Auf den ersten Blick stimmt das nicht -> proc.StartInfo.FileName = "reg";

Gruß Bewareofthis

N
42 Beiträge seit 2005
vor 18 Jahren

Hallo Leute,

ich will eigentlich genau das machen, was hier beschrieben wird. Habe es mit dem besprochenen Ansatz auch schon versucht.
Mein Problem ist aber, dass ich unter dem Compact Framework programmieren muss.
Dementsprechend gibt es

p.StartInfo.RedirectStandardOutput = true;

und


p.StandardOutput

leider nicht.
Gibt es trotzdem ne Möglichkeit auf diese Weise einen Ping abzusetzen und ein Ergebnis zu bekommen?

Die diversen anderen Möglichkeiten, die ich über die Board - Suche gefunden und ausprobiert habe, funktionieren leider auch nicht.
Bei IPHostEntry bzw. der Erstellung eines Sockets wirft er immer die Fehlermeldung Could not find Resource Assembly, obwohl System.dll logischgerweise vorhanden ist.

Wär schön, wenn mir jmd. helfen könnte. Bin schon recht verzweifelt.

Gruß
Nargo

S
8.746 Beiträge seit 2005
vor 18 Jahren

Guckst du hier:

http://www.hightechtalks.com/archive/index.php/t-1988855-how-to-set-the--ip_option_information-in-icmpsendecho.html

und fertiges Tool mit Code (leider C++, aber die Funktion kannst du dir abgucken):

http://www.codeguru.com/Cpp/W-P/ce/networking/article.php/c3541

Du brauchst in jedem Fall eine Helper-Lib, weil das CE-SDK keine Raw-Sockets unterstützt.