# MS-DOS-Befehle ausführen



## Reality (24. Mrz 2004)

Hi,
ich möchte ein kleines Netzwerktool basteln und ich habe mich ein bisschen informiert, wie man MS-DOS-Befehle über JAVA ausführen kann.
Hab da auch was gefunden:

```
import java.io.*;

public class StartKlasse {
  public static void main(String[] args) {
  try{
  Process proc = Runtime.getRuntime().exec("cmd /c dir");
  BufferedReader in=new BufferedReader(new InputStreamReader (proc.getInputStream()));
  while(in.readLine()!=null){
  System.out.println(in.readLine());
  }
  }catch(Exception e){
  e.printStackTrace();
  }
  }
}
```

Ist jetzt nicht das Original, aber es geht. Wenn ich jetzt statt /c dir z.B. ipconfig eingebe oder format a:, dann öffnet sich nur das DOS-Fenster und das war´s auch schon.

Weiss jemand, wo der Fehler liegt?

Liebe Grüße
Reality


----------



## Roar (24. Mrz 2004)

lass das "cmd" weg und gib nur den befehl an also exec("format a;");
da dieser befehl direkt darauf zugreift ändert das nix. und be ider while schleife solltest du warten bis readLine -1 ist anstelle von null


----------



## Reality (24. Mrz 2004)

Hi,
dieser Code geht nicht:

```
Process proc = Runtime.getRuntime().exec("format a:");
  BufferedReader in=new BufferedReader(new InputStreamReader (proc.getInputStream()));
  while(in.readLine()-1){
  System.out.println(in.readLine());
```
Wenn ich nur in Process proc = Runtime.getRuntime().exec("format a:"); verändere, kommt folgende Fehlermdeldung:

```
ava.io.IOException: CreateProcess: format a: error=2
	at java.lang.Win32Process.create(Native Method)
	at java.lang.Win32Process.<init>(Win32Process.java:66)
	at java.lang.Runtime.execInternal(Native Method)
	at java.lang.Runtime.exec(Runtime.java:551)
	at java.lang.Runtime.exec(Runtime.java:418)
	at java.lang.Runtime.exec(Runtime.java:361)
	at java.lang.Runtime.exec(Runtime.java:325)
	at StartKlasse.main(StartKlasse.java:6)
```

Wenn ich auch noch die While-Schleife verändere:

```
"StartKlasse.java": Fehler #: 375 : Operator - kann nicht auf (java.lang.String, int) angewandt werden in Zeile 8, Spalte 22
```

Liebe Grüße
Reality


----------



## Roar (24. Mrz 2004)

*handvorkopfschlag*

while(in.readLine() != -1) vielleicht ?
und warum das nicht geht weiß ich nicht. liegt wohl an windoof

und hast du es schon mit "dir" ausprobiert?


----------



## Reality (24. Mrz 2004)

Roar hat gesagt.:
			
		

> *handvorkopfschlag*


Werd mir nicht frech, weil:


> while(in.readLine() != -1) vielleicht ?


das auch nicht funktioniert. BufferedReader ist eben kein Zahlentyp.
Habe das schon vorher ausprobert. Warum eigentlich -1?


> und hast du es schon mit "dir" ausprobiert?


Ja, wie beim ersten Posting schon erwähnt.

Liebe Grüße
Reality


----------



## Roar (24. Mrz 2004)

also ich hab das z.b. so und es funktioniert:


```
// aus meinem programm
// command == "C:\\einprogramm.exe";
	     try {
	        Process p = Runtime.getRuntime().exec(command);
	        InputStream is = p.getInputStream();
	int c;
	while((c = is.read()) != -1) {
	// does nothing
// oder
System.out.print((char) c );
	}
	     }catch(Exception ex) { 
	     JOptionPane.showMessageDialog(this,"Could not start program "+command+"!\nProgram or shell command \"" +command+"\" not found.\nError caused by: "+ex.getMessage(),"Error", JOptionPane.ERROR_MESSAGE);
	     }
```

darum hatte ich auch -1 im kopf, sorry

edit: hmm komisch. Dos Kommandos gehen nicht, aber wenn command == "java -h"; dann funktioniert es.


----------



## bygones (24. Mrz 2004)

Roar hat gesagt.:
			
		

> *handvorkopfschlag*
> 
> while(in.readLine() != -1) vielleicht ?
> und warum das nicht geht weiß ich nicht. liegt wohl an windoof
> ...




```
readLine

public String readLine()
                throws IOException

    Read a line of text. A line is considered to be terminated by any one of a line feed ('\n'), a carriage return ('\r'), or a carriage return followed immediately by a linefeed.

Returns:
A String containing the contents of the line, not including any line-termination characters, or null if the end of the stream has been reached
```

Also nix mit -1 !!


----------



## Roar (24. Mrz 2004)

grtml hab ich doch gesagt oben, weil ich in meinem code zeichenweise gelesen hab


----------



## bygones (24. Mrz 2004)

Roar hat gesagt.:
			
		

> grtml hab ich doch gesagt oben, weil ich in meinem code zeichenweise gelesen hab


sorry - habe geantwortet ohne vorher zu aktualisieren - daher nicht gesehen !


----------



## Reality (24. Mrz 2004)

Hi,
dein Code funktioniert jetzt. Macht im Grunde genommen nichts anderes als mein alter Code.
Frage: Die Schleife macht es solange, bis int den Wert -1 erreicht hat. Wieso erreicht int überhaupt den Wert -1? ???:L 

Liebe Grüße
Reality

PS: Ja, viele Konsolenbefehle gehen immernoch nicht.


----------



## Roar (24. Mrz 2004)

hm komisch dasses nicht geht  ???:L 
die read() methode gibt einen integer zurück der den ascii wert darstellt. und wenn nix mehr da ist zum lesen gibt read() halt -1 zurück.


----------



## Reality (31. Mrz 2004)

Hi,
würde mich immernoch interessieren, wie das geht.

Liebe Grüße
Reality


----------

