Per Batch Zeilen aus Datei in Variable schreiben
Hallo Leute,
erstmal Danke dafür, dass ich in eurem Forum schon sehr oft Hilfe bei meiner Gelegentlichen Batch-Programmierung gefunden habe.
Diesmal komme ich aber nicht weiter, so dass ich mich anmelden musste
Also:
Ich möchte IP-Adressen die ich ich in eine Datei geschrieben habe (untereinander) in eine Variable schreiben mit Semikolon getrennt.
Probiert habe ich:
for /f %%x in (ips.txt) do set ausgabe=%ausgabe% %%x
leider steht aber immer nur die letzte Zeile drin..
Achja, die Zeilen(IPs) möchte ich dann gerne (mit Semikolon getrennt) in eine INI-Datei an eine bestimmte Stelle schreiben. Quasi
IP=xxx.xxx.xxx.xxx durch meinen Eintrag in IP=xxx.xxx.xxx.xxx;xxx.xxx.xxx.xxx; usw ersetzen.
Dank im voraus für eure Mühen!!
erstmal Danke dafür, dass ich in eurem Forum schon sehr oft Hilfe bei meiner Gelegentlichen Batch-Programmierung gefunden habe.
Diesmal komme ich aber nicht weiter, so dass ich mich anmelden musste
Also:
Ich möchte IP-Adressen die ich ich in eine Datei geschrieben habe (untereinander) in eine Variable schreiben mit Semikolon getrennt.
Probiert habe ich:
for /f %%x in (ips.txt) do set ausgabe=%ausgabe% %%x
leider steht aber immer nur die letzte Zeile drin..
Achja, die Zeilen(IPs) möchte ich dann gerne (mit Semikolon getrennt) in eine INI-Datei an eine bestimmte Stelle schreiben. Quasi
IP=xxx.xxx.xxx.xxx durch meinen Eintrag in IP=xxx.xxx.xxx.xxx;xxx.xxx.xxx.xxx; usw ersetzen.
Dank im voraus für eure Mühen!!
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 95043
Url: https://administrator.de/contentid/95043
Ausgedruckt am: 25.11.2024 um 00:11 Uhr
15 Kommentare
Neuester Kommentar
Hallo Haegar75 und willkommen im Forum!
Mit "delayedExpansion" sollte das klappen:
Was das Ersetzen in einer .ini-Datei anlangt, stellt sich immer die Frage, ob die Position der Zeile innerhalb der Datei relevant ist - falls nein, sollte (als Fortsetzung von oben) genügen:
Grüße
bastla
Mit "delayedExpansion" sollte das klappen:
@echo off & setlocal enabledelayedexpansion
for /f %%x in (ips.txt) do set ausgabe=!%ausgabe%!;%%x
set ausgabe=%ausgabe:~1%
> "D:\Deine neue.ini" findstr /v /b "IP=" "D:\Deine.ini"
>>"D:\Deine neue.ini" echo IP=%ausgabe%
bastla
Hallo Haegar75!
Wusste ich's doch ...
Na denn:
Das erste "findstr" dient eigentlich nur dazu, die Leerzeichen zu erhalten (daran dürfte Dir ja vermutlich auch gelegen sein ), und das letzte "goto :eof" ist Luxus - zumindest, solange Du nicht noch weitere Batchzeilen unterhalb unterbringen willst.
Grüße
bastla
Wusste ich's doch ...
Na denn:
@echo off & setlocal enabledelayedexpansion
set ausgabe=
for /f "usebackq" %%x in ("D:\ips.txt") do set "ausgabe=!ausgabe!;%%x"
set "ausgabe=%ausgabe:~1%"
if exist "D:\Deine neue.ini" del "D:\Deine neue.ini"
for /f "delims=" %%i in ('findstr /n $ "D:\DeineAlte.ini"') do call :ProcessLine "%%i"
goto :eof
:ProcessLine
for /f "tokens=1* delims=:" %%a in (%1) do set "Zeile=%%b"
echo %Zeile%|findstr /b /i "IP=">nul || (>> "D:\Deine neue.ini" echo\%Zeile% & goto :eof)
>>"D:\Deine neue.ini" echo IP=%ausgabe%
goto :eof
Grüße
bastla
Hallo Haegar75!
Damit die Beschreibung des Fehlers etwas spezifischer werden kann, ändere in Zeile 1 das "echo off" auf "echo on" und starte den Batch direkt von der Kommandozeile bzw füge zumindest vor Zeile 8 noch eine Zeile mit "pause" ein.
Es werden jetzt alle Befehle vor der Ausführung angezeigt - so siehst Du, welcher Befehl zuletzt ausgeführt wird, und auch, welche Werte für die Variablen jeweils eingesetzt werden.
Gibt es übrigens in der ini-Datei Sonderzeichen ("<>&|" und einzelne - also nicht paarweise in einer Zeile enthaltene - Anführungszeichen sind problematisch)?
Grüße
bastla
Damit die Beschreibung des Fehlers etwas spezifischer werden kann, ändere in Zeile 1 das "echo off" auf "echo on" und starte den Batch direkt von der Kommandozeile bzw füge zumindest vor Zeile 8 noch eine Zeile mit "pause" ein.
Es werden jetzt alle Befehle vor der Ausführung angezeigt - so siehst Du, welcher Befehl zuletzt ausgeführt wird, und auch, welche Werte für die Variablen jeweils eingesetzt werden.
Gibt es übrigens in der ini-Datei Sonderzeichen ("<>&|" und einzelne - also nicht paarweise in einer Zeile enthaltene - Anführungszeichen sind problematisch)?
Grüße
bastla
Hallo Haegar75!
Wie auch dort schon erwähnt, ist VBS eigentlich die bessere Wahl, wenn es um Textoperationen geht. Allerdings lässt sich das auch in einen Batch packen, etwa so:
Wenn Du gleich "in" der Ausgangsdatei ersetzen willst, einfach in Zeile 16 "%Quelle%" anstelle von "%Ziel%" verwenden.
Grüße
bastla
machst du nebenher noch hellsehen!?
Ist gelegentlich nicht zu vermeiden - außerdem hatten wir Ähnliches gerade nebenan ...Wie auch dort schon erwähnt, ist VBS eigentlich die bessere Wahl, wenn es um Textoperationen geht. Allerdings lässt sich das auch in einen Batch packen, etwa so:
@echo off & setlocal enabledelayedexpansion
set "Liste=D:\ips.txt"
set "Quelle=D:\Deine alte.ini"
set "Ziel=D:\Deine neue.ini"
set "Suche=IP"
set IP=
for /f "usebackq" %%x in ("%Liste%") do set "IP=!IP!;%%x"
set "IP=%IP:~1%"
if not defined IP echo "Keine neuen IP gefunden - Abbruch!" & goto :eof
set R=%temp%\ReplaceInIni.vbs
> %R% echo Set fso=CreateObject("Scripting.FileSystemObject")
>>%R% echo Zeilen=Split(fso.OpenTextFile("%Quelle%").ReadAll,vbCrLF)
>>%R% echo Suche=UCase("%Suche%")
>>%R% echo Set Z=fso.CreateTextFile("%Ziel%",True)
>>%R% echo For i=0 To UBound(Zeilen)
>>%R% echo If UCase(Left(Zeilen(i),Len(Suche)))^<^>Suche Then
>>%R% echo Z.WriteLine Zeilen(i)
>>%R% echo Else
>>%R% echo Z.WriteLine "IP ""%IP%"""
>>%R% echo End If
>>%R% echo Next
>>%R% echo Z.Close
cscript //nologo %R%
Grüße
bastla
Hallo Haegar75!
Zum Script: Da es aus dem Batch heraus erstellt wird, können die Batchvariablen (%Quelle% etc) in das Script als Konstanten eingetragen werden.
Das vom Batch "maßgeschneiderte" Script kannst Du Dir auch mit
im Editor ansehen.
Noch als Anmerkung zur Schreibweise "^<":
Da "<" (und auch die anderen oben bereits genannten Sonderzeichen) in Batch eine besondere Bedeutung haben, müssen sie "maskiert" werden - damit wird der CMD-Interpreter angewiesen, sie eben nicht zu interpretieren , sondern als "gewöhnliche" Zeichen auszugeben.
Grüße
bastla
Was muss auf dem PC installiert sein, damit das VBS im Batch funktioniert?
Eine besondere Installation ist nicht nötig - "cscript.exe" sollte auf jedem einigermaßen aktuellen Windows zur Verfügung stehen ...Zum Script: Da es aus dem Batch heraus erstellt wird, können die Batchvariablen (%Quelle% etc) in das Script als Konstanten eingetragen werden.
Set fso=CreateObject("Scripting.FileSystemObject")
Zeilen=Split(fso.OpenTextFile("%Quelle%").ReadAll,vbCrLF) 'Textdatei als Einzelzeilen in das Array "Zeilen" einlesen
Suche=UCase("%Suche%") 'Suchbegriff (wird durch den Batch eingetragen) in Großbuchstaben umwandeln (damit das Finden nicht an Groß-/Kleinschreibung scheitert)
Set Z=fso.CreateTextFile("%Ziel%",True) 'Zieldatei erzeugen
For i=0 To UBound(Zeilen) 'Alle Zeilen einzeln durchgehen
If UCase(Left(Zeilen(i),Len(Suche)))^<^>Suche Then 'Wenn der Suchbegriff nicht am Anfang der Zeile (= "Links" in der Zeile ;-)) steht, bzw noch genauer: mit den ersten, sich aus der Länge des Suchbegriffes ergebenden, x Zeichen (ebenfalls auf Großbuchstaben umgewandelt), übereinstimmt ...
Z.WriteLine Zeilen(i) '... die Zeile unverändert in die Zieldatei schreiben ...
Else
Z.WriteLine "IP ""%IP%""" '... anderenfalls durch den neuen Eintrag ersetzen (Anführungszeichen müssen verdoppelt werden, um als "normales" Zeichen interprtiert zu werden)
End If
Next
Z.Close 'Zieldatei schließen
notepad "%temp%\ReplaceInIni.vbs"
Noch als Anmerkung zur Schreibweise "^<":
Da "<" (und auch die anderen oben bereits genannten Sonderzeichen) in Batch eine besondere Bedeutung haben, müssen sie "maskiert" werden - damit wird der CMD-Interpreter angewiesen, sie eben nicht zu interpretieren , sondern als "gewöhnliche" Zeichen auszugeben.
Grüße
bastla