Frage ist gelöstPer Batch Zeilen aus Datei in Variable schreiben
21.08.2008
21:44:12 Uhr6161 Aufrufe
15 Antworten
21:44:12 Uhr
15 Antworten
Noch nicht bewertet
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!!
bastla schreibt am 21.08.2008 um 22:10:04 Uhr
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:
01.
@echo off & setlocal enabledelayedexpansion 02.
for /f %%x in (ips.txt) do set ausgabe=!%ausgabe%!;%%x 03.
set ausgabe=%ausgabe:~1%01.
> "D:\Deine neue.ini" findstr /v /b "IP=" "D:\Deine.ini" 02.
>>"D:\Deine neue.ini" echo IP=%ausgabe%bastla
Haegar75 schreibt am 22.08.2008 um 18:09:44 Uhr
Hi, ich schon wieder! 
Leider reicht es nicht die geänderte Zeile anzuhängen,
weil der Eintrag in einem bestimmten Block der Datei stehen muss. Steht er nur untendrunter wird er nicht bearbeitet. Jetzt bin ich mal wieder mit meinem Latein am Ende.. Kann findstr evtl. die Zeilennummer ermitteln, aber wie krieg ich nen String zeilengenau in eine Datei?
Leider reicht es nicht die geänderte Zeile anzuhängen,
weil der Eintrag in einem bestimmten Block der Datei stehen muss. Steht er nur untendrunter wird er nicht bearbeitet. Jetzt bin ich mal wieder mit meinem Latein am Ende.. Kann findstr evtl. die Zeilennummer ermitteln, aber wie krieg ich nen String zeilengenau in eine Datei?
bastla schreibt am 22.08.2008 um 18:34:59 Uhr
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:
01.
@echo off & setlocal enabledelayedexpansion 02.
set ausgabe= 03.
for /f "usebackq" %%x in ("D:\ips.txt") do set "ausgabe=!ausgabe!;%%x" 04.
set "ausgabe=%ausgabe:~1%" 05.
06.
if exist "D:\Deine neue.ini" del "D:\Deine neue.ini" 07.
for /f "delims=" %%i in ('findstr /n $ "D:\DeineAlte.ini"') do call :ProcessLine "%%i" 08.
goto :eof 09.
10.
:ProcessLine 11.
for /f "tokens=1* delims=:" %%a in (%1) do set "Zeile=%%b" 12.
echo %Zeile%|findstr /b /i "IP=">nul || (>> "D:\Deine neue.ini" echo\%Zeile% & goto :eof) 13.
>>"D:\Deine neue.ini" echo IP=%ausgabe% 14.
goto :eofGrüße
bastla
bastla schreibt am 22.08.2008 um 22:26:28 Uhr
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
Haegar75 schreibt am 23.08.2008 um 10:17:55 Uhr
Hallo Bastla,
machst du nebenher noch hellsehen!?
Also ich denke ich habe genau die zwei Probleme..
1. Der Block wo ich die Zeile einfügen möchte wird mit <xxx> begonnen und mit <xxx_end> geschlossen. Von den Blöcken gibt es mehrere, aber mein Keyword ist eindeutig und kommt nur in einem Block vor..
2. die zu ersetzende Zeile sieht so aus:
ip "111.111.111.111;222.222.222.222"
Dazu hab ich den Code auf:
for /f "usebackq" %%x in ("ips.txt") do set "ausgabe=!ausgabe!;%%x"
set "ausgabe=%ausgabe:~1%"
geändert..
Nachdem ich die Blockanfänge und Enden mal rausgeworfen habe, läuft der batch erstmal durch, aber die " machen ihn noch durcheinander.
Er sagt dann:Datei ip "111.111.111.111" nicht gefunden.
In der neuen ini steht dann anstatt der zu ersetzenden Zeile die vorhergehende Zeile quasi doppelt..
machst du nebenher noch hellsehen!?
Also ich denke ich habe genau die zwei Probleme..
1. Der Block wo ich die Zeile einfügen möchte wird mit <xxx> begonnen und mit <xxx_end> geschlossen. Von den Blöcken gibt es mehrere, aber mein Keyword ist eindeutig und kommt nur in einem Block vor..
2. die zu ersetzende Zeile sieht so aus:
ip "111.111.111.111;222.222.222.222"
Dazu hab ich den Code auf:
for /f "usebackq" %%x in ("ips.txt") do set "ausgabe=!ausgabe!;%%x"
set "ausgabe=%ausgabe:~1%"
geändert..
Nachdem ich die Blockanfänge und Enden mal rausgeworfen habe, läuft der batch erstmal durch, aber die " machen ihn noch durcheinander.
Er sagt dann:Datei ip "111.111.111.111" nicht gefunden.
In der neuen ini steht dann anstatt der zu ersetzenden Zeile die vorhergehende Zeile quasi doppelt..
bastla schreibt am 23.08.2008 um 11:11:11 Uhr
Hallo Haegar75!
- 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:
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 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:
01.
@echo off & setlocal enabledelayedexpansion 02.
set "Liste=D:\ips.txt" 03.
set "Quelle=D:\Deine alte.ini" 04.
set "Ziel=D:\Deine neue.ini" 05.
set "Suche=IP" 06.
07.
set IP= 08.
for /f "usebackq" %%x in ("%Liste%") do set "IP=!IP!;%%x" 09.
set "IP=%IP:~1%" 10.
if not defined IP echo "Keine neuen IP gefunden - Abbruch!" & goto :eof 11.
12.
set R=%temp%\ReplaceInIni.vbs 13.
> %R% echo Set fso=CreateObject("Scripting.FileSystemObject") 14.
>>%R% echo Zeilen=Split(fso.OpenTextFile("%Quelle%").ReadAll,vbCrLF) 15.
>>%R% echo Suche=UCase("%Suche%") 16.
>>%R% echo Set Z=fso.CreateTextFile("%Ziel%",True) 17.
>>%R% echo For i=0 To UBound(Zeilen) 18.
>>%R% echo If UCase(Left(Zeilen(i),Len(Suche)))^<^>Suche Then 19.
>>%R% echo Z.WriteLine Zeilen(i) 20.
>>%R% echo Else 21.
>>%R% echo Z.WriteLine "IP ""%IP%""" 22.
>>%R% echo End If 23.
>>%R% echo Next 24.
>>%R% echo Z.Close 25.
cscript //nologo %R%Grüße
bastla
Haegar75 schreibt am 23.08.2008 um 12:16:46 Uhr
Respekt! Funktioniert auf Anhieb! Danke! Wär es vermessen zu fragen, ob du mir evt. paar Kommentare dazuschreiben könntest? Die VBS-Zeilen sind böhmische Dörfer für mich
Was muss auf dem PC installiert sein, damit das VBS im Batch funktioniert?
Gruß Haegar75
Gruß Haegar75
bastla schreibt am 23.08.2008 um 12:45:44 Uhr
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.
01.
Set fso=CreateObject("Scripting.FileSystemObject") 02.
Zeilen=Split(fso.OpenTextFile("%Quelle%").ReadAll,vbCrLF) 'Textdatei als Einzelzeilen in das Array "Zeilen" einlesen 03.
Suche=UCase("%Suche%") 'Suchbegriff (wird durch den Batch eingetragen) in Großbuchstaben umwandeln (damit das Finden nicht an Groß-/Kleinschreibung scheitert) 04.
Set Z=fso.CreateTextFile("%Ziel%",True) 'Zieldatei erzeugen 05.
For i=0 To UBound(Zeilen) 'Alle Zeilen einzeln durchgehen 06.
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 ... 07.
Z.WriteLine Zeilen(i) '... die Zeile unverändert in die Zieldatei schreiben ... 08.
Else 09.
Z.WriteLine "IP ""%IP%""" '... anderenfalls durch den neuen Eintrag ersetzen (Anführungszeichen müssen verdoppelt werden, um als "normales" Zeichen interprtiert zu werden) 10.
End If 11.
Next 12.
Z.Close 'Zieldatei schließen01.
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
Grüße
bastla
Haegar75 schreibt am 22.09.2008 um 21:26:57 Uhr
Nabend! Ich bin malwieder dumm. Wollte obige Ersetzung mittels vbs für eine andere Anwendung gebrauchen, falle aber da auf die Nase, wenn der gesuchte Begriff nicht ganz am Anfang der Zeile steht.. Gibts da anstelle des "Left" noch eine andere Option die da etwas toleranter ist? 
Gruß Haegar
Gruß Haegar




