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 Mit batch string suchen und danach text einfügen

Mitglied: snowdream

snowdream (Level 1) - Jetzt verbinden

11.10.2011, aktualisiert 18.10.2012, 6207 Aufrufe, 18 Kommentare

Hallo zusammen, ich hoffe es hat einer eine Idee. Ich bin leider nicht so fit in der Programmierung, um dieses Problem selber lösen zu können.

Ich habe eine .txt mit folgendem Inhalt:

text1
text2
text3
;zyklischer Aufruf
text...
text...

Mit einer Batch möchte ich jetzt in der Datei suchen, und nach dem Suchstring einen Textblock einfügen, hier im Beispiel erst mal nur eine Zeile.
01.
@echo off & setlocal  
02.
set "Datei=C:\meine.txt"  
03.
set "Suchen=;zyklischer Aufruf"  
04.
set "Einfügen=neue Zeile mit einem Text"  
05.
  
06.
set "Bak=%temp%\txt.bak"  
07.
move "%Datei%" %Bak%  
08.
for /f "tokens=1* delims=:" %%i in ('findstr /n "^" %Bak%') do (set "Zeile=%%j" & call :ProcessLine)  
09.
goto :eof  
10.
  
11.
:ProcessLine  
12.
if not defined Zeile (>>"%Datei%" echo\ & goto :eof)  
13.
if "%Zeile%" neq "%Suchen%" (>>"%Datei%" echo %Zeile% & goto :eof)  
14.
 
15.
>>"%Datei%" echo %Zeile% 
16.
>>"%Datei%" echo %Einfügen% 
17.
goto :eof
Diesen Code hab ich hier aus dem Forum, er funktioniert auch soweit ganz gut.
Aber: beginnt die Zeile in meine.txt mit einem "&", dann wird in der Datei diese Zeile gelöscht und dafür "Echo ist off." rein geschrieben.

Beispiel:
&text1
&text2
text3
;zyklischer Aufruf
text...
text...
Mitglied: bastla
11.10.2011 um 21:41 Uhr
Hallo snowdream!
Diesen Code hab ich hier aus dem Forum
... wo er aber sicher etwas schöner formatiert war (was sich aber noch nachholen lässt ) ...

Ich würde das eher so schreiben:
01.
@echo off & setlocal 
02.
set "Datei=C:\meine.txt" 
03.
set "Suchen=;zyklischer Aufruf" 
04.
set "Einfügen=neue Zeile mit einem Text" 
05.
 
06.
set "Bak=%temp%\txt.bak" 
07.
move "%Datei%" %Bak% 
08.
for /f "tokens=1* delims=:" %%i in ('findstr /n "^" %Bak%') do (set "Zeile=%%j" & call :ProcessLine) 
09.
goto :eof 
10.
 
11.
:ProcessLine 
12.
13.
    setlocal enabledelayedexpansion 
14.
    echo\!Zeile! 
15.
    if "%Zeile%"=="%Suchen%" echo %Einfügen% 
16.
    endlocal 
17.
)>>"%Datei%" 
18.
 
19.
goto :eof
Grüße
bastla

[Edit] Korrektur für Ausgabe von Leerzeilen vorgenommen [/Edit]
Bitte warten ..
Mitglied: snowdream
12.10.2011 um 08:43 Uhr
Hallo Bastla,

besten Dank für deine Hilfe, läuft fast super. Allerdings wird, wenn Leerzeilen im Text vorhanden sind, zusätzlich immer eine Zeile mit "ECHO ist ausgeschaltet (OFF)." eingefügt.
Beispspie meine.txt:

01.
  
02.
&text1 
03.
&text2 
04.
 
05.
text3 
06.
;zyklischer Aufruf 
07.
text4 
08.
 
09.
text5
Kann man das auch noch unterdrücken?
Vielen Dank schon mal.
Bitte warten ..
Mitglied: bastla
12.10.2011 um 10:38 Uhr
Hallo snowdream!
... zusätzlich immer eine Zeile mit "ECHO ist ausgeschaltet (OFF)." eingefügt.
Sollte nach der oben vorgenommenen Korrektur nicht mehr passieren ...

Grüße
bastla

P.S.: Danke für's Formatieren ...
Bitte warten ..
Mitglied: jeb-the-batcher
12.10.2011 um 12:52 Uhr
Aber jetzt habe ich mit meinen Textdateien ein Problem

01.
Zeile1 
02.
..\..\..\windows\system32\calc.exe Zeile2 
03.
Zeile3
Irgendwie wird Zeile2 nie ausgegeben, dafür startet jetzt der Taschenrechner

Aber nach tausch der Zeile
01.
echo\!Zeile!
durch
01.
echo(!Zeile!
klappt auch das wuncerbar

jeb
Bitte warten ..
Mitglied: snowdream
12.10.2011 um 14:05 Uhr
Hallo Bastla,

läuft jetzt perfekt mit der Testdatei. Danke nochmal.
Allerdings scheint es nicht wirklich mit jeder beliebigen Textdatei zu funktionieren, die bat bricht bei einigen Text-Dateien einfach ab.
Wie ich drauf komme? Ich habe den Part mit der Tempdatei abgeändert
von
set "Bak=%temp%\txt.bak"
nach
set "Bak=C:\txt.bak"
Vor dem letzen "goto :eof" in Zeile 19 lösche ich dann die temporäre Datei mit "del %bak%" wieder. Mit der Testdatei, wie weiter oben beschrieben, funktioniert alles, die Temp-Datei wird angelegt und auch wieder gelöscht. Bei meiner wirklich zu bearbeitenden Datei bricht die Batch einfach ab (läuft nicht bis zum Ende durch), da die txt.bak nicht gelöscht wird. Ich muss mal noch ein wenig probieren ob ich raus finden kann, an was das genau liegt. Das kann allerdings etwas dauern, da ich momentan wenig Zeit dafür habe.

Gruß
snowdream
Bitte warten ..
Mitglied: bastla
12.10.2011 um 14:58 Uhr
Hallo snowdream!

Das "letzte" (hinsichtlich des Ablaufs) "goto :eof" befindet sich in Zeile 9!

Grüße
bastla
Bitte warten ..
Mitglied: jeb-the-batcher
12.10.2011 um 15:09 Uhr
Hallo snodream,

versuch es mal mit einer leicht abgeänderten Variante.
Die Probleme können unter anderem vorher in der Zeile
01.
if "%Zeile%"=="%Suchen%" echo %Einfügen% 
auftreten, wenn z.B. in Zeile etwas in der Art
01.
"Meins&Deins" & seins 
01.
@echo off 
02.
setlocal DisableDelayedExpansion 
03.
set "Datei=C:\meine.txt" 
04.
set "Suchen=;zyklischer Aufruf" 
05.
set "Einfügen=neue Zeile mit einem Text" 
06.
 
07.
set "Bak=%temp%\txt.bak" 
08.
move "%Datei%" %Bak% 
09.
10.
  for /f "tokens=1* delims=:" %%i in ('findstr /n "^" %Bak%') do ( 
11.
      setlocal enabledelayedexpansion 
12.
      set "Zeile=%%j" 
13.
      (echo(!Zeile!) 
14.
      if "!Zeile!"=="!Suchen!" echo(!Einfügen! 
15.
      endlocal 
16.
17.
) > "%Datei%" 
18.
 
jeb
Bitte warten ..
Mitglied: snowdream
12.10.2011 um 15:13 Uhr
Hallo bastla,

ich meinte es so:
01.
@echo off & setlocal  
02.
set "Datei=C:\meine.txt"  
03.
set "Suchen=;zyklischer Aufruf"  
04.
  
05.
set "Bak=C:\txt.bak"  
06.
move "%Datei%" %Bak%  
07.
for /f "tokens=1* delims=:" %%i in ('findstr /n "^" %Bak%') do (set "Zeile=%%j" & call :ProcessLine)  
08.
goto :eof  
09.
10.
:ProcessLine  
11.
(  
12.
    setlocal enabledelayedexpansion  
13.
    echo\!Zeile!  
14.
    if "%Zeile%"=="%Suchen%" type c:\einfügen.txt 
15.
    endlocal  
16.
)>>"%Datei%"  
17.
  
18.
del %bak% 
19.
goto :eof
Statt dem "Echo %Einfügen%" soll alles aus "c:\einfügen.txt" eingefügt werden. Funktioniert auch, halt aber nur mit bestimmten Text-Dateien.

Gruß
snowdream
Bitte warten ..
Mitglied: snowdream
12.10.2011 um 15:57 Uhr
Hallo jeb,

das funktioniert mit meiner "Problem-Datei", Weltklasse!
Kannst du mir vielleicht noch verraten, wie ich den statt dem "echo(!Einfügen!" in Zeile 14 eine type-befehl einbinden kann => type c:\einfügen.txt ?

Gruß
snowdream
Bitte warten ..
Mitglied: bastla
12.10.2011 um 16:45 Uhr
Hallo snowdream!

Abgesehen von der Tatsache, dass "del %bak%" weiterhin vor dem falschen "goto :eof" steht - gibt es ev einen Anhaltspunkt, was die Dateien, für die es nicht funktioniert, gemeinsam haben?

Grüße
bastla
Bitte warten ..
Mitglied: jeb-the-batcher
12.10.2011 um 16:57 Uhr
Hallo snowdream,

Zitat von snowdream:
Hallo jeb,

das funktioniert mit meiner "Problem-Datei", Weltklasse!
Kannst du mir vielleicht noch verraten, wie ich den statt dem "echo(!Einfügen!" in Zeile 14 eine type-befehl
einbinden kann => type c:\einfügen.txt ?

Ja, sollte eigentlich direkt so klappen

01.
if "!Zeile!"=="!Suchen!" type einfügen.txt
Weil alles was innerhalb des Block ausgegeben wird, in die Zieldatei umgeleitet wird.

jeb
Bitte warten ..
Mitglied: snowdream
12.10.2011 um 16:59 Uhr
so läuft es jetzt perfekt:
01.
@echo off  
02.
setlocal DisableDelayedExpansion  
03.
set "Datei=C:\meine.txt"  
04.
set "Suchen=;zyklischer Aufruf"  
05.
set "Einfügen=C:\einfügen.txt "  
06.
 
07.
del %temp% /f /q 
08.
set "Bak=%temp%\txt.bak"  
09.
move "%Datei%" %Bak%  
10.
(  
11.
  for /f "tokens=1* delims=:" %%i in ('findstr /n "^" %Bak%') do (  
12.
      setlocal enabledelayedexpansion  
13.
      set "Zeile=%%j"  
14.
      (echo(!Zeile!)  
15.
      if "!Zeile!"=="!Suchen!" type %Einfügen% 
16.
      endlocal  
17.
  )  
18.
) > "%Datei%" 
Danke an bastla & jeb für die schnelle Hilfe!
Bitte warten ..
Mitglied: snowdream
12.10.2011 um 17:03 Uhr
Zitat von bastla:
Hallo snowdream!

Abgesehen von der Tatsache, dass "del %bak%" weiterhin vor dem falschen "goto :eof" steht - gibt es ev
einen Anhaltspunkt, was die Dateien, für die es nicht funktioniert, gemeinsam haben?

Grüße
bastla

nein, leider nicht...
Bitte warten ..
Mitglied: snowdream
17.10.2011 um 16:51 Uhr
Hallo nochmal,

hat vielleicht einer noch eine Lösung, wie ich den einzufügenden Text z.B. 2 Zeilen unter dem eigentlichen Suchstring (";zyklischer Aufruf"") einfügen kann.
Ich hab schon einiges an Syntax ausprobiert, bekomme es aber nicht hin

Gruß
snowdream
Bitte warten ..
Mitglied: bastla
17.10.2011, aktualisiert 18.10.2012
Hallo snowdream!

Kann eigentlich der Suchstring auch mehrfach in der Datei vorkommen? Falls nein, würde ich eine Anleihe bei den Kollegen rubberman, Friemler und PH (in diesem Thread) nehmen und das so versuchen:
01.
@echo off & setlocal DisableDelayedExpansion 
02.
set "Datei=C:\meine.txt" 
03.
set "Suchen=;zyklischer Aufruf" 
04.
set /a Versatz=2 
05.
set "Einf=C:\einfügen.txt" 
06.
 
07.
set "ZeilenNr=" 
08.
for /f "delims=:" %%i in ('findstr /n /c:"%Suchen%" "%Datei%"') do set /a ZeilenNr=%%i 
09.
if not defined ZeilenNr ( 
10.
    echo "%Suchen%" in "%Datei%" nicht gefunden! 
11.
    goto :eof 
12.
13.
set /a ZeilenNr+=Versatz 
14.
 
15.
set "Bak=%temp%\txt.bak" 
16.
move "%Datei%" %Bak% 
17.
18.
    for /l %%i in (1,1,%ZeilenNr%) do ( 
19.
        set "Zeile=" 
20.
        set /p "Zeile=" 
21.
        setlocal enabledelayedexpansion 
22.
        echo(!Zeile! 
23.
        endlocal 
24.
25.
)<%Bak% >"%Datei%" 
26.
 
27.
>>"%Datei%" type "%Einf%" 
28.
>>"%Datei%" more +%ZeilenNr% %Bak%
Kurzer Hinweis zur Zeile 19: Falls es nach der Zeile mit dem Suchtext weniger als %Versatz% Zeilen gibt, wird dadurch nicht die letzte gefundene Zeile mehrfach in die Zieldatei geschrieben, sondern die fehlenden Quellzeilen werden durch Leerzeilen ersetzt ...

Grüße
bastla
Bitte warten ..
Mitglied: snowdream
18.10.2011 um 07:42 Uhr
Zitat von bastla:
Kann eigentlich der Suchstring auch mehrfach in der Datei vorkommen?

Hallo bastla, genau da liegt das Problem, den Suchstring gibt es zum Teil mehrmals. Hier ein Beispiel:

Text1
gleicher_Text
Suchstring
Text2
gleicher_Text
Suchstring
Text3
Text4

Ich möchte jetzt nur nach dem 1. Suchstring einfügen, also vor Text3. Mein Ansatz ist gewesen, in diesem Fall nach Text1 zu suchen und dann einfach 2 Zeilen danach einzufügen.
Ja, das hätte ich etwas besser beschreiben sollen! Somit funktioniert dein Codebeispiel nicht, wenn ich das richtig verstanden habe.

Gruß
snowdream
Bitte warten ..
Mitglied: bastla
18.10.2011 um 12:32 Uhr
Hallo snowdream!

Versuch es mit folgender Zeile 8:
for /f "delims=:" %%i in ('findstr /n /c:"%Suchen%" "%Datei%"') do if not defined ZeilenNr set /a ZeilenNr=%%i
Grüße
bastla
Bitte warten ..
Mitglied: snowdream
18.10.2011 um 13:52 Uhr
Hallo bastla,

was soll ich sagen... perfekt! Weltklase!

Gruß
snowdream
Bitte warten ..
Ähnliche Inhalte
Batch & Shell

(Batch) festgelegte Zeichen vor und nach Text einfügen

gelöst Frage von unauthorized-userBatch & Shell2 Kommentare

Hallo Community, ich stehe gerade vor einem (wahrscheinlich sehr banalem) Problem und benötige eure Hilfe. Ausgangssituation: Ich habe mehrere ...

Batch & Shell

Batch Datei durchsuchen und nach String eine zusätzliche Zeile einfügen

gelöst Frage von Borob14Batch & Shell5 Kommentare

Hi zusammen habe schon einiges in der Richtung in diesen und anderen Foren durchgelesen, verstehe den Syntax aber nicht ...

Visual Studio

Vb.net raw string in xdocument einfügen

gelöst Frage von Herbrich19Visual Studio6 Kommentare

Hallo, Ich würde gerne in ein Xdokument ein Raw String einfügen was ebenfalls auch XML besteht. Ziel ist es ...

Batch & Shell

Mittel Batch String suchen und an den Zeilenanfang kopieren

gelöst Frage von Morpheus43Batch & Shell3 Kommentare

Hallo, ich suche eine Lösung in Batch: Ich habe ein Logfile von Tasks, alle Zeilen haben irgendwo einen String ...

Neue Wissensbeiträge
E-Mail
Email-Apps und Verhalten bei Pop3
Erfahrungsbericht von kfranzk vor 1 TagE-Mail6 Kommentare

Hallo Freunde, da mir mein diesbezüglicher Faden als gelöst markiert wurde, muss ich hier neu aufsetzen. Ich arbeite bewusst ...

Hyper-V

Optimiertes Ubuntu per Microsoft Hyper-V-Schnellerstellung verfügbar

Anleitung von Frank vor 1 TagHyper-V

Für Microsofts Virtualisierungssoftware Hyper-V ist ab sofort auch ein optimiertes Ubuntu 18.04.1 LTS verfügbar. In der "Hyper-V-Schnellerstellung" App, die ...

Sicherheits-Tools

Trend Micro WorryFree Business Security (WFBS) 10 - neuer Patch 1470 verfügbar

Tipp von VGem-e vor 1 TagSicherheits-Tools1 Kommentar

Servus, mal sehen, ob mit Patch 1470, zu finden unter dann die angeblich fehlerhafte Funktion, die unter W10 im ...

Server-Hardware

Lösung für Ersatz eines defekter Raid-Controllers

Anleitung von wellknown vor 1 TagServer-Hardware4 Kommentare

Hallo, da ich nichts gefunden habe und selbst eine Lösung brauchte, hier eine kleine Anleitung für alle die vor ...

Heiß diskutierte Inhalte
Windows Server
Mit der alten Domäneprofil anmelden ohne Server
gelöst Frage von SyosseWindows Server37 Kommentare

Hallo Jungs Folgendes Szenario: Ich habe bei einem sehr kleinen Unternehmen (2Personen) den Server migriert, soweit hat alles geklappt. ...

Sicherheits-Tools
Virenprogramm lässt Programme nicht starten
Frage von SurferGirlSicherheits-Tools23 Kommentare

Hallo, ich bin neu hier, ich hoffe ich habe die richtige Rubrik gewählt. Falls nicht, tut es mir leid. ...

Windows Server
SQL Server Instanz (Eplan) auf WIN 2008 RC2 Server frisst RAM ohne Limit
Frage von derinderinderinWindows Server17 Kommentare

Hallo Zusammen, Wir haben hier einen Windows 2008 RC2 Server. Darauf läuft ein SQL Server Express 2014 Version 12.0.4232.0. ...

Windows 10
Best Practice für Schulungsräume
Frage von Sn0wFoxWindows 1016 Kommentare

Hallo, leider bin ich auch nach langer Suche nicht auf eine zufriedenstellende Nicht-Cloud-Lösung gestoßen und wollte mal Fragen ob ...