kugman
Goto Top

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:

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

Content-ID: 149624

Url: https://administrator.de/contentid/149624

Ausgedruckt am: 25.11.2024 um 15:11 Uhr

bastla
bastla 24.08.2010 um 16:26:17 Uhr
Goto Top
Hallo kugman!

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%"
oder zur Not auch mit
find /i "%%I" "%hosts%">nul  
if errorlevel 1 echo %%I	%%J   >>%"hosts%"  
[Edit]
Eigentlich sollte aber auch anstelle der Schleife ein
findstr /v /g:"%hosts%" "hosts-master.txt">>"%hosts%"
genügen.
[/Edit]

Grüße
bastla
kugman
kugman 24.08.2010 um 16:46:53 Uhr
Goto Top
Hallo bastla,

Vielen Dank für den Tipp!

na klasse - Jackpot! Ich geh nacher Lotto spielen.

jetzt fallen mir grad aber noch zwei sachen ein.

1.) ich muss in der hosts-datei zuerst ne neue Zeile einfügen, denn sonst ist im Zweifel mein Eintrag, den ich mit >> reinschiebe nicht in einer neuen Zeile, sondern hinter der letzten Zeile
2.) kann ich eigentlich auch Zeilen rausschmeißen?
bastla
bastla 24.08.2010 um 17:00:15 Uhr
Goto Top
Hallo kugman!

Zu 1.)
Eine Leerzeile (bzw Zeilenschaltung) einfach per
echo\>>"%hosts%"
hinzufügen.

Zu 2.)
Ja face-wink

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%"
Die zu entfernenden Zeilen müssten dann natürlich in der "Rausdamit.txt" stehen ...

Grüße
bastla
kugman
kugman 24.08.2010 um 17:04:42 Uhr
Goto Top
Hallo Bastla,
zu 1.) danke hat geklappt - nu macht er halt automatisch immer eine Zeilenschaltung, hab ich halt lauter Leerzeilen in der Datei, aber das ist eigentlich egal
zu 2.) klar - hätt ich ja eigentlich selber draufkommen können, denn dass das /v quasi mein Suchergebnis invertiert, weiss ich eigentlich... (das ist dann ja vielleicht auch die Lösung für 1.))

Grüße,

markus
bastla
bastla 24.08.2010 um 17:15:11 Uhr
Goto Top
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 "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%"  
    )
)
Grüße
bastla
DerSchorsch
DerSchorsch 24.08.2010 um 18:17:05 Uhr
Goto Top
nur mal so zum Verständnis:
warum nutzt du nicht einfach DNS?

Dank Domäne habt ihr ja schon mind. einen DNS-Server...
kugman
kugman 25.08.2010 um 10:05:55 Uhr
Goto Top
das ist schon klar - wir nutzen auch DNS, allerdings kommt auch ein DNS irgendwo an seine Grenzen, weil ich in meinen (übrigens öffentlichen DNS) nicht für jede Domäne eine Zone anlegen kann/will...
Deshalb gibt es Fälle, in denen es einfacher ist, eine hosts-datei zu pflegen.

Logisch hab ich alles, was unsere eigenen Zonen angeht auch im DNS drin.