Teejay Geschrieben 27. Juli 2010 Geschrieben 27. Juli 2010 Hallo, wie schon in der Überschrift angedeutet versuche ich mit einen Batchfile die Computernamen von VM´s fortlaufend zuändern. Erstmal die Problem Beschreibung: Auf meiner Workstation (Linux) befindet sich 1 VM (Windows XP) die ich 9 mal geklont habe (falls jemand das Script haben möchte einfach nur ne PM an mich senden). Nun möchte ich dass das Batch File, auf der VM, über den Share Folder auf eine Textdatei zugreift die folgende Zeilen hat: :mod: Computer 1 Computer 2 Computer 3 usw. Dort soll die VM die erste Zeile auslesen, den ausgelesenen Text als Computernamen übernehmen und dannach die vollständige erste Zeile löschen. Wenn ich daraufhin die nächste VM starte würde ja dann rein theoretisch in den Text File folgendes stehen: Computer 2 Computer 3 usw. Kenn mich leider mit Batch Files nicht sonderlich gut aus und wäre für jeden Tipp dankbar. (Sollte ich in der Zwischenzeit eine Lösung finden werd ich sie hier posten) Gruß Teejay Zitieren
Teejay Geschrieben 27. Juli 2010 Autor Geschrieben 27. Juli 2010 (bearbeitet) Bin soweit das er die Zeilen ausliest, wenn mir jemand sagen könnte wie ich die ausgelesenen Werte als Variablen bekommen kann und darauf die erste Zeile in den File lösche wäre ich überaus dankbar. for /f "tokens=1,* delims=:" %%i in ('findstr /n $ Computernamen.txt') do @( for /L %%a in (1,1,1) do @if %%i==%%a @echo %%j ) PAUSE Ausserdem habe ich das Problem das der Code nicht funktioniert sobald sich das File in einen anderen Verzeichnis befindet zb. for /f "tokens=1,* delims=:" %%i in ('findstr /n $ C:\Dokumente und Einstellungen\User\Desktop\Computernamen.txt') do @( for /L %%a in (1,1,1) do @if %%i==%%a @echo %%j ) PAUSE Gruß Teejay Bearbeitet 27. Juli 2010 von Teejay Zitieren
lupo49 Geschrieben 27. Juli 2010 Geschrieben 27. Juli 2010 Bin soweit das er die Zeilen ausliest, wenn mir jemand sagen könnte wie ich die ausgelesenen Werte als Variablen bekommen kann und darauf die erste Zeile in den File lösche wäre ich überaus dankbar. Batch kann nicht gut Dateien bearbeiten. Das könnte man höchstens mit einem Schleifendurchlauf. Zeile für Zeile lesen, alle in eine neue Datei schreiben, nur den ersten nicht. Ausserdem habe ich das Problem das der Code nicht funktioniert sobald sich das File in einen anderen Verzeichnis befindet zb. Das könnte an dem Leerzeichen in der Pfadangabe liegen. Zitieren
Teejay Geschrieben 28. Juli 2010 Autor Geschrieben 28. Juli 2010 Das könnte an dem Leerzeichen in der Pfadangabe liegen. Danke, lag daran! Bisher bin ich soweit das ich 2 Text Dateien habe in dem jeweils alle Computernamen stehen (weil ja Batch anscheind nur verschieben und nicht löschen kann). Beide Dateien sehen in Grunde genommen so aus: Computer1 Computer2 Computer3 usw. Computer1 Computer2 Computer3 usw. Nun führe ich folgendes Skript aus: @echo off for /f "tokens=1,* delims=:" %%i in ('findstr /n $ Computernamen2.txt') do @( for /L %%a in (1,1,1) do @if %%i==%%a @echo %%j ) PAUSE @echo off & setlocal set "InFile=Computernamen.txt" set "OutFile=Computernamen2.txt" set LineToDelete=1 if exist "%OutFile%" del "%OutFile%" for /f "tokens=1* delims=:" %%i in ('findstr /n $ "%InFile%"^|findstr /b "%LineToDelete%:"') do findstr /v /b /c:"%%j" "%InFile%">>"%OutFile%" PAUSE Beim ersten mal bekomme ich die Ausgabe: Computer1 Beim zweiten mal bekomme ich die Ausgabe: Computer2 Beim dritten mal bekomme ich die Ausgabe: Computer2 Liegt wohl daran das er beim ersten mal das Textfile unverändert liest und dannach halt umgeschrieben. Leider bekomm ich es nicht hin das es fortlaufend weiter geht. Also mit Computer3!?! Falls einer ne Lösung weiß wäre das super hilfreich. Gruß Teejay Zitieren
Enno Geschrieben 28. Juli 2010 Geschrieben 28. Juli 2010 Ich würde es etwas anders angehen. Batchdatei: For i = 1 bis xx teste ob Datei i in Verzeichnis existiert wenn nein: Datei i anlegen / Name i setzen / Batch beenden wenn ja: nächstes i Damit musst du dann keine Dateien bearbeiten. Ein if exist %%i ist recht einfach per Batch zu handeln. Gruß Enno Zitieren
Teejay Geschrieben 28. Juli 2010 Autor Geschrieben 28. Juli 2010 Habs jetzt mit den Batch File aufgegeben und werd es mit Java versuchen. Falls ich es mit Java hin bekomme werd ich die Lösung hier posten für die Leute die es Interessiert. Meine Lösung soweit: (Zeile 1 wird ausgelesen) package dateiauslesen; import java.io.BufferedReader; import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; public class Main { public static void main(String[] args) throws FileNotFoundException, IOException { File file = new File("c:/Computernamen.txt"); BufferedReader br = null; try { String line = null; br = new BufferedReader(new FileReader(file)); long charCnt = 0L; System.out.println(br.readLine()); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { if (br != null) try { br.close(); } catch (IOException e1) { e1.printStackTrace(); } }} } Jetzt muss ich es nur noch hinbekommen das Java den ausgelesenen Wert an ein Batch File übergibt das den Computernamen ändert (Code wird unten gepostet) und danach die erste Zeile löscht damit der nächste Zugriff wieder ein neuen Namen bekommen kann. (Batch File für dauerhafte Computernamen Änderung) @echo off set /p pc=Computername eingeben: REG add "HKLM\SYSTEM\ControlSet001\Control\ComputerName\ComputerName" /v ComputerName /t REG_SZ /d %pc% /f REG add "HKLM\SYSTEM\ControlSet001\Services\Tcpip\Parameters" /v "NV Hostname" /t REG_SZ /d %pc% /f REG add "HKLM\SYSTEM\CurrentControlSet\Control\ComputerName\ComputerName" /v ComputerName /t REG_SZ /d %pc% /f REG add "HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters" /v "NV Hostname" /t REG_SZ /d %pc% /f echo PC Name erfolgreich in %pc% geaendert! PAUSE Zitieren
Teejay Geschrieben 28. Juli 2010 Autor Geschrieben 28. Juli 2010 So bin jetzt so gut wie fertig und brauch nur noch ein letzten Schritt damit alles läuft. Hab jetzt die Idee etwas umgeändert und Java mit Batch kombiniert. Erstmal eine kurze Erklärung wie alles abläuft: 1. In Autostart befindet sich die Datei Pruefen.bat, diese Datei kontrolliert ob sich in C:\ die Datei Bearbeitet.txt befindet (Erläuterung dazu am Ende). Existiert die Datei wird Skript beendet. Falls die Datei nicht existiert wird die Datei Auslesen.jar gestartet. Pruefen.bat @echo off IF EXIST C:\Bearbeitet.txt ( EXIT )ELSE ( java -jar C:\Loesungen\DateiAuslesen.jar ) PAUSE set /p pc=[B]??????[/B] REG add "HKLM\SYSTEM\ControlSet001\Control\ComputerName\ComputerName" /v ComputerName /t REG_SZ /d %pc% /f REG add "HKLM\SYSTEM\ControlSet001\Services\Tcpip\Parameters" /v "NV Hostname" /t REG_SZ /d %pc% /f REG add "HKLM\SYSTEM\CurrentControlSet\Control\ComputerName\ComputerName" /v ComputerName /t REG_SZ /d %pc% /f REG add "HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters" /v "NV Hostname" /t REG_SZ /d %pc% /f echo PC Name erfolgreich geaendert! PAUSE echo Computername %pc% wird fuer andere Systeme geloescht! java -jar C:\Loesungen\Loeschen.jar xcopy C:\Loesungen\Bearbeitet.txt C:\ PAUSE echo System wird Heruntergefahren PAUSE 2. Auslesen.jar liest in der Datei C:\Computername.txt immer den Wert der ersten Zeile und gibt diesen wieder aus in den Skript Pruefen.bat aus. Auslesen.jar package dateiauslesen; import java.io.BufferedReader; import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; public class Main { public static void main(String[] args) throws FileNotFoundException, IOException { File file = new File("c:/Computernamen.txt"); BufferedReader br = null; try { String line = null; br = new BufferedReader(new FileReader(file)); long charCnt = 0L; System.out.println(br.readLine()); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { if (br != null) try { br.close(); } catch (IOException e1) { e1.printStackTrace(); } }} } ??????????????????????????????????????????????????????????? 3. Nun soll der Ausgegeben Wert von Batch File als Variable %pc% übernommen werden und die Werte in der Registry ändern. ??????????????????????????????????????????????????????????? 4. Nachdem die Werte geändert wird das Loeschen.jar gestartet, welches immer die erste Zeile von C:\Computernamen.txt löscht damit der nächste Zugriff wieder einen neuen Namen bekommt. Loeschen.jar package loeschen; import java.io.RandomAccessFile; public class Main { private static long originalLengthInBytes; public static void main(String[] args) throws Exception { RandomAccessFile randomAccessFile = new RandomAccessFile("c:/Computernamen.txt","rw"); int numberOfLinesToBeSkipped = 1; for (int i = 0; i < numberOfLinesToBeSkipped; i++) { System.out.println("Skipping: " + randomAccessFile.readLine()); } long sourcePosition = randomAccessFile.getFilePointer(); long destinationPosition = 0; byte[] buffer = new byte[65535]; long originalLengthInBytes = randomAccessFile.length(); moveContent(randomAccessFile, sourcePosition, destinationPosition, originalLengthInBytes - sourcePosition,buffer); randomAccessFile.setLength(originalLengthInBytes - sourcePosition); randomAccessFile.close(); } private static void moveContent(RandomAccessFile randomAccessFile, long sourcePosition, long destinationPosition, long lengthInBytes, byte[] buffer) throws Exception { int currentByteCount = 0; int bytesRead = 0; int bytesWritten = 0; long currentSourcePosition = sourcePosition; long currentDestinationPosition = destinationPosition; randomAccessFile.seek(currentSourcePosition); do { randomAccessFile.seek(currentSourcePosition); currentByteCount = randomAccessFile.read(buffer); bytesRead += currentByteCount; if (bytesRead > lengthInBytes) { currentByteCount = ((int) lengthInBytes) - bytesWritten; } bytesWritten += currentByteCount; randomAccessFile.seek(currentDestinationPosition); randomAccessFile.write(buffer, 0, currentByteCount); currentSourcePosition += currentByteCount; currentDestinationPosition += currentByteCount; randomAccessFile.seek(currentSourcePosition); } while (bytesWritten < lengthInBytes); } } 5. Sobald die Zeile gelöscht ist wird in den Verzeichnis C:\ die Text Datei Bearbeitet.txt erstellt damit das Programm bei einen erneuten Versuch Abbrechen würde. 6. Das System wird Heruntergefahren damit die Änderungen wirksam werden. Hoffe man konnte verstehen was ich da zusammen gebastelt habe und das es manchen weiterhelfen kann. Dennoch kann ich hilfe bei Punkt 3 ziemlich gut gebrauchen damit endlich alles zusammen passt. Danke für euere Zeit und evtl. Hilfe Teejay Zitieren
lupo49 Geschrieben 28. Juli 2010 Geschrieben 28. Juli 2010 Was fehlt denn jetzt noch? Ein Übergabeparameter an die Batchdatei, die den PC-Namen enthält und in eine Registry schreibt? Zitieren
Teejay Geschrieben 28. Juli 2010 Autor Geschrieben 28. Juli 2010 Genau! Der Wert den Auslesen.jar ausgibt muss irgendwie als Variable übernommen werden damit die Registry umgeschrieben werden kann. @echo off IF EXIST C:\Bearbeitet.txt ( EXIT )ELSE ( java -jar C:\Loesungen\DateiAuslesen.jar ) [COLOR="Red"]DER WERT DER HIER AUSGEGEBEN WIRD MUSS ALS VARIABLE ÜBERNOMMEN WERDEN....[/COLOR] PAUSE set /p pc=?????? [COLOR="Red"]UND HIER ALS VARIABLE PC GENUTZT WERDEN.[/COLOR] REG add "HKLM\SYSTEM\ControlSet001\Control\ComputerName\ComputerName" /v ComputerName /t REG_SZ /d %pc% /f REG add "HKLM\SYSTEM\ControlSet001\Services\Tcpip\Parameters" /v "NV Hostname" /t REG_SZ /d %pc% /f REG add "HKLM\SYSTEM\CurrentControlSet\Control\ComputerName\ComputerName" /v ComputerName /t REG_SZ /d %pc% /f REG add "HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters" /v "NV Hostname" /t REG_SZ /d %pc% /f echo PC Name erfolgreich geaendert! Zitieren
lupo49 Geschrieben 28. Juli 2010 Geschrieben 28. Juli 2010 Könnte so funktionieren: (Je nach dem, was dein Java-Programm auf das STDOUT rausgibt.) FOR /F "tokens=*" %i IN ('java -jar C:\Loesungen\DateiAuslesen.jar') DO SET PCNAME=%i In %PCNAME% ist die letzte Zeile, die das Programm ausgegeben hat. Zitieren
Teejay Geschrieben 29. Juli 2010 Autor Geschrieben 29. Juli 2010 Hi lupo49, vielen dank es hat funktioniert. Hier ist der fertige Code! Pruefen.bat @echo off IF EXIST C:\Bearbeitet.txt ( EXIT )ELSE ( FOR /F "tokens=*" %%i IN ('java -jar DateiAuslesen.jar') DO SET PCNAME=%%i ) PAUSE echo PC Name wird in %PCNAME% geaendert! REG add "HKLM\SYSTEM\ControlSet001\Control\ComputerName\ComputerName" /v ComputerName /t REG_SZ /d %PCNAME% /f REG add "HKLM\SYSTEM\ControlSet001\Services\Tcpip\Parameters" /v "NV Hostname" /t REG_SZ /d %PCNAME% /f REG add "HKLM\SYSTEM\CurrentControlSet\Control\ComputerName\ComputerName" /v ComputerName /t REG_SZ /d %PCNAME% /f REG add "HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters" /v "NV Hostname" /t REG_SZ /d %PCNAME% /f echo PC Name erfolgreich in %PCNAME% geaendert! PAUSE echo Computername %PCNAME% wird fuer andere Systeme geloescht! java -jar C:\Loesungen\Loeschen.jar xcopy C:\Loesungen\Bearbeitet.txt C:\ PAUSE shutdown -s echo System wird Heruntergefahren PAUSE Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.