# %AppData% Variable für einen Prozess setzen



## Ikaron (2. Nov 2011)

Hallo, da mir hier schon einmal so lieb geholfen wurde, und ich (wiedermal...) ein Problem hatte, dachte ich mir: Poste doch hier!
Naja. Diesmal geht es darum, die %AppData%-Variable für einen gewissen Prozess zu setzen. So wie bei .bat Datein das
set APPDATA=%CD%
zum Beispiel. Geht das in Java auch irgendwie? Ich hab schon eine Prozess-Variable, allerdings hab ich in Google noch nicht gefunden, wie das gehen soll... Danke im Voraus,
Ikaron


----------



## Andi_CH (3. Nov 2011)

Wann soll die denn gesetzt werden? Wenn der Prozess schon läuft ist es zu spät:

Ist es eine Möglichkeit die in einem .bat file zu setzen und dann, aus demselben bat-File, den Prozess zu starten?

Der Prozess kann die sich auch selbst setzen und den Wert z.B. über Aufrufparamter erhalten.


----------



## Ikaron (3. Nov 2011)

Andi_CH hat gesagt.:


> Wann soll die denn gesetzt werden? Wenn der Prozess schon läuft ist es zu spät:
> 
> Ist es eine Möglichkeit die in einem .bat file zu setzen und dann, aus demselben bat-File, den Prozess zu starten?
> 
> Der Prozess kann die sich auch selbst setzen und den Wert z.B. über Aufrufparamter erhalten.



Genau das meinte ich. Erst setzen, dann starten.


----------



## Ikaron (3. Nov 2011)

Andi_CH hat gesagt.:


> Ist es eine Möglichkeit die in einem .bat file zu setzen und dann, aus demselben bat-File, den Prozess zu starten?



Das ginge schon, würde es aber gerne vom Java code aus machen.


----------



## Ikaron (3. Nov 2011)

Hab mich jetzt mal registriert, es nervt schon, dass man als Gast nichts editieren kann.
Zum Starten des Programms benutze ich:
java -jar Minecraft.exe -Xmx4096M -Xms4096M NAME PASSWORT


----------



## Gastredner (3. Nov 2011)

Erstelle dein Process-Objekt über einen ProcessBuilder, dabei kannst du auch die Umgebungsvariablen für den Prozess festlegen. Die Doku beschreibt dies recht ausführlich.


----------



## Andi_CH (3. Nov 2011)

Ikaron hat gesagt.:


> Das ginge schon, würde es aber gerne vom Java code aus machen.



Und was spricht dagegen das auch zu tun?
Mach es doch einfach!


```
String[] command = {"set APPDATA=%CD%"}; // Da musst du schon selbst rausfinden ob das stimmt
Runtime.getRuntime().exe(command);
```


----------



## thE_29 (3. Nov 2011)

Was auch gehen würde:


```
try{
			File f = File.createTempFile("blabla", ".bat");
			BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(f)));
			bw.write("set appdata=blablabla");
			bw.newLine();
			bw.write("blablub.exe");
			bw.newLine();
			bw.close();

			f.setExecutable(true);
			//wenn das nicht funktioniert, das untere probieren
			Runtime.getRuntime().exec(f.getAbsolutePath());
			//oder
			Runtime.getRuntime().exec("cmd /c \""+ f.getAbsolutePath() + "\"");
			f.deleteOnExit();
		}
		catch(Exception ex)
		{
			ex.printStackTrace();
		}
```

Hast halt ne bat-Temp Datei und diese setzt und ruft die exe auf..


----------



## Andi_CH (3. Nov 2011)

thE_29 hat gesagt.:


> Hast halt ne bat-Temp Datei und diese setzt und ruft die exe auf..



Öhm - du schreibst ein JavaProgramm das ein .bat startet das ein .exe startet ???:L
Ich habe sicher etwas verpasst, denn das wäre ja ziemlich sinnlos ;-)


----------



## thE_29 (3. Nov 2011)

Warum?
Wenn das ganze von einem Java-Programm aus gemacht werden soll, dann geht es so auch und geht zu 100% korrekt 

Außerdem, habe ich schon in nem anderen Beispiel/Thema gezeigt, das Runtime.exec(String commands[]); ziemlich oft ziemlich viel S******e baut.. (und ich habe mich vor 3-4 Jahren genug damit geärgert..)

Hingegen ist das bei einer Bat/SH-Datei gegeben, wie das funktioniert und abläuft.. 

Habe ich vor 3-4 Jahren überall so eingesetzt, weil wir ziemlich viele Übergabeparameter hatten und da ist Java-Runtime (überhaupt unter Linux) ziemlich oft ausgestiegen, hats nicht aufgerufen oder mit zuwenig Parametern..

Unter Linux erstellt man halt ne .sh Datei...


----------



## Ikaron (3. Nov 2011)

Jetzt schreibt er: I/O Exception
Hab's nochmal in ner .bat getestet, da geht es, hier schreibt er:

```
Cannot run program "set": CreateProcess error=2, Das System kann die angegebene Datei nicht finden
java.io.IOException: Cannot run program "set": CreateProcess error=2, Das System kann die angegebene Datei nicht finden
```


----------



## thE_29 (3. Nov 2011)

Unter Win XP eigentlich schon 

Weil es da ja C:\dokumente und...

Und dann braucht man für das Leerzeichen ein " "


----------



## Ikaron (3. Nov 2011)

thE_29 hat gesagt.:


> Unter Win XP eigentlich schon
> 
> Weil es da ja C:\dokumente und...
> 
> Und dann braucht man für das Leerzeichen ein " "



Ich füg das mal ein, aber dass er "set" nicht findet hat ja nichts damit zu tun, oder? 
Okey, ich bin dumm. Ich hab das exec("cmd <- das CMD"); vergessen xD

Okey, kein Fehler mehr, aber er benutzt immer noch den Standard AppData-Ordner 

Das ist mein Code zum Starten:

```
Runtime.getRuntime().exec(
    new String[] {
    System.getProperty("java.home") + "/bin/java.exe",
    "-Xmx" + RAM + "M",
    "-Xms" + RAM + "M",
    "-jar",
    new File(getClass().getResource("McSwitcher.class").getPath().replace("%20", " ").substring(6)).getParentFile().getParent() + "/Minecraft.exe",
    name, 
    pass });
```


----------



## thE_29 (3. Nov 2011)

Naja, habe gerade 2 Test.bat Dateien gemacht..

test.bat:


> set appdata=blub
> test2.bat



test2.bat:


> echo %appdata%



Rufe ich test.bat auf, so sieht so die Ausgabe aus:



> D:\TEMP>test
> 
> D:\TEMP>set appdata=blub
> 
> ...



Sollte also funktionieren!

Problem wird eher sein, dass das Programm was du nutzt nochmals drauf zugreifen wird (eventuell registry) und dann wirds von anderer Stelle neu gelesen..

Gibt es schon "setx" unter XP? 
Du müsstest das IMHO mit setx umsetzen, aber NACHHER wieder FIX auf das alte setzen, sonst hast du appdata zerstört...


----------



## Ikaron (3. Nov 2011)

thE_29 hat gesagt.:


> Naja, habe gerade 2 Test.bat Dateien gemacht..
> 
> test.bat:
> 
> ...



Das mit setX is mir etwas zu gefährlich 
Ginge sowas?

```
Runtime.getRuntime().exec(
    new String[] {
    "cmd", 
    "java",
    "-Xmx" + RAM + "M",
    "-Xms" + RAM + "M",
    "-jar",
    new File(getClass().getResource("McSwitcher.class").getPath().replace("%20", " ").substring(6)).getParentFile().getParent() + "/Minecraft.exe",
    name, 
    pass });
```

Hab's probiert, geht, aber nicht mit custom appdata.


----------



## thE_29 (3. Nov 2011)

WTH!?!?

Die Frage ist, was willstn mit dem Befehl erreichen?!


----------



## Ikaron (3. Nov 2011)

thE_29 hat gesagt.:


> WTH!?!?
> 
> Die Frage ist, was willstn mit dem Befehl erreichen?!



Ich will erreichen, dass er Minecraft mit 4GB Ram und autologin startet xD
In ner .bat geht das so: java -Xmx4096M -Xms4096M -jar Minecraft.exe NAME PASSWORT


----------



## thE_29 (3. Nov 2011)

Da Minecraft ja ne exe ist, stellt sich überhaupt mal die Frage, welche Parameter weitergereicht werden, falls das überhaupt bei einem geschieht..

Und was du da mit dem new File bezwecken willst, ist mir auch nicht ganz klar und wozu Appdata umsetzen, wenn es um mehr RAM geht?!


----------



## Ikaron (3. Nov 2011)

thE_29 hat gesagt.:


> Da Minecraft ja ne exe ist, stellt sich überhaupt mal die Frage, welche Parameter weitergereicht werden, falls das überhaupt bei einem geschieht..
> 
> Und was du da mit dem new File bezwecken willst, ist mir auch nicht ganz klar und wozu Appdata umsetzen, wenn es um mehr RAM geht?!



Es geht um das AppData. Ram ist ja schon drinne, und geht auch. Autologin auch. In ner .bat file geht java -jar Minecraft.exe NAME PW
Name & Pw gehn an Minecraft. Das File benutze ich, um den Pfad von Minecraft zu ermitteln.


----------



## thE_29 (3. Nov 2011)

Ok, dann funktioniert eigentlich alles bis auf das appdata umsetzen..

Kann man bei dem Minecraft nicht einstellen, dass er nicht appdata nutzen solle?


----------



## Ikaron (3. Nov 2011)

thE_29 hat gesagt.:


> Ok, dann funktioniert eigentlich alles bis auf das appdata umsetzen..
> 
> Kann man bei dem Minecraft nicht einstellen, dass er nicht appdata nutzen solle?



Nein, leider nicht. Ich kann noch das mit der .bat datei versuchen. Kann ich die auch mit exec starten?


----------



## Ikaron (4. Nov 2011)

Es geht!! Danke Leute!!
Für alle, die es wissen wollen: Hab's mit ProcessBuilder gemacht


----------



## thE_29 (4. Nov 2011)

Dann poste mal die Lösung


----------



## Ikaron (4. Nov 2011)

Hier:

```
ProcessBuilder pb = new ProcessBuilder(new String[] {
        System.getProperty("java.home") + "/bin/java.exe",
        "-Xmx" + RAM + "M", "-Xms" + RAM + "M", "-jar",
        txtMcLauncherLauncher.getText(), name, pass });
Map<String, String> env = pb.environment();
env.put("APPDATA", appData);
pb.directory(new File(appData));
pb.start();
```


----------

