Programm funktioniert nicht wie gewünscht

  • Themenstarter Themenstarter SkonroX
  • Beginndatum Beginndatum
S

SkonroX

Gast
Hallo,
ich habe das problem, das mein Programm nicht funktioniert wie ich es möchte, habe als kommentar beigeschrieben was nicht funktioniert.

Java:
package Matrix;
import java.awt.AWTException;
import java.awt.Robot;
import java.awt.event.KeyEvent;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import javax.swing.JOptionPane;
public class Matrix 
{
	public static void reg() throws AWTException,IOException
	{
		String path;										//Für den Pfad zu den Eigenen Dateien
		String path2;										//Für den Pfad verändert für Regestrierung
		path = (System.getProperty("user.home"));			//Befehl für Pfad zu Eigenen Dateien
		path2 = path.replaceAll("\\", "\\\\");				//FUNKTIONIERT NICHT (Soll die \ in zwei \\ ändern, benötigt für Regestrierungseintrag
		File file = new File(path+"/Matrix/");				//Matrix Ordner in Eigenen Dateien erstellen
		if (!file.exists())									//Falls Pfad nicht besteht zu Ordner, erstellen.
		{
			file.mkdirs();
		}
		File file2 = new File(path+"/Matrix/Matrix.reg/");	// .reg datei erstellen
		BufferedWriter bw;
		Robot robot = new Robot();
		bw = new BufferedWriter(new FileWriter(file2));		// in die .reg schreiben
		bw.write("Windows Registry Editor Version 5.00");	//Text Inhalt
		bw.newLine();
		bw.newLine();
		bw.write("[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run]");	//Text Inhalt
		bw.newLine();
		bw.write("\"MatrixGo\"=\"\\\""+path2+"\\Matrix.exe\\\"");								//Text Inhalt
		bw.flush();
		bw.close();
		File file3 = new File(path+"/Matrix/Matrix.reg/");										//Datei Pfad zum ausführen
		Runtime.getRuntime().exec("cmd /c "+file3);												//Datei Ausführen
		robot.delay(1500);
		robot.keyPress(KeyEvent.VK_LEFT);					// Robot zum eingeben von den Tasten zum einfügen in Regestrierung (Geht auch nicht)
	//	robot.keyRelease(KeyEvent.VK_LEFT);
		robot.delay(100);
		robot.keyPress(KeyEvent.VK_ENTER);
	//	robot.keyRelease(KeyEvent.VK_ENTER);
	//	System.out.println(path);
	}
	public static void main (String []args) throws IOException, AWTException, InterruptedException
	{
	String path;										//Pfad zu Eigenen Dateien
	path = (System.getProperty("user.home"));			// Befehl für Pfad zu Eigenen Dateien
	File file = new File(path+"/Matrix/");				//Erstelle Pfad falls noch nicht vorhanden
	if (!file.exists())
	{
		file.mkdirs();
	}
	File file2 = new File(path+"/Matrix/Matrix.bat");	//Matrix.bat datei (Gibt ganz viele zufällige Zahlen in grün in der cmd aus
	BufferedWriter bw;
	bw = new BufferedWriter(new FileWriter(file2));		//Inhalt der .bat
	bw.write("@echo off");
	bw.newLine();
	bw.write("color 0a");
	bw.newLine();
	bw.write(":top");
	bw.newLine();
	bw.write("echo %random% %random% %random% %random% %random% %random% %random% %random% %random% %random% %random% %random% %random% %random%");		//Inhalt der Datei
	bw.newLine();
	bw.write("goto top");
	bw.flush();
	bw.close();
	if(JOptionPane.showConfirmDialog(null, "sE!", "MöP", JOptionPane.YES_NO_OPTION) == 0)		//Warnung fenster
	{
		Runtime.getRuntime().exec("CMD /c START "+file2);			// Datei ausführen
	}
	else
	{
		reg();														//Regestrierungseintrag hinzufügungsmethode
		JOptionPane.showMessageDialog(null, "Halt jetzt noch nicht..");
	}
}	
}

mfg,
SkonroX
 
Hi,
aber dann werden ja die doppel-backslash in doppelbackslash gewechselt, aber es sollen ja die einzelnen in zwei

mfg,
SkonroX
 
Der Backslash [c]\[/c] hat schon eine besondere Bedeutung im regulären Ausdruck. Also muss er dort nochmals zu einem doppelten Backslash escaped werden. Macht dann im Java-String vier Baskslashes um ein Backslash-Zeichen im regulären Ausdruck einzubauen. Oder aber: [c]replaceAll(Pattern.quote("\\"), "\\\\")[/c].

Ebenius
 
hi,
habs jetzt nochmal mit doppel sovielen backslash wie eigentlich nötig umschrieben und es funktioniert :O
aber ich verstehe garnicht wirklich wieso?!

mfg,
SkonroX
 
Entschuldigung. Der Replacement-String muss natürlich auch escape'te oder gequotete Backslashes haben:
Java:
path2 = path.replaceAll("\\\\", "\\\\\\\\");
// bzw.
path2 = path.replaceAll(Pattern.quote("\\"), Matcher.quoteReplacement("\\\\"));
Ebenius
 
Wieso: im regulären Ausdruck hat ein Backslash eine besondere Bedeutung (ächnlich wie in Java). Der reguläre Ausdruck [c]\s[/c] zum Beispiel bezeichnet nicht etwa ein Muster aus einem Backslash gefolgt vom Zeichen [c]s[/c], sondern ein beliebiges Leerzeichen (TAB, Space, etc.). Der reguläre Ausdruck [c]\\[/c] bezeichnet einen Backslash. Der reguläre Ausdruck [c]\\\\[/c] bezeichnet zwei Backslashes.

Das gleiche gilt für die Replacement-Strings. Der Replacement-String [c]$[/c] bezeichnet nicht etwa ein Dollar-Zeichen, sondern das durch den Suchstring gefundene Muster. Deswegen braucht man auch dort den Backslash, um das Dollar zu escapen. Deswegen kann der Replacement-String [c]\[/c] nicht das Zeichen [c]\[/c] meinen. Und deswegen muss auch dieses dann als [c]\\[/c] im Replacement-String angegeben sein.

Um einen Backslash nun als Java-String darzustellen muss man wiederum jeden der einzelnen Backslashes durch zwei ausdrücken. Der Java-String [c]"\\\\\\\\"[/c] ist also ein String mit vier (nicht acht) Backslashes und bezeichnet ein Pattern aus zwei (nicht vier) Backslashes hintereinander.

Besser kann ich's nicht erklären.

Ebenius
 
Zuletzt bearbeitet:

Zurück
Oben