Hosts-Datei dynamisch ergänzen
in einem Domänen-Netzwerk soll die Hosts-Datei zentral wartbar gemacht werden. Die Einträge, die bereits vorhanden sind (können unterschiedlich sein) sollen jedoch erhalten bleiben. Änderungen sollen möglich sein.
Die Logik, die ich mir ausgedacht habe ist folgende:
1.) Master-Datei
es gibt eine Master-Datei Namens hosts-master.txt Diese steht auf dem Fileserver und dort werden vom Admin Ergänzungen eingetragen, um die alle lokalen Hosts-Dateien ergänzt werden sollen.
Diese Datei hat den Inhalt:
2.) Skript (das per Startskript bei der Anmeldung auf dem einzelnen XP-Rechner läuft)
Das Skript soll von der Logik her jede Zeile der Masterdatei prüfen, ob der Zeileninhalt in der lokalen Hosts-Datei bereits vorhanden ist.
- wenn ja, prüfe nächste Zeile
- wenn nein - trage es in der hosts-Datei zusätzlich mit ein
hier meine Batch-Datei
Mein problem ist nun, dass mein ERRORLEVEL niemals nicht 0 ist. Egal, ob in der hosts-datei der Eintrag drinsteht oder nicht.
Darüber stolpere ich gerade.
Kann mir hier bitte jemand dabei helfen, den Knick aus der Optik bekommen?
Vielen lieben Dank schonmal
Markus
Die Logik, die ich mir ausgedacht habe ist folgende:
1.) Master-Datei
es gibt eine Master-Datei Namens hosts-master.txt Diese steht auf dem Fileserver und dort werden vom Admin Ergänzungen eingetragen, um die alle lokalen Hosts-Dateien ergänzt werden sollen.
Diese Datei hat den Inhalt:
192.168.123.1 haumichblau.irgendwas.de
10.47.211.5 laberzapf.trallalla.com
172.18.25.3 nochein.server.net
2.) Skript (das per Startskript bei der Anmeldung auf dem einzelnen XP-Rechner läuft)
Das Skript soll von der Logik her jede Zeile der Masterdatei prüfen, ob der Zeileninhalt in der lokalen Hosts-Datei bereits vorhanden ist.
- wenn ja, prüfe nächste Zeile
- wenn nein - trage es in der hosts-Datei zusätzlich mit ein
hier meine Batch-Datei
::hosts-ergänzen.cmd
::ergänzt die lokale hosts-datei um weitere Einträge, ohne den Inhalt zu löschen
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::Definition der Variablen
set hosts=%windir%\system32\drivers\etc\hosts
::Sicherung der vorhandenen hostsdatei erstellen
xcopy %hosts% %WINDIR%\system32\drivers\etc\hosts.backup /y
::zeilenweise die master-datei durchsuchen
for /f "tokens=1,2 delims= " %%I in (hosts-master.txt) do @(
find /i "%%I" %hosts%
if %errorlevel% NEQ 0 echo %%I %%J >>%hosts%
)
Mein problem ist nun, dass mein ERRORLEVEL niemals nicht 0 ist. Egal, ob in der hosts-datei der Eintrag drinsteht oder nicht.
Darüber stolpere ich gerade.
Kann mir hier bitte jemand dabei helfen, den Knick aus der Optik bekommen?
Vielen lieben Dank schonmal
Markus
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 149624
Url: https://administrator.de/contentid/149624
Ausgedruckt am: 25.11.2024 um 15:11 Uhr
7 Kommentare
Neuester Kommentar
Hallo kugman!
Du hast Dir von allen Möglichkeiten, denn Errorlevel zu verwenden, genau die ausgesucht, die in einer "
Gehen sollte es entweder mit
oder zur Not auch mit
[Edit]
Eigentlich sollte aber auch anstelle der Schleife ein
genügen.
[/Edit]
Grüße
bastla
Du hast Dir von allen Möglichkeiten, denn Errorlevel zu verwenden, genau die ausgesucht, die in einer "
for
"-Schleife nicht ohne Weiteres funktioniert (Stichwort "delayedexpansion") ...Gehen sollte es entweder mit
find /i "%%I" "%hosts%">nul || echo %%I %%J >>"%hosts%"
find /i "%%I" "%hosts%">nul
if errorlevel 1 echo %%I %%J >>%"hosts%"
Eigentlich sollte aber auch anstelle der Schleife ein
findstr /v /g:"%hosts%" "hosts-master.txt">>"%hosts%"
[/Edit]
Grüße
bastla
Hallo kugman!
Zu 1.)
Eine Leerzeile (bzw Zeilenschaltung) einfach per
hinzufügen.
Zu 2.)
Ja
Ok, Du wirst vermutlich doch auch wissen wollen, wie das gehen könnte (Konjunktiv, weil noch immer ungetestet):
Die zu entfernenden Zeilen müssten dann natürlich in der "Rausdamit.txt" stehen ...
Grüße
bastla
Zu 1.)
Eine Leerzeile (bzw Zeilenschaltung) einfach per
echo\>>"%hosts%"
Zu 2.)
Ja
Ok, Du wirst vermutlich doch auch wissen wollen, wie das gehen könnte (Konjunktiv, weil noch immer ungetestet):
findstr /v /g:"Rausdamit.txt" "%hosts%">"%hosts%"
Grüße
bastla
Hallo kugman!
1.) sollte ja nur einmal für jeden Rechner erforderlich sein (jedenfalls, wenn danach keine manuellen Änderungen mehr durchgeführt werden) - ansonsten eben einmalig am Beginn des Batches - oder, falls Du bei der "
Grüße
bastla
1.) sollte ja nur einmal für jeden Rechner erforderlich sein (jedenfalls, wenn danach keine manuellen Änderungen mehr durchgeführt werden) - ansonsten eben einmalig am Beginn des Batches - oder, falls Du bei der "
for
"-Schleife bleibst, nur, wenn tatsächlich eine Ergänzung erfolgt - etwa so:set "Flag="
for /f "tokens=1,2 delims= " %%I in (hosts-master.txt) do @(
find /i "%%I" "%hosts%">nul || (
if not defined Flag (set "Flag=True" & echo\>>"%hosts%")
echo %%I %%J >>"%hosts%"
)
)
bastla