Zum Inhalt springen

Computernamen (VM) fortlaufend ändern mit Batch File


Empfohlene Beiträge

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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 von Teejay
Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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!

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...