# ProcessBuilder - Vista ?



## Ashaman (13. Mai 2008)

Hallo,

ich habe hier ein kleines Problem...
Die folgende Funktion soll eigentlich nichts anderes machen als eine Datei(in dem Fall nen Skript) zu starten und den Rückgabewert zu übernehmen(der Teil ist noch nicht integriert).

Das funktioniert im Eclipse auf WinXP auch. Allerdings hab ich das jetzt bei einem Freund unter Vista laufen lassen und bei ihm wird das Skript nicht gestartet.
Es kommt zu einer IOException.

Ich bin ein bissl ratlos woran das liegen mag.
Danke schon mal für eure Hilfe!


```
public boolean methode() {
            boolean result = false;
            try {
                // ProcessBuilder builder = new ProcessBuilder( "wscript", "skript.vbs" );
                ProcessBuilder builder = new ProcessBuilder("rundll32", "url.dll", "FileProtocolHandler", "skript.vbs");
                File file = new File(this.getClass().getResource("/").getPath());
                builder.directory(file); 
                process = builder.start();
                process.waitFor();
                if (process.exitValue() == 0) {
                    result = true;
                }
            } catch(IOException exception) {
            } catch(InterruptedException error) {
            }
            return result;
        }
```


----------



## Chimaira (14. Mai 2008)

Hi,

soweit ich weiß braucht man bei Vista immer eine Bestätigung um ein neues Programm zu starten. Wenn du also ein Script ... hier skript.vbs ausführst, dann müsste Vista das blocken oder liege ich da falsch?

Habe zwar kein Vista, aber ich kenne jemanden 

GReeze Chimaira


----------



## Ashaman (14. Mai 2008)

so kleines update... es muß wohl ein fehler im code sein.
Der selbe Code führt zum gleichen Fehler auf einem anderen XP Rechner.

Ich bin wirklich überfragt woran das liegt.


----------



## Anime-Otaku (14. Mai 2008)

Du solltest auch die Input/Outputstreams abfangen und ggf. closen wenn du sie nicht brauchst....Ansonsten was bringt er da für ne Ausgabe?^^


----------



## Ashaman (14. Mai 2008)

um die streams wollte ich mich (wenn überhaupt nötig kümmern) sobald das skript überhaupt gestartet wird auf anderen rechnern.
Die genaue Fehlermeldung werde ich posten sobald ich sie von den anderen bekomme.

Ist denn an dem Code den ich gepostet hab etwas falsch?

EDIT:
Die auswertung von IOException.getMessage() und getCause()

getMessage()
Cannot run program "rundll32" (in directory "C:\Program%20Files\eclipse\Eclipse%20Aufgaben\Process"): CreateProcess error=267, Der Verzeichnisname ist ungültig

getCause()
java.io.IOException: CreateProcess error=267, Der Verzeichnisname ist ungültig


----------



## Anime-Otaku (15. Mai 2008)

meine spontane Idee:

das 
File file = new File(this.getClass().getResource("/").getPath());
versuch mal ohne das getPath()....schließlich soll es ja eine URL bleiben ;-)


----------



## Thomas Darimont (15. Mai 2008)

Hallo,

gibts den Pfad überhaupt in deinem System?
Weiterhin setzt du mit directory Explizit das aktuelle Working Directory. Wenn das System dann dort rundll32.exe sucht, wird es natürlich nicht gefunden, sofern es nicht da liegt. Gib doch mal den vollqualifizierten Pfad zu rundll32.exe in deinem Command String an. Weiterhin wird dein Pfad als URL behandelt (deshalb die %20) die mit der Endung .vbs Assozierte Anwendung wscript.exe /cscript.exe erwartet einen "richtigen" Pfad.

Starte das skript doch mal direkt mit "start cmd /c cscript.exe d:\\temp\\bubu.vbs".

Gruß Tom


----------



## Anime-Otaku (15. Mai 2008)

rundll32.exe ist standardmässig in der Path Systemvariablen zu finden ....daher sollte es ohne Probleme gefunden werden..oder?


----------



## Thomas Darimont (15. Mai 2008)

Hallo,

kommt drauf an:

```
H:\>d:\temp\rundll32.exe
Der Befehl "d:\temp\rundll32.exe" ist entweder falsch geschrieben oder
konnte nicht gefunden werden.

H:\>rundll32.exe
```

Aber es sieht ja so aus, als ob er rundll32 finden kann. Liegt wohl wirklich daran das der Script Interpreter den Pfad zum Skript als richtigen Verzeichnispfad und nicht als URL erwartet. Mit cscript sollte es gehen.

schau mal hier:
http://www.tutorials.de/forum/java/145394-windows-beenden.html


```
/**
 * 
 */
package de.tutorials;

/**
 * @author Thomas.Darimont
 * 
 */
public class PricessBuilderExample {

	/**
	 * @param args
	 */
	public static void main(String[] args) throws Exception {
		ProcessBuilder processBuilder = new ProcessBuilder("cmd", "/c",
				"cscript", "d:\\temp\\hello.vbs");

		Process process = processBuilder.start();
		int exitValue = process.waitFor();

		System.out.println(exitValue);
	}
}
```


```
D:\>type temp\hello.vbs
msgbox "Hallo"
```


Gruß Tom


----------



## Ashaman (18. Mai 2008)

Vielen dank für eure denkanstöße 

Das problem lag haupsächlich daran dass bei leerstellen im pfadnamen (die %20) der pfad nicht gefunden werden konnte. Auf einen festen pfad wollte ich mich nicht einlassen also hab ich es übergangsweise mit einem relativen pfad zum jar file gelöst.
Dadurch ist die directory angabe völlig weggefallen da man ja für rundll bzw wscript diesen nicht brauch.

Ich werd aber eure vorschläge noch mal angehen sobald ich zur verfeinerung komme 

Danke nomma!


----------

