Dateien mit Batch erstellen und Zeilen mit SED ersetzen
Hallo Forum,
mein erster Beitrag, mein erstes Problem, sorry.
Es geht um eine Batchanweisung. Es sollte Batch verwendet werden, weil ich nur eine WIN Maschine zur Verfügung habe und mir hier auch nicht eine große Entwicklungsumgebung installieren möchte.
Vielen Dank für eure Hilfe!
Für ein Telnetprogramm habe ich mir mit BATCH hunderte von *.ini Dateien erstellt. Sie heißen immer nach dem Schema "ipadresse.ini".
Nun möchte ich in diese Dateien an einer Stelle die mit XYXYX makiert ist, jeweils den Hostnamen einfügen. Hierzu habe ich mich nach einigem suchen für SED entschieden.
Ich habe zwei Text Dateien ipaddress.txt und hostname.txt. Beide stehen wie folgt in realation:
ipaddress.txt:
ipaddress1
ipaddress2
ipaddress3
...
hostname.txt:
hostname1
hostname2
hostname3
...
Da ich ja mit Batch beschränkt bin und nur eine Variable in der for Schleife habe, habe ich zwei for Schleifen verschachtelt.
1. Schleife ruft die datei auf
2. Schleife zieht den hostnamen aus hostname.txt
Damit die 2. Schleife nicht alles durchläuft wird getestet, ob die Datei "ipaddress1.ini" existiert.
- Wenn ja, wird der Hostname eingeschrieben
- Der Hostname aus der hostname.txt gelöscht
- Die Datei verschoben
Allerdings klappt es nicht wie ich es mir vorgestellt habe:
- Wird der Hostname nicht reingeschrieben, obwohl der Befehl in der cmd ausgeführt, wunderbar funktioniert
- hostname.txt ist sofort leer, obwohl der Befehl in der cmd ausgeführt, wunderbar funktioniert
Ich habe @echo an, und man kann sehen, dass das Programm theoretisch tut was es soll, praktisch nur leider überhaupt nicht.
DAS PROGRAMM:
@echo off
for /f %%i in (ipaddress.txt) do (
for /f %%j in (hostname.txt) do (
if exist %%i.ini (
sed "s/XYXYX/%%j/" %%i.ini>ablage.txt \\Ersetz XYXYX durch den Hostnamen
ren ablage %%i.ini
sed /"%%j"/d hostname.txt>ablage2.txt \\Löscht den bereits verwendeten Hostnamen aus der hostname.txt
ren ablage2.txt hostname.txt
move %%i.ini .\ini\ \\Verschiebt die bearbeitete Datei
)
)
)
Die "if exist" Anweisung wird teilweise auch durchlaufen, wenn die Datei garnicht da ist!
Wie Ihr seht, habe ich inzwischen mit "Ablagen" gearbeitet, was dazu führt, das die hostname.txt nicht sofort leer ist...
Ich habe es schon des öffteren umgeschrieben und getestet und gemacht. Die FOR schleifen, die IF, die SED befehle ... Ich finde einfach nicht den Fehler.
Ist mein Fehler das ich Batch verwende?
mein erster Beitrag, mein erstes Problem, sorry.
Es geht um eine Batchanweisung. Es sollte Batch verwendet werden, weil ich nur eine WIN Maschine zur Verfügung habe und mir hier auch nicht eine große Entwicklungsumgebung installieren möchte.
Vielen Dank für eure Hilfe!
Für ein Telnetprogramm habe ich mir mit BATCH hunderte von *.ini Dateien erstellt. Sie heißen immer nach dem Schema "ipadresse.ini".
Nun möchte ich in diese Dateien an einer Stelle die mit XYXYX makiert ist, jeweils den Hostnamen einfügen. Hierzu habe ich mich nach einigem suchen für SED entschieden.
Ich habe zwei Text Dateien ipaddress.txt und hostname.txt. Beide stehen wie folgt in realation:
ipaddress.txt:
ipaddress1
ipaddress2
ipaddress3
...
hostname.txt:
hostname1
hostname2
hostname3
...
Da ich ja mit Batch beschränkt bin und nur eine Variable in der for Schleife habe, habe ich zwei for Schleifen verschachtelt.
1. Schleife ruft die datei auf
2. Schleife zieht den hostnamen aus hostname.txt
Damit die 2. Schleife nicht alles durchläuft wird getestet, ob die Datei "ipaddress1.ini" existiert.
- Wenn ja, wird der Hostname eingeschrieben
- Der Hostname aus der hostname.txt gelöscht
- Die Datei verschoben
Allerdings klappt es nicht wie ich es mir vorgestellt habe:
- Wird der Hostname nicht reingeschrieben, obwohl der Befehl in der cmd ausgeführt, wunderbar funktioniert
- hostname.txt ist sofort leer, obwohl der Befehl in der cmd ausgeführt, wunderbar funktioniert
Ich habe @echo an, und man kann sehen, dass das Programm theoretisch tut was es soll, praktisch nur leider überhaupt nicht.
DAS PROGRAMM:
@echo off
for /f %%i in (ipaddress.txt) do (
for /f %%j in (hostname.txt) do (
if exist %%i.ini (
sed "s/XYXYX/%%j/" %%i.ini>ablage.txt \\Ersetz XYXYX durch den Hostnamen
ren ablage %%i.ini
sed /"%%j"/d hostname.txt>ablage2.txt \\Löscht den bereits verwendeten Hostnamen aus der hostname.txt
ren ablage2.txt hostname.txt
move %%i.ini .\ini\ \\Verschiebt die bearbeitete Datei
)
)
)
Die "if exist" Anweisung wird teilweise auch durchlaufen, wenn die Datei garnicht da ist!
Wie Ihr seht, habe ich inzwischen mit "Ablagen" gearbeitet, was dazu führt, das die hostname.txt nicht sofort leer ist...
Ich habe es schon des öffteren umgeschrieben und getestet und gemacht. Die FOR schleifen, die IF, die SED befehle ... Ich finde einfach nicht den Fehler.
Ist mein Fehler das ich Batch verwende?
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 93693
Url: https://administrator.de/forum/dateien-mit-batch-erstellen-und-zeilen-mit-sed-ersetzen-93693.html
Ausgedruckt am: 08.05.2025 um 05:05 Uhr
3 Kommentare
Neuester Kommentar
Hallo swoosh und willkommen im Forum!
Wie ich Deine Zielsetzung verstehe, geht es darum, in allen bereits existierenden Dateien der Art "172.30.20.10.ini" den darin enthaltenen Text "XYXYX" durch den dieser Adresse entsprechenden Hostnamen zu ersetzen.
Damit stellt sich die Frage nach der Zuordnung zwischen IP-Adresse und Hostnamen, bzw nach dem Zusammenhang der beiden Dateien "ipaddress.txt" und "hostname.txt" - ist das Kriterium die Position innerhalb der jeweiligen Datei (= Zeilennummer), sodass also der Hostname zur IP-Adresse aus Zeile 5 der "ipaddress.txt" in Zeile 5 der "hostname.txt" zu finden ist?
Grüße
bastla
Wie ich Deine Zielsetzung verstehe, geht es darum, in allen bereits existierenden Dateien der Art "172.30.20.10.ini" den darin enthaltenen Text "XYXYX" durch den dieser Adresse entsprechenden Hostnamen zu ersetzen.
Damit stellt sich die Frage nach der Zuordnung zwischen IP-Adresse und Hostnamen, bzw nach dem Zusammenhang der beiden Dateien "ipaddress.txt" und "hostname.txt" - ist das Kriterium die Position innerhalb der jeweiligen Datei (= Zeilennummer), sodass also der Hostname zur IP-Adresse aus Zeile 5 der "ipaddress.txt" in Zeile 5 der "hostname.txt" zu finden ist?
Grüße
bastla
Hallo swoosh!
Dann wäre mein erster Schritt, die beiden Dateien / Tabellen zusammenzuführen, etwa mit folgendem VBScript (Batch wäre auch möglich, aber etwas langsam):
Dieses VBScript ist (mit angepassten Pfaden in den ersten 3 Zeilen - der Pfad aus Zeile 3 wird auch im folgenden Batch benötigt) mit dem Dateityp ".vbs" zu speichern und kann per Doppelklick ausgeführt werden.
Für den Rest dann wieder Batch:
Hier wird versucht, für alle .ini-Dateien des angegebenen Ordners (Zeile 3) aufgrund des Dateinamens (%%~ni) in der vorher erstellten "D:\IP2Hosts.txt" den Hostnamen zu finden. Gelingt dies, wird mit "sed" eine neue .ini (im angegebenen Zielordner) erzeugt, danach zur Sicherheit in dieser .ini nach dem Vorhandensein des Hostnamens gesucht und entweder die neue Datei (falls die Ersetzung nicht erfolgreich war und daher der Hostname nicht gefunden wird) oder die Originaldatei gelöscht.
Grüße
bastla
Dann wäre mein erster Schritt, die beiden Dateien / Tabellen zusammenzuführen, etwa mit folgendem VBScript (Batch wäre auch möglich, aber etwas langsam):
Const FileIP = "D:\Ipaddress.txt"
Const FileHost = "D:\hostname.txt"
Const FileIP2H = "D:\IP2Hosts.txt"
Set fso = CreateObject("Scripting.FileSystemObject")
IP = Split(fso.OpenTextFile(FileIP).ReadAll, vbCrLF)
Host = Split(fso.OpenTextFile(FileHost).ReadAll, vbCrLF)
UIP = UBound(IP)
If UIP = UBound(Host) Then
Set IP2H = fso.CreateTextFile(FileIP2H)
For i = 0 To UIP
If Trim(IP(i))<>"" Then IP2H.WriteLine IP(i) & "=" & Host(i)
Next
IP2H.Close
WScript.Echo "Datei """ & FileIP2H & """ erstellt."
Else
WScript.Echo FileIP & " und " & FileHost & " haben unterschiedliche Zeilenanzahl!"
End If
Für den Rest dann wieder Batch:
@echo off & setlocal
set "Ziel=.\ini"
for %%i in ("D:\Dein Ordner\*.ini") do (
for /f "tokens=2 delims==" %%j in ('findstr /b /c:"%%~ni=" "D:\IP2Hosts.txt"') do (
if "%%j" neq "" sed "s/XYXYX/%%j/" %%i>"%Ziel%\%%i"
findstr "%%j" "%Ziel%\%%i">nul
if errorlevel 1 (
del "%Ziel%\%%i"
) else (
del %%i
)
)
)
Grüße
bastla