# Programm welches auf CMD basirende Programme öffnet (Notepad), sucht , ausführt und compiliert



## PG_97 (30. Aug 2019)

Guten Morgen,
der Titel sagt eigentlich schon alles. Was ich hinzufügen muss, ist das ich ein Programm geschrieben habe, welches die obigen Tätigkeiten ausführt, da es lästig ist das ganze einzutippen. Allerdings läuft es noch nicht und ich komme nicht darauf was noch fehlt. Eine Klasse soll die Kommunikation ermöglichen, die andere das Suchen und die letzte ist die die ganze Arbeit macht
Über eure Hilfe bin ich dankbar. Noch eine kleine Anmerkung die SOEC ist meine eigene, der Rest ist Fertigcode und ja ich bin Anfänger und seit 4 Wochen dabei. Sämtliche Sachen sind in der .zip Datei.

Euch ein schönes WE

Irgendetwas ist gerade schief gelaufen...


----------



## mihe7 (30. Aug 2019)

```
int File[] = null;
       
        int Programm = CMD.exe();
        int Editor = notepad.exe();
```

Hier hast Du die Bennungskonventionen von Java nicht eingehalten: Variablennamen schreibt man in lowerCamelCase. Das sorgt für Verwirrung, weil z. B. File der Name einer häufig genutzte Klasse ist (java.io.File)... Die Klassen CMD und notepad gibt es nicht, so dass CMD.exe() und notepad.exe() keinen Sinn ergeben.

Außerdem werden die Variablen nirgends benutzt: die Zeilen können also weg.

Dann geht es weiter mit:

```
if (e.getBenutzereingabe = a) {
```
Das geht so nicht:

1. getBenutzereingabe ist eine Methode. Methoden werden aufgerufen, indem man eine Parameterliste (die auch leer sein kann) in runden Klammern angibt. In dem Fall erwartet die Methode einen String als Prompt.

2. Mit einem "=" vergleichst Du nichts, sondern nimmst eine Zuweisung vor. Konkret versuchst Du, der Variablen e.getBenutzereingabe den Wert zuzuweisen, der in Variable a steht. Es existiert keine der beiden Variablen.

Du hast eine Klasse SpielHelfer, die hat eine Methode getBenutzereingabe. Diese Methode erwartet als Parameter einen String als Prompt und liefert einen String als Ergebnis zurück. Von der Klasse SpielHelfer hast Du eine Instanz e erzeugt.

Du schreibst also:

```
String eingabe = e.getBenutzereingabe("Eingabe: ");
```
und arbeitest dann mit eingabe in den if-Statements weiter. Willst Du prüfen, ob der Benutzer ein "a" eingegeben hat, dann sähe das z. B. so aus:

```
if (eingabe.equals("a")) {
```
Analog für andere Zeichenketten.

Dann: runtime ist nicht deklariert. Da fehlt am Anfang vermutlich noch ein `Runtime runtime = Runtime.getRuntime();`

Das wäre es jetzt erstmal (nur überflogen), was die Datei SOEC.java betrifft.


----------



## PG_97 (30. Aug 2019)

Danke erstmals. 
Ein kleiner Lichtblick!


----------



## PG_97 (30. Aug 2019)

...
Ich schreibe gleich die Zeilen nochmal neu, ich hatte es schon öfters, das dann funktioniert. Trotzdem befindet sich schon eine geupdatete Version im Anhang.

EDIT: Wer lesen und logisch denken kann, ist klar im Vorteil. Meine Güte bin ich manchmal dämlich!
Andere Frage, macht das System.out.printlln noch Sinn? Eigentlich nicht, wie ich das sehe. Also jetzt bei if (eingabe...)


----------



## PG_97 (30. Aug 2019)

So, dass kommt nun raus. Zeilen neu geschrieben. Dateipfad habe ich mittlerweile in FIle umbenannt. Muss ich in der SearchCN noch etwas hinzufügen, damit er weiß, wonach ersuchen soll? 

C:\Users\pag\Desktop\SOEC>javac SOEC.java
SOEC.java:22: error: cannot find symbol
                        f.getDateipfad("CMD.exe");
                         ^
  symbol:   method getDateipfad(String)
  location: variable f of type SearchCN
SOEC.java:25: error: cannot find symbol
                        System.out.println("cd" + f.getDateipfad("Datei"));
                                                   ^
  symbol:   method getDateipfad(String)
  location: variable f of type SearchCN
SOEC.java:31: error: cannot find symbol
                        f.getDateipfad("CMD.exe");
                         ^
  symbol:   method getDateipfad(String)
  location: variable f of type SearchCN
SOEC.java:34: error: cannot find symbol
                        System.out.println("cd" + f.getDateipfad("Datei"));
                                                   ^
  symbol:   method getDateipfad(String)
  location: variable f of type SearchCN
SOEC.java:40: error: cannot find symbol
                        f.getDateipfad("notepad.exe");
                         ^
  symbol:   method getDateipfad(String)
  location: variable f of type SearchCN
SOEC.java:41: error: cannot find symbol
                        f.getDateipfad(f.getDateipfad("Datei"));
                                        ^
  symbol:   method getDateipfad(String)
  location: variable f of type SearchCN
6 errors


----------



## mihe7 (30. Aug 2019)

Hier macht eigentlich fast nichts Sinn 


```
f.getDateipfad("CMD.exe");
            e.getBenutzereingabe("Datei");
            runtime.exec("CMD");
            System.out.println("cd" + f.getDateipfad("Datei"));
            //push "Eingabe";
            System.out.println("java " + e.getBenutzereingabe("Dateiname"));
            //push "Eingabe";
```
1. Was bringt die erste Zeile? 
2. Was bringt die zweite Zeile?
3. runtime.exec: führt CMD aus (aber nicht das Ergebnis von f.getDateipfad)
4. Dann wird ein "cd" + Pfad zu irgendeiner Datei ausgegeben.
5. Dann wird "java " + eine Benutzereingabe (für "Dateiname") ausgegeben

Kurz: was soll das ganze werden?


----------



## kneitzel (30. Aug 2019)

Also mir wäre es lieber, wenn Du den Code, auf den es Dir ankommt, in Code Tags direkt posten würdest. Wenn Du der Meinung bist, dass dies zu groß wird, dann pack es noch zusätzlich in einen Spoiler (Wobei es ja nicht so viel Code ist!)

Bezüglich Deines catch: Da kannst Du eine Ausgabe machen. Aber da würde ich auch noch den Stacktrace mit ausgeben um mehr Informationen zu haben....

Du suchst nach der cmd.exe? Oder was macht der Code? cmd.exe findet sich in der Umgebungsvariablen COMSPEC, welche Du z.B. mittels System.getenv auslesen könntest.


----------



## PG_97 (30. Aug 2019)

Ich komme gerade nicht ganz hinterher. Diese if Statesment sollen eigentlich nur sagen, wenn eben bei a, b oder c + Datei eingegeben wird, das er dies sucht, compiliert, öffnet oder startet.

Den letzten Block kann man ja ruhig erstmal hinten anstellen. Meine bisherigen Programme laufen ja alle über CMD, weiter bin ich nicht, da das ganze Pfad eingeben (ich bin sehr fleißig was Ordner erstellen betrifft/Ordnung muss sein) usw. mich nervt. Damit das ganze läuft war mein Gedankengang öffne CMD und gehe in den Pfad und starte/Kompiliere das Programm.  Da er ja wissen muss wo es ist muss er ja den Computer durchsuchen. Zudem befinden sich nicht die Programme im Ordner Programme, daher den ganzen Computer.
So in etwa habe ich es jetzt aufgeschrieben. Anscheinend nicht ganz Richtig.


----------



## kneitzel (30. Aug 2019)

Also mein Tipp wäre, einfach einmal ein Java Tutorial durchzugehen, ehe Du so weiter bastelst. Es ist aus meiner Sicht sinnvoller, erst einmal die Grundlagen kontrolliert zu lernen als ohne Basiswissen irgendwas zu basteln.

Das, was Du jetzt schon hast ist um ein vielfaches zu komplex und Du hast gleich 3 Baustellen offen. (Wenn ich etwas entwickle, dann achte ich darauf, so wenig Baustellen wie möglich zu öffnen um eben den Überblick zu behalten.)

So hat Deine Klasse SearchCN nur eine Methode searchFile, welche zwei Parameter nimmt. Aber Du versuchst, da eine Methode getDateipfad aufzurufen.
Dann sollte eine Methode getDateipfad ja etwas zurück geben, aber das ist für Dich ohne Interesse wie es scheint.

Das nur um etwas offensichtliches anzusprechen. Das könnte man hier alles nach und nach erläutern, aber dann schreiben wir, was Du z.B. im freien Buch java ist auch eine Insel direkt online lesen könntest....


----------



## PG_97 (30. Aug 2019)

Ich habe oben etwas ergänzt und ich nutze gerade Java von Kopf bis Fuß.


----------



## mihe7 (30. Aug 2019)

Du rufst aktuell Methoden auf, die es nicht gibt, verwendest Methoden als Variablen, hast Variablen, die Du nicht brauchst, greifst auf nicht existente Variablen zu -> das ist alles noch sehr unstrukturiert. 

Fang erstmal mit der SearchCN-Klasse an und schreib die soweit fertig, dass Sie funktioniert, d. h. Du sie auch verwenden kannst und in einem Test auch verwendest.


----------



## PG_97 (30. Aug 2019)

Also alles auf Anfang. Brauche nur einen Befehl um Programme starten zu lassen z. B. Runtime.exec(start + Pfad)?


----------



## kneitzel (30. Aug 2019)

Du hast den Aufruf doch schon gefunden. Hast Du da mal in Google gesucht? "Java Runtime exec Beispiel" wird in Google bestimmt viele interessante Treffer bringen.

Aber ansonsten liefert auch Java ist auch eine Insel dazu einiges:
http://openbook.rheinwerk-verlag.de/javainsel9/javainsel_11_005.htm 
==> Aber das ist in dem Buch Kapitel 11 - Evtl. solltest Du Dich erst für Kapitel 1 - 10 aus dem Buch interessieren.


----------



## PG_97 (30. Aug 2019)

Okay, vielen Dank dir!
Mal sehen was bei Anlauf 2 passiert.


----------



## PG_97 (2. Sep 2019)

So, nun habe ich es geschafft ein Programm zu schreiben, welches ausführt und compiliert. Jedoch ist es starr bzw. kann nur 1 eine Sache. Hat jemand eine Idee wie er flexibel bzw. auch andere Sachen sucht compiliert und ausführt?


```
import java.io.*;

public class Cmd {

   public static void main(String[] args) {
      try {
         Process process = Runtime.getRuntime().exec("conhost java EinfachesDotComTestlauf", null, new File("C:\\Users\\pag\\Documents\\DC"));
         System.out.println("Führe aus");
         process.waitFor();
      } catch (Exception ex) {
         ex.printStackTrace();
      }
   }
}
```


----------



## kneitzel (2. Sep 2019)

Du hattest ja schon ein paar Ansätze. Die kann man ja durchaus verwenden. Und den Befehl, den Du ausführst, kannst Du ja beliebig zusammen setzen....


----------



## PG_97 (2. Sep 2019)

Noch etwas spezifischer, als nächstes möchte ich erstmal den Dateinamen individuell eingeben. Allerdings läuft die Verknüpfung recht gut, allerdings hapert es an der Stellung der Befehle. Der Compiler sagt immer, Nein das geht nicht.


----------



## kneitzel (2. Sep 2019)

Dann zeig doch, wo der Compiler meckert. Ohne Detail kann ich nur sagen: Dann hast Du da etwas falsch gemacht.


----------



## PG_97 (3. Sep 2019)

Der Dateiname fuktioniert nun einwandfrei. Allerdings kriege ich den Suchindex für den Dateipfad nicht richtig umgesetzt.
Einmal der Code vom beiden und Danke euch für die Tatkräftige Unterstützung!
Einmal die Suchklasse:


```
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;

public class SearchCN {
   
    SpielHelfer helfer = new SpielHelfer();
    String ab = helfer.getBenutzereingabe(" ");
     
    File f = new File("C:\\Programme");
    File[] fileArray = f.listFiles();

    public ArrayList<File> searchFile(File dir, String find) {

    File[] files = dir.listFiles();                            //Achtung Namensänderung muss noch Erfolgen. files durch etwas ersetzten, was nach der Benutzereingabe sucht.
    ArrayList<File> matches = new ArrayList<File> ();
    if (files != null) {
        for (int i = 0; i < files.length; i++) {
            if (files[i].getSpielHelfer().equalsIgnoreCase(find)) { // überprüft ob der Dateiname mit dem Suchstring
                                     // übereinstimmt. Groß-/Kleinschreibung wird
                                     // ignoriert.
                matches.add(files[i]);
            }
            if (files[i].isDirectory()) {
                matches.addAll(searchFile(files[i], find)); // fügt der ArrayList die ArrayList mit den
                                        // Treffern aus dem Unterordner hinzu
            }
        }
    }
    return matches;
    }
}
```

Und einmal die ausführende Klasse:

```
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.io.*;

public class SOEC {
   public static void main(String[] args) {
     
      SpielHelfer helfer = new SpielHelfer();
      String xy = helfer.getBenutzereingabe(" ");
      String ab = helfer.getBenutzereingabe(" ");
     
      ArrayList<SearchCN> file = new ArrayList<SearchCN>();
   
   
      if (xy.equals("a")) {
          try {
            Process process = Runtime.getRuntime().exec("conhost java " + ab, null, new file(" "));
             process.waitFor();
          } catch (Exception ex) {
             ex.printStackTrace();
          }
       }
       if (xy.equals("b")) {
           try {
             Process process = Runtime.getRuntime().exec("conhost javac " + ab, null, new file(" "));
             process.waitFor();
          } catch (Exception ex) {
             ex.printStackTrace();
          }
       }
       if (xy.equals("c")){
           try {
             Process process = Runtime.getRuntime().exec("C:\\Program Files (x86)\\Notepad++\\notepad++.exe " + ab, null, new file(" "));
             process.waitFor();
           } catch (Exception ex) {
               ex.printStackTrace();
           }
       }
    }
}
```

Ich vermute das es am File liegt.


----------



## PG_97 (3. Sep 2019)

Programm läuft, allerdings, wie lasse ich das Programm für eine bestimmte Zeit zu pausieren bzw. es soll erst nach 30. Sekunden mit dem Programm weitermachen, damit das andere noch arbeiten kann.


----------



## PG_97 (4. Sep 2019)

Ich habe mittlerweile das ganze WWW durchsucht und keine Lösung gefunden. Das Problem: Wenn ich ein Programm über ein anderes starte, so öffnet es sich in ein neues Fenster wird dann aber geschlossen, da das andere Programm zu Ende ist. Kann mir jemand sagen, wie ich die Prozesse unabhängiger machen kann oder das das Programm wartet bis das andere fertig ist? Mit der Sleep Methode komme ich nicht weiter, da ja das gesamte Programm gefriert.
Gibt es da eine "warte" Methode oder so etwas ähnliches für CMD, mit Notepad funktioniert es einwandfrei?

Ich stelle euch einfach mal den Code zur Verfügung:

```
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.io.*;

public class SOEC {
   public static void main(String[] args) {
     
      File ef;
     
      SpielHelfer helfer = new SpielHelfer();
      String xy = helfer.getBenutzereingabe(" ");
      String ab = helfer.getBenutzereingabe(" ");
      String gh = helfer.getBenutzereingabe(" ");
     
      SearchCN search = new SearchCN();
      ArrayList<File> cd = search.searchFile(new File ("C:\\Users\\pag\\Documents\\Java"), gh);
      if (cd.size() == 1) {
          ef = cd.get(0);
      } else {
          return;
      }
     
      if (xy.equals("a")) {
          try {
            System.out.println("Programm laeuft.");
            Process process = Runtime.getRuntime().exec(" conhost.exe java " + ab, null, ef);
            process.waitFor();
          } catch (Exception ex) {
             ex.printStackTrace();
          }
       }
       if (xy.equals("b")) {
           try {
             Process process = Runtime.getRuntime().exec(" conhost.exe javac " + ab, null, ef);
             process.waitFor();
          } catch (Exception ex) {
             ex.printStackTrace();
          }
       }
       if (xy.equals("c")){
           try {
             Process process = Runtime.getRuntime().exec("C:\\Program Files (x86)\\Notepad++\\notepad++.exe " + ab, null, ef);
             process.waitFor();
           } catch (Exception ex) {
               ex.printStackTrace();
           }
       }
    }
}
```


----------



## PG_97 (4. Sep 2019)

Hat nun alles geklappt!!! Allerdings hängt sich CMD auf und dies nach einer bestimmten Anzahl von Benutzereingaben einesw winzigen Programms(Schiffe Versenken auf CMD mit einem unsichtbaren Virtuellen Raster). Hat jemand Ahnung davon?


----------



## PG_97 (4. Sep 2019)

Für alle die ein solches Programm ebenfalls wollen:
É-Voula ein Fertigcode:
Klasse SOEC:


```
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.io.*;

public class SOEC {
   public static void main(String[] args) {
      
      
      File ef;
      
      SpielHelfer helfer = new SpielHelfer();
      String xy = helfer.getBenutzereingabe(" ");
      String ab = helfer.getBenutzereingabe(" ");
      String gh = helfer.getBenutzereingabe(" ");
      
      SearchCN search = new SearchCN();
      ArrayList<File> cd = search.searchFile(new File ("C:"), gh);
      if (cd.size() == 1) {
          ef = cd.get(0);
      } else {
          return;
      }
      
      if (xy.equals("a")) {
          try {
            System.out.println("Programm laeuft.");
            Process process = Runtime.getRuntime().exec("conhost.exe java " + ab, null, ef);
            process.waitFor();
          } catch (Exception ex) {
             ex.printStackTrace();
          }
       }
       if (xy.equals("b")) {
           try {
             Process process = Runtime.getRuntime().exec("conhost.exe javac " + ab, null, ef);
             process.waitFor();
          } catch (Exception ex) {
             ex.printStackTrace();
          }
       }
       if (xy.equals("c")){
           try {
             Process process = Runtime.getRuntime().exec("C:\\Program Files (x86)\\Notepad++\\notepad++.exe " + ab, null, ef);
             process.waitFor();
           } catch (Exception ex) {
               ex.printStackTrace();
           }
       }
    }
}
```

Die Klasse SearchCN:

```
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;

public class SearchCN {
    
    //SpielHelfer helfer = new SpielHelfer();
    //String ab = helfer.getBenutzereingabe(" ");
      
    //File f = new File("C:\\Programme");
    //File[] fileArray = f.listFiles();

    public ArrayList<File> searchFile(File dir, String find) {

        File[] files = dir.listFiles();
        ArrayList<File> matches = new ArrayList<File> ();
        if (files != null) {
            for (int i = 0; i < files.length; i++) {
                if (files[i].getName().equalsIgnoreCase(find)) { // überprüft ob der Dateiname mit dem Suchstring
                                         // übereinstimmt. Groß-/Kleinschreibung wird
                                         // ignoriert.
                    matches.add(files[i]);
                }
                if (files[i].isDirectory()) {
                    matches.addAll(searchFile(files[i], find)); // fügt der ArrayList die ArrayList mit den
                                            // Treffern aus dem Unterordner hinzu
                }
            }
        }
        return matches;
    }
}
```

Und für die Kommunikation:

```
import java.io.*;
public class SpielHelfer {
    public String getBenutzereingabe(String prompt) {
        String eingabeZeile = null;
        System.out.print(prompt + " ");
        try {
            BufferedReader is = new BufferedReader(new InputStreamReader(System.in));
            eingabeZeile = is.readLine();
            if (eingabeZeile.length() == 0 ) return null;
            } catch (IOException e) {
            System.out.println("IOException: " + e);
            }
        return eingabeZeile;
    }
}
```


----------



## PG_97 (10. Sep 2019)

Also ich habe jetzt eine letzte Frage. Mit allen Prgrammen läuft es nun, außer mit der Command Zeile(CMD o. PowerShell). Hat jemand eine Ahnung ob irgendwo in meinen Codes etwas enthalten ist, das CMD abstürzen lässt?
Nach x Eingaben, schmiert CMD o. PowerShell nämlich ab...


----------

