Tomate_Salat: mehrere Shell befehle

Hi,

ich bins (mal wieder^^).
Ich benötige für mein Programm shell-befehle, welche ich mittels Runtime.getRuntime.exec(command) ausführe. Jetzt habe ich 2 Möglichkeiten:

A) ich gebe den direkten Pfad zur Bat-Datei ein(welche ausgeführt werden soll)
B) ich wechsle vorher das Verzeichnis

somit habe ich 2 Probleme:

A) ein Ordner hat ein Leerzeichen im Namen und trotz Hochkomma und Anführungsstriche und \ oder / vor dem leerzeichen stoppt er beim leerzeichen des Ordners

B) Ich muss das anscheinend in einem Runtime-aufruf erledigen. Ich habe es mit 2 versucht: zuerst Pfad-wechsel -> zweites Runtime-objekt(eigentl. Process-objekt) ruft die bat-Datei mit parameter auf. Hier liefert mir mein Report-file, dass es die bat-Datei nicht findet (welche aber 100% in diesem Ordner liegt)

hoffe Ihr könnt mir helfen

MFG

Tomate_Salat

  1. Hallo.

    Zeig uns doch mal, was du bisher versucht hast (Code).

    Dann kann dir bestimmt geholfen werden.

    Servus,
    Flo

    1.   
      String repository, projectPath, projectDataBase, projectFileName = textfieldProjectCreate.getText();  
                          projectDataBase = "sqlite:db/" + projectFileName + ".db";  
                          repository = "C:\\Repositories\\" + projectFileName;  
                          try {  
                              BufferedReader in = new BufferedReader(new FileReader(config));  
                              projectPath = in.readLine() + "\\" + projectFileName;  
                              in.close();  
                              //String initCmd2 = "C:\\WINDOWS\\system32\\cmd.exe /c \"" + Init.vsn + "\\trac-admin.bat\" " + projectPath + " initenv " + projectFileName + " " + projectDataBase + " svn " + repository;  
                              String command = "cmd.exe /c trac-admin.bat \"" +  projectPath + "\" initenv ";  
                              String[] initCmd = {projectFileName, projectDataBase,"svn",repository};  
                              Runtime runCmd = Runtime.getRuntime();  
                              Process cmdProcess = runCmd.exec(command,initCmd,new File(vsn));  
                              BufferedReader errorProcess = new BufferedReader(new InputStreamReader(cmdProcess.getErrorStream()));  
                              BufferedReader reportProcess   = new BufferedReader(new InputStreamReader(cmdProcess.getInputStream()));  
                              String line="",inputLine="",fullLine="";  
                              fullLine += "<!-- PARAMETER -->\n";  
                              fullLine += "COMMANDLINE = " + command + "\n";  
                              for(int i=0; i<initCmd.length;i++) {  
                                  fullLine += initCmd[i] + "\n";  
                              }  
                              fullLine += "\n<!-- ERROR: cmdProcess -->\n";  
                              while((line=errorProcess.readLine()) != null) {  
                                  fullLine += line + "\n";  
                              }  
                              fullLine += "\n<!-- INFO: cmdProcess -->\n";  
                              while((inputLine=reportProcess.readLine()) != null) {  
                                  fullLine += inputLine + "\n";  
                              }  
                              cmdProcess.getErrorStream().close();  
                              cmdProcess.getInputStream().close();  
                              cmdProcess.getOutputStream().close();  
                              BufferedWriter writer = new BufferedWriter(new FileWriter("report.txt"));  
                              writer.write(fullLine);  
                              writer.close();  
        
        
                          } catch (IOException e1) {  
                             System.out.println(e1.getMessage());  
                          }  
      
      
      1. Das steht dann in der report.txt:

        <!-- PARAMETER -->
        COMMANDLINE = cmd.exe /c trac-admin.bat "C:\Trac\A016" initenv
        A016
        sqlite:db/A016.db
        svn
        C:\Repositories\A016

        <!-- ERROR: cmdProcess -->
        Traceback (most recent call last):
          File "C:\Programme\VisualSVN Server\trac\python\scripts\trac-admin-script.py", line 8, in <module>
            load_entry_point('Trac==0.11', 'console_scripts', 'trac-admin')()
          File "C:\Programme\VisualSVN Server\trac\python\lib\site-packages\setuptools-0.6c8-py2.5.egg\pkg_resources.py", line 277, in load_entry_point
          File "C:\Programme\VisualSVN Server\trac\python\lib\site-packages\setuptools-0.6c8-py2.5.egg\pkg_resources.py", line 2179, in load_entry_point
          File "C:\Programme\VisualSVN Server\trac\python\lib\site-packages\setuptools-0.6c8-py2.5.egg\pkg_resources.py", line 1912, in load
          File "C:\Programme\VisualSVN Server\trac\python\lib\site-packages\trac-0.11-py2.5.egg\trac\admin\console.py", line 30, in <module>
            from trac import perm, util, db_default
          File "C:\Programme\VisualSVN Server\trac\python\lib\site-packages\trac-0.11-py2.5.egg\trac\perm.py", line 22, in <module>
            from trac.config import ExtensionOption, OrderedExtensionsOption
          File "C:\Programme\VisualSVN Server\trac\python\lib\site-packages\trac-0.11-py2.5.egg\trac\config.py", line 19, in <module>
            from trac.util.compat import set, sorted
          File "C:\Programme\VisualSVN Server\trac\python\lib\site-packages\trac-0.11-py2.5.egg\trac\util\_init__.py", line 33, in <module>
            from trac.util.html import escape, unescape, Markup, Deuglifier
          File "C:\Programme\VisualSVN Server\trac\python\lib\site-packages\trac-0.11-py2.5.egg\trac\util\html.py", line 16, in <module>
            from genshi import Markup, escape, unescape
          File "build\bdist.win32\egg\genshi\
        _init__.py", line 32, in <module>
          File "build\bdist.win32\egg\genshi\core.py", line 544, in <module>
          File "build\bdist.win32\egg\genshi\_speedups.py", line 7, in <module>
          File "build\bdist.win32\egg\genshi\_speedups.py", line 4, in __bootstrap__
          File "C:\Programme\VisualSVN Server\trac\python\lib\site-packages\setuptools-0.6c8-py2.5.egg\pkg_resources.py", line 841, in resource_filename
          File "C:\Programme\VisualSVN Server\trac\python\lib\site-packages\setuptools-0.6c8-py2.5.egg\pkg_resources.py", line 1310, in get_resource_filename
          File "C:\Programme\VisualSVN Server\trac\python\lib\site-packages\setuptools-0.6c8-py2.5.egg\pkg_resources.py", line 1332, in _extract_resource
          File "C:\Programme\VisualSVN Server\trac\python\lib\site-packages\setuptools-0.6c8-py2.5.egg\pkg_resources.py", line 916, in get_cache_path
          File "C:\Programme\VisualSVN Server\trac\python\lib\site-packages\setuptools-0.6c8-py2.5.egg\pkg_resources.py", line 1064, in get_default_cache
        RuntimeError: Please set the PYTHON_EGG_CACHE enviroment variable

        <!-- INFO: cmdProcess -->

        C:\Programme\VisualSVN Server\trac>set PATH=\bin;

        C:\Programme\VisualSVN Server\trac>set PYTHONHOME=C:\Programme\VisualSVN Server\trac\python

        C:\Programme\VisualSVN Server\trac>"C:\Programme\VisualSVN Server\trac\python\python.exe" "C:\Programme\VisualSVN Server\trac\python\scripts\trac-admin-script.py" "C:\Trac\A016" initenv

        1. Ok hab den PYTHONG_EGG_CACHE gesetzt und jetzt gehts trotdem iwie nicht :(
          [Programm stürzt ab]

      2. Handelt sich ja offensichtlich um ein Windows System. Probier es doch mal mit DOS Namen, die enthalten keine Leerzeichen. Also "EIGENE~1" anstelle von "Eigene Dateien".

        "dir /X" im cmd listet Dir auch die Kurznamen auf.

        Gruß, Markus

        1. Handelt sich ja offensichtlich um ein Windows System. Probier es doch mal mit DOS Namen, die enthalten keine Leerzeichen. Also "EIGENE~1" anstelle von "Eigene Dateien".

          "dir /X" im cmd listet Dir auch die Kurznamen auf.

          Gruß, Markus

          Das kann ich leider nicht machen, da das Programm später Plattorm-unabhängig laufen soll.
          Da das allerdings mein letzter Prakitkumstag ist, soll ich das ganze erstmal auf Windows zum laufen bringen. Wenn ich jetzt die Kurznamen nehmen würde, wäre das ganze schwerer übertragbar.
          Also soweit wie möglich würde ich gern darauf verzichten.

          1. Hallo!

            Das kann ich leider nicht machen, da das Programm später Plattorm-unabhängig laufen soll.

            Dann solltest Du im Zweifel einfach Prüfen ob es sich um Winblöd handelt, oder nicht.

            Gruß, Markus

            1. Hallo!

              Das kann ich leider nicht machen, da das Programm später Plattorm-unabhängig laufen soll.

              Dann solltest Du im Zweifel einfach Prüfen ob es sich um Winblöd handelt, oder nicht.

              Nun das Platform-unabhängig machen mit checken obs Windoof ist oder nicht, wird ja nicht mehr mein Problem sein :-P nur will ich einen einigermaßen gescheiten Programmcode hinterlassen (hab nur einen 1-wöchigen Java-kurs mit kurs-heften gehabt :-P ) und ein Programm das wenigstens eine Aufgabe erfüllen kann, die an es gestellt wurde. Ich mein: nur für um zu sehen, welche Projekte in dem Ordner sind und wie deren Name und absoluter pfad ist....dafür braucht man das Programm nicht mal zu starten.

              MFG

              Tomate_Salat

  2. Yerf!

    B) ich wechsle vorher das Verzeichnis

    B) Ich muss das anscheinend in einem Runtime-aufruf erledigen.

    Die bessere Variante dürfte sein, das aktuelle Verzeichnis des laufenden Prozesses umzusetzen. Ich weis den genauen Aufruf jetzt nicht, aber da müsste es eigentlich etwas geben.

    Gruß,

    Harlequin

    --
    <!--[if IE]>This page is best viewed with a webbrowser. Get one today!<![endif]-->
    1. cd?
      Das hab ich ja versucht, aber ich kann keine 2 Konsolen-Befehle hintereinanderschalten, d.h. mein 2te Anweisung bezieht sich wieder auf den Ausgangspfad

      1. Yerf!

        cd?

        Nein, ich meinte die Eigenschaft des aktuellen Objektes. (System.getProperty("user.dir");) Allerdings hatte ich da wohl falsche Erinnerungen, das man das in Java umsetzen kann (lässt sich leider nicht ändern)...

        Das hab ich ja versucht, aber ich kann keine 2 Konsolen-Befehle hintereinanderschalten, d.h. mein 2te Anweisung bezieht sich wieder auf den Ausgangspfad

        Das ist klar, mit dem beenden des ersten Prozesses geht dessen Umgebung und damit auch das Verzeichnis verloren.

        Du könntest notfall ein neues batchfile mit den 2 Befehlen erzeugen und dieses dann aufrufen, ist aber auch nicht schön...

        Aber eigentlich sollten Leerzeichen in Pfaden kein Problem darstellen, wenn diese richtig escaped sind.

        Gruß,

        Harlequin

        --
        <!--[if IE]>This page is best viewed with a webbrowser. Get one today!<![endif]-->
        1. Hi

          Du könntest notfall ein neues batchfile mit den 2 Befehlen erzeugen und dieses dann aufrufen, ist aber auch nicht schön...

          So wie ich das verstehe, geht das nicht. Ich schreibe ja ein Tool, dass die Batch administrieren soll [die batch ist Teil von einem Programm].

          Die leerzeichen sind ja kein Problem mehr, da ich ja in dem exec-Befehl den Pfad der batch-datei mitteile. Ich habe jetzt aber ein Problem, mit dem ich echt Schwierigkeiten habe. Ich konnte das Batch-file ansprechen, dass wollte dann, dass ich noch einen Pfad oder sowas setze (ka, hat mir hier ein Mitarbeiter eingerichtet). Ok danach starte ich das Programm wieder und es stürzt ab, sobald ich die Batch-datei ansprechen will =( .

          Nur um Fehler auszuschliesen:
          Runtime.getRuntime().exec(param1,param2,param3).

          Ok da ist doch:
          param1: "cmd.exe /c" und danach das Batch-file, also hier: "cmd.exe /c trac-admin.bat"
          param2: sind die ganzen parameter, die der Batch-datei beim Start übermittelt werden
          & param3: hier liegt der Pfad zur batch-datei also File-Objekt

          glaube jz nicht dass das falsch ist, aber da ich erst seit einer Woche mich richtig mit Java beschäftige, bin ich doch manchmal unsicher

          MFG

          Tomate_Salat

          1. Yerf!

            glaube jz nicht dass das falsch ist, aber da ich erst seit einer Woche mich richtig mit Java beschäftige, bin ich doch manchmal unsicher

            Sieht eigentlich ganz gut aus, allerdings ists bei mir schon ein paar Jahre her, dass ich mit Java gearbeitet hab...

            Gibts noch irgendeine Meldung zu dem Absturz?

            Gruß,

            Harlequin

            --
            <!--[if IE]>This page is best viewed with a webbrowser. Get one today!<![endif]-->
            1. Moin,

              Gibts noch irgendeine Meldung zu dem Absturz?

              Der Absturz sieht wesentlich so aus:
              Programm friert ein, abschalten nur noch über die Grobmotorikervariante möglich (am schnellsten -> Prozess beenden)

              MFG

              Tomate_Salat