Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Per Batch Zeilen aus Datei in Variable schreiben

Frage Entwicklung Batch & Shell

Mitglied: Haegar75

Haegar75 (Level 1) - Jetzt verbinden

21.08.2008, aktualisiert 18.10.2012, 10158 Aufrufe, 15 Kommentare

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!!
Mitglied: bastla
21.08.2008 um 22:10 Uhr
Hallo Haegar75 und willkommen im Forum!

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%
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:
01.
> "D:\Deine neue.ini" findstr /v /b "IP=" "D:\Deine.ini" 
02.
>>"D:\Deine neue.ini" echo IP=%ausgabe%
Grüße
bastla
Bitte warten ..
Mitglied: Haegar75
21.08.2008 um 22:21 Uhr
Hi, das ging ja hurtig mit der Antwort!
Leider ist es immer noch das gleiche. Steht immer noch nur der letzte Wert drin. Liegts am XP?
Gruß Joachim
Bitte warten ..
Mitglied: bastla
21.08.2008 um 22:27 Uhr
Hallo Haegar75!

Liegts am XP?
Liegt leider an unkonzentriertem bastla ...
Die "%"-Zeichen (ein Resultat von copy & paste) innerhalb von !%ausgabe%! sind höchst entbehrlich.

Grüße
bastla
Bitte warten ..
Mitglied: Haegar75
21.08.2008 um 22:32 Uhr
Joa, die Prozentzeichen warens! Aber die Unkonzentriertheit seien dem Bastla zur fortgeschrittenen Stunde verziehen
Bitte warten ..
Mitglied: Haegar75
22.08.2008 um 18:09 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?
Bitte warten ..
Mitglied: bastla
22.08.2008 um 18:34 Uhr
Hallo Haegar75!

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 :eof
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
Bitte warten ..
Mitglied: Haegar75
22.08.2008 um 22:15 Uhr
Sorry Bastla, aber ich bekomms nicht gebacken. Das Teil steigt immer aus und ich find nicht raus warum.
Zu Hülf!!
Bitte warten ..
Mitglied: bastla
22.08.2008 um 22:26 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
Bitte warten ..
Mitglied: Haegar75
23.08.2008 um 10:17 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..
Bitte warten ..
Mitglied: bastla
23.08.2008, aktualisiert 18.10.2012
Hallo Haegar75!

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:
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%
Wenn Du gleich "in" der Ausgangsdatei ersetzen willst, einfach in Zeile 16 "%Quelle%" anstelle von "%Ziel%" verwenden.

Grüße
bastla
Bitte warten ..
Mitglied: Haegar75
23.08.2008 um 12:16 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
Bitte warten ..
Mitglied: bastla
23.08.2008 um 12:45 Uhr
Hallo Haegar75!

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ßen
Das vom Batch "maßgeschneiderte" Script kannst Du Dir auch mit
01.
notepad "%temp%\ReplaceInIni.vbs"
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
Bitte warten ..
Mitglied: Haegar75
22.09.2008 um 21:26 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
Bitte warten ..
Mitglied: bastla
22.09.2008 um 21:42 Uhr
Hallo Haegar75!

Wenn es genügt, dass der Suchbegriff irgendwo in der Zeile vorkommt:
01.
>>%R% echo     If InStr(1,Zeilen(i),Suche,vbTextCompare)=0 Then
als Ersatz für die "If Left(..."-Zeile im Batch.

Grüße
bastla
Bitte warten ..
Mitglied: Haegar75
22.09.2008 um 21:50 Uhr
Danke! Bist ein Schatz!
Schönen Abend noch!
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(8)

Tipp von agowa338 zum Thema Windows 10 ...

Ähnliche Inhalte
Batch & Shell
gelöst Aktueller Besitzer der aktuellen Datei herausfinden und in Variable schreiben (11)

Frage von Peter32 zum Thema Batch & Shell ...

Batch & Shell
gelöst Selected Gridview Value in Variable schreiben (4)

Frage von reissaus73 zum Thema Batch & Shell ...

Batch & Shell
gelöst Ordner per Batch verschieben, Datei kopieren (2)

Frage von Shape.Shifter zum Thema Batch & Shell ...

Batch & Shell
gelöst Mit batch zeilen auslesen (2)

Frage von keksegriller zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
Windows Tools
gelöst Aussendienst Datensynchronisierung (12)

Frage von lighningcrow zum Thema Windows Tools ...

Windows Server
Suche passender Treiber (12)

Frage von stolli zum Thema Windows Server ...

Peripheriegeräte
Wlan stört Funkmaus (11)

Frage von Falaffel zum Thema Peripheriegeräte ...

Peripheriegeräte
gelöst USB Festplatte verliert Laufwerksbuchstabe (9)

Frage von cese4321 zum Thema Peripheriegeräte ...