Top-Themen

Aktuelle Themen (A bis Z)

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

Mitglied: Haegar75

Haegar75 (Level 1) - Jetzt verbinden

21.08.2008, aktualisiert 18.10.2012, 10240 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 ..
Ähnliche Inhalte
Batch & Shell

Mit Batch-Datei eine Datei lesen, Zeilen ändern und als neue Datei schreiben

gelöst Frage von GeoSemBatch & Shell20 Kommentare

Hallo Ich versuche nun schon seit einiger Zeit das "kleine" Script (unter Windows 8) zum laufen zu bringen - ...

Batch & Shell

Batch - Variable in bestimmte Textzeile schreiben

Frage von iWolf2015Batch & Shell4 Kommentare

Hallo, ich möchte gerne eine Variable in die n-te Zeile eines .txt Dokumentes schreiben. Ich habe schon verschiedene Ansätze ...

Batch & Shell

Batch einzelne zeilen aus einer txt.datei in jeweils verschiedene variablen schreiben

gelöst Frage von ManuelBatBatch & Shell5 Kommentare

Guten Tag, Ich sitze grad an einem Projekt von mir (Eine bat zum verschlüsseln und entschlüsseln von Buchstaben) Mein ...

Batch & Shell

Batch Eingabe in Datei schreiben

gelöst Frage von MedicalAdBatch & Shell2 Kommentare

Hallo Leute, ich habe folgendes Problem, ich möchte ein Batch Programm was nacheinander > Computername, IP Adresse, Aufstellungsort und ...

Neue Wissensbeiträge
Humor (lol)
IoT-Gefahr: Smartes Aquarium leckt!
Information von Lochkartenstanzer vor 1 TagHumor (lol)3 Kommentare

Moin, Die IoT-Manie hat weitere Opfer gefunden. Ein Casino-Leck durch ein smartes Aquarium: Allerdings haben sie kein Wasser, sondern ...

Router & Routing

Alte Fritzbox 7270 mit VPN und SIP-Telefonie hinter O2 Homebox 6641 als "Modem"

Erfahrungsbericht von the-buccaneer vor 2 TagenRouter & Routing3 Kommentare

Nun war es soweit: Auch O2 hat mich mit VOIP zwangsbeglückt. Heute am Privatanschluss, in 2 Wochen ist das ...

Sicherheit

Ungepatchte Remote Code Execution-Lücke in LG NAS

Information von kgborn vor 2 TagenSicherheit

Nutzt wer LG NAS-Einheiten? In den NAS-Einheiten der LG Network Storage-Einheiten gibt es eine sehr unschöne Schwachstelle, die einen ...

Windows Update

Neue Version KB4099950 NIC Einstellungen gehen verloren

Information von sabines vor 2 TagenWindows Update2 Kommentare

Es ist eine neue Version des KB4099950 verfügbar, die das Problem mit den verlorenen Netzwerkeinstellungen lösen soll. Das Datum ...

Heiß diskutierte Inhalte
Linux Netzwerk
Raspberry Pi 3: WLAN Power save deaktivieren
Frage von nordie92Linux Netzwerk14 Kommentare

Moin moin, mein Raspberry Pi 3 Model B benötigt eine dauerhaft aktive WLAN-Verbindung. Leider bricht die WLAN-Verbindung nach einigen ...

Netzwerkmanagement
Netzwerkmanagment im Haus mit Switch, Panel und pfsense
gelöst Frage von CorraggiounoNetzwerkmanagement13 Kommentare

hi zusammen, wir sind gerade dabei das ganze Haus bzw. die einzelnen Zimmer mit netzwerkdosen zu versorgen. Vom Keller ...

Vmware
Server 2008 r2 vmware terminalserver
Frage von MasterCVmware12 Kommentare

Guten Abend zusammen, ich hoffe , dass einer von euch mir weiterhelfen kann ,bei meinem kack Problem ! Ist ...

Google Android
Empfehlung: Android Ortungsapp
gelöst Frage von certifiedit.netGoogle Android12 Kommentare

Guten Morgen, grundsätzlich vorweg, ich wollte mich eben schlau machen, bzgl einer Ortungsapp, welche Androidbasiert einem anderen Androidsmartphone mitteilt, ...