# Registry auslesen mit Java



## Cherry (23. Feb 2010)

Hallo,

ich bin erst seit kurzem hier angemeldet...kenn mich noch nicht so aus 

Ich habe einige Probleme beim Auslesen der registry mit Java.
Hier ist der Quelltext:



```
import java.util.prefs.*;
import java.lang.ProcessBuilder;
import java.util.Scanner;
public class DruckerAuslesen {
public static void main(String argv[])throws Exception
{
	ProcessBuilder pb= new ProcessBuilder("reg","query", "\"HKEY_CURRENT_USER\\Volatile Environment\\1\"", "/v", "HOMEDRIVE");
	Process p= pb.start();
	Scanner sc= new Scanner(p.getInputStream()).useDelimiter("    \\w+\\s+\\w+\\s+");
	sc.next();
	System.out.println(sc.next());
	
	}
}
```
Mein Problem ist, dass ich nicht weiß wie die Regex auf den Pfad zugreifen, also welcher Ausdruck zu welchem Pfadabschnitt gehört.
Ich hätte so gedacht, dass \\w+ zu HKEY_CURRENT_USER gehört und \\s+ zu Volatile Environment.
Müsste hier dann nicht auch \w stehen, weil Zeichen auch in dem Abschnitt vorkommen??

Irgendwie hab ich das noch nicht ganz gecheckt:rtfm:

Danke für Eure Antorten!


----------



## faetzminator (23. Feb 2010)

Regular Expressions Reference - Basic Syntax
\w = wordcharacter
\s = separator


----------



## Cherry (24. Feb 2010)

Danke für die schnelle Antwort!
Ja, soweit hab ich das noch verstanden.
Muss ich dann wenn z. b. in dem Pfadabschnitt, Leerzeichen und Buchstaben drankommen, \w+s schreiben? Oder reicht hier \s, da er auf den anderen Regex von dem vorigen Abschnitt zurückgreift?


----------



## lumo (24. Feb 2010)

das mit dem auslesen der registry ist so ne sache...
geh mal davon aus, dass das nicht auf jedem pc so funktioniert.
musste mal sowas machen, um daten für einen installer zu sammeln...
leider hats auf einigen systemen gehakt und keine ergebnisse geliefert, obwohl auch auf diesen systemen der value in der registry war...

--> vorsicht mit dem verwenden von registry in java <--

*but thats just my 50 cents*


----------



## Cherry (24. Feb 2010)

Ja, das habe ich auch in mehreren Foren schon gelesen.
Ich wollte das nur grundsätzlich wissen, da ich nicht ganz verstehe, wie die Regex auf den jeweiligen Pfad zugreifen bzw gültig sin.


----------



## faetzminator (24. Feb 2010)

Cherry hat gesagt.:


> Muss ich dann wenn z. b. in dem Pfadabschnitt, Leerzeichen und Buchstaben drankommen, \w+s schreiben? Oder reicht hier \s, da er auf den anderen Regex von dem vorigen Abschnitt zurückgreift?



[c]\w+s[/c] würde [c]\w+[/c] und [c]s[/c] bedeuten, d.h. es wird [c]+[/c] (1 bis ...) Mal ein [c]\w[/c] verlangt - da gibt es noch [c]?[/c] für 0 bis 1 und [c]*[/c] für 0 bis ... - und danach ein simples [c]s[/c].
Wenn du z.B. eine Mischung aus Trennzeichen ([c]\s[/c]) und Wordchars ([c]\w[/c]) matchen wollen würdest, könntest du das mit [c][\s\w]+[/c] für 1 bis ... Zeichen machen. [c]\w[/c] alleinstehend matcht genau *ein* Zeichen, welches in der Liste von [c]\w[/c] vorkommt (AFAIK in diesem Fall [c][a-zA-Z_0-9][/c]).


----------



## tuxedo (24. Feb 2010)

Hatte nicht the29 ne Lib gebastelt mit der man die Registry bequem mit Java mitteln auslesen kann?!

--> pur Java registry wrapper for Windows | Get pur Java registry wrapper for Windows at SourceForge.net

- Alex


----------



## Cherry (24. Feb 2010)

Danke tuxedo, werde ich mir anschaun.

Aber im Zusammenhang hab ich das mit dem Pfad immer noch nicht kapiert.
Z. B:
Bei: HKEY_Current_User\Control Panel\Current\Color Schemes reicht \\w+[\\w\\s]+\\w+\\s+ um auf das Farbschema zuzugreifen
Jedoch bei: HKEY_Current_User\Printers\Settings\Wizard\Driver Name  \\w+\\w+\\w+\\w+\\s+ gibt er folgendes aus:
Name	REG_SZ	Kyocera FS-1100 KX

Wie muss ich den Regex abändern, dass nur Kyocera FS-1100 KX da steht?


----------



## faetzminator (24. Feb 2010)

Bitte die ganzen Zeilen exakt so, wie sie bei dir rein kommen, uns zu Verfügung stellen.


----------



## Cherry (24. Feb 2010)

Hier wäre der Auszug der Klasse von den zwei Registry-Einträgen

```
ProcessBuilder pb1= new ProcessBuilder("reg", "query", "\"HKEY_Current_User\\Control Panel\\Current\"", "/v", "Color Schemes");
		Process p1=pb1.start();
		Scanner sc1= new Scanner(p1.getInputStream());
		sc1.useDelimiter("   \\w+[\\w\\s]+\\w+\\s+");
		sc1.next();
		System.out.println(sc1.next());
		
		ProcessBuilder pb2= new ProcessBuilder("reg", "query", "\"HKEY_Current_User\\Printers\\Settings\\Wizard\"", "/v", "Driver Name");
		Process p2= pb2.start();
		Scanner sc2= new Scanner(p2.getInputStream());
		sc2.useDelimiter("   \\w+\\w+\\w+\\w+\\s+");
		sc2.next();
		System.out.println(sc2.next());
```


----------



## faetzminator (24. Feb 2010)

Ich benötige ein KSKB. Das hier ist abhängig von der Registry. Gib doch einfach 1:1 den Inhalt von [c].getInputStream().readLine()[/c]. Dann kann man das ProcessBuilder-unabhängig testen.


----------



## Cherry (24. Feb 2010)

Du meinst ich soll dir ein kleines Prog schreiben, aber ohne ProcessBuilder, dass die Datei über InputStreamReader eingelesen wird?


----------



## faetzminator (24. Feb 2010)

Nein, ich will einfach wissen wie die Outputs der beiden Processes aussehen. Ich z.B. habe kein Win und hab deshalb kein [c]reg[/c].

Edit: Dein Code ist zwar im weitesten Sinn ein KSKB, aber es hat eben die Abhängigkeit von [c]reg[/c]. Ein KSKB soll überhaupt keine Abhängigkeiten haben.


----------



## Cherry (25. Feb 2010)

Welche klasse soll ich dann verwenden?
Oder soll ich die Systeminfos einfach irgendwie reinholen?
Was hast du für ein betriebssystem?


----------

