PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Systembefehle mit Java ausführen



jensz
23-01-2007, 11:41
Hallo,

hat jemand von Euch ne Ahnung, ob es möglich ist, mit Java Windows Befehle auszuführen. Ich weiß, dass das ganze dann nicht mehr plattformunabhängig ist, aber das will ich ja auch gar nicht...
Ich möchte aus dem Programm heraus nachher einfach Befehle wie "net use t: lalala" usw. ausführen.

Danke schonmal!

bischi
23-01-2007, 11:43
Geht glaub ich... Musst mal nach robots suchen.

MfG Bischi

Waxolunist
23-01-2007, 12:16
Du suchst nach java.lang.Runtime.

Robots sind eher für Befehle dazu da, die sagen wir jetzt einen Mausklick oder einen Tastendruck simulieren.

MW10
08-02-2007, 12:21
@Waxolunist Du suchst nach java.lang.Runtime.

Auch auf die Gefahr hin das die Frage dumm ist(beschäftige mich erst seit kurzem mit Java), aber:
Wie bekomm ich das mit "java.lang.Runtime" hin das ich befehle wie net use ausführen kann?

Liberty
08-02-2007, 13:57
Moin,

grundsätzlich: Die API-Dokumentation ist Dein Freund, da findest Du alles, was Du brauchst. Ok, für Deinen Fall, hier mal ein Beispiel:



public class Test
{

public static void main(String[] args)
{
try
{
Runtime rt = Runtime.getRuntime();
rt.exec("mkdir Test");
}
catch(Exception e)
{
System.out.println("Exception");
}
}

}


Bitte drauf achten, der Output des aufgerufenen Prozesses wird unterdrückt, falls Du den brauchst, musst Du in der Dokumentation nachschauen, wie Du den umleiten kannst.

So long,

Liberty

P.S.:
Ich sitz an einer Linuxmaschine, deshalb mkdir als Beispiel.

MW10
08-02-2007, 14:13
Jo es klappt :) , danke für die Hilfe.

Liberty
08-02-2007, 14:29
Moin,

schön, dass wir helfen konnten, aber ich habe jetzt mal aus jugendlichem Übermut versucht den Output des Prozesses (und erzählt mir nicht, mkdir hätte keinen Output, ich habe ja genau deswegen jetzt ls genommen ;-) ) auf den ganz normalen System.out umzuleiten, aber ich habe irgendwie ein Brett vorm Kopf.
Kann mir bitte kurz jemand erklären, wie das geht, danke!

So long,
Liberty

Waxolunist
08-02-2007, 15:05
Mal so aus der Hüfte geschossen.

In der API steht, dass dir rt.exec ein Process-Objekt zurückliefert. Das hat ein paar Methoden, wie getOutputStream oder getErrorStream.

Wär das nicht was?

mfg, Christian

Liberty
08-02-2007, 16:07
Moin,

schon probiert, aber das hat ja eben bei mir nicht funktioniert...

Ich hab die folgende Konstruktion versucht:



import java.io.PrintStream;

public class Test
{

public static void main(String[] args)
{
try
{
Runtime rt = Runtime.getRuntime();
Process prc = null;
PrintStream alt = System.out;
System.setOut(new PrintStream(rt.exec("ls").getOutputStream()));
System.setOut(alt);
System.out.println("----Test----");
}
catch(Exception e)
{ System.out.println("Exception"); }
}

}


Es wird bei Ausführung nur die Testzeile angezeigt...

Ich glaube, ich mache die ganze Zeit einen ganz entscheidenden Denkfehler im Umgang mit den Streams aber irgendwie komme ich nicht drauf :(

So long,
Liberty

P.S.:
Könnte aber auch sein, dass ich irgendetwas mit der Synchronisation der beiden Prozesse übersehen habe, also dass z.B. der ls-Prozess seine Ausgabe schon längst beendet hat, bevor der Stream überhaupt umgeleitet wurde oder irgendetwas anderes in die Richtung...
P.P.S. @MW10:
Lass Dich nicht verwirren, diese ganzen Gedankenspielen haben nichts mit Deinem Problem zu tun, solange Du nur einen einfachen Systembefehl loswerden willst, der nicht mit Deinem Java-Programm synchronisiert werden muss, kann Dir das Thema egal sein.

anda_skoa
08-02-2007, 17:52
Der getOutputStream() ist, wie Name und Typ schon sagen, ein OutputStream, da kann man also etwas reinschreiben.

D.h. das geht an den Standardinput des Programms.

Du willst die Standardausgabe des Programms lesen, also brauchst du den entsprechenden InputStream

Ciao,
_

MW10
09-02-2007, 12:48
@Liberty
naja, aber genau das ist der nächste Schritt der in dem Programm kommen soll :rolleyes:

Bin grade noch am basteln/suchen. Soll angeblich mit "InputStreamReader"
funktionieren.