darkpassenger
Goto Top

Mit Batch Text an bestimmter Stelle in anderer Batch einfügen

Hallo zusammen,

als Ausgangspunkt dient mir folgende Frage: Mittels Batch an bestimmte Stelle der win.ini schreiben.


ich bin auf diesen Eintrag gestoßen, da ich selbst ein Batch-Script schreiben muß, welches an eine gewisse Position einen bestimmten Text hängt.

Die Version von bastla habe ich genommen und für meine Zwecke etwas angepasst.... dachte auch, es würde funktionieren.

Mein Problem ist allerdings das folgende:

In meinem Fall handelt es sich um Batch-Dateien, die angepasst werden müssen. Lasse ich das Script laufen, wird auch eine Ausgabe mit eingefügtem Text erzeugt, leider werden die Sprungmarken aus der Batch ohne "Doppelpunkt" übernomme.

Also

"text"
:sprungMarke
"text"


liefert


"text"
sprungMarke
"text"

Kann mir jemand sagen, wie ich mein Script anpassen muss? Ich komme einfach nicht drauf.

Wäre für jede Hilfe äußerst dankbar!

Viele Grüße

Content-Key: 179263

Url: https://administrator.de/contentid/179263

Printed on: April 24, 2024 at 17:04 o'clock

Member: Biber
Biber Jan 20, 2012 at 14:41:30 (UTC)
Goto Top
Moin Schwarzfahrer,

willkommen im Forum.

Es existieren zwei mitgelieferte FIND-Utilities, mit denen du eine Durchnummerierung aller Zeilen erreichen kannst - FIND.exe und FINDSTR.exe.
bastla verwendete in den o.a. Skript das neuere, etwas facegeliftete namens FindStr.exe mit dieser Syntax, um alle Zeilen inkl. Leerzeilen durchzunummerieren:
[Demo am CMD-Prompt]
REM FindStr-Verwendung in einer ZEILE ...for /f "tokens=1* delims=:" %%i in ('findstr /n $ "%TempTxt%"') ...
d:\temp>findstr /n $ meineini.ini
1:[MeineSection]
2:; eine Kommentarzeile mit ein paar == (Gleichheitszeichen) ==
3:; neuevar=wert
4:neuevar=wert
--> so wird es verwendet und in der FOR/F-Anweisung die Nummerierung wieder entfernt, allerdings dadurch, dass der ":"/Doppelpunkt als Delimiter verwendet wird.
Da du aber die Doppelpunkte erhalten miusst, weiche auf FIND aus - das bietet den Delimiter "]" für deine Zwecke an.

Leider kann FIND aber nicht nach "$" = alle Zeilen mit CRLF suchen, also suchen wir nach allen Zeilen, die ein Suchwort NICHT enthalten (mit Option /v):
[Demo am CMD-Prompt]
d:\temp>find /v /n "blubberlutsch" meineini.ini
---------- MEINEINI.INI
[1][MeineSection]
[2]; eine Kommentarzeile mit ein paar == (Gleichheitszeichen) ==
[3]; neuevar=wert
[4]neuevar=wert

d:\temp>findstr /v /n "blubberlutsch" meineini.ini
1:[MeineSection]
2:; eine Kommentarzeile mit ein paar == (Gleichheitszeichen) ==
3:; neuevar=wert
4:neuevar=wert


--> die erste gezeigte FIND-Ausgabe enthält die Zeilennummern eingefasst in "[" und "]".
Die zweite Ausgabe (FindStr) zeigt das entsprechende Ergebnis von FindStr mit Option /v zum Vergleich.

Mit FOR /f "tokens=1* delims=]" %%i.... würdest du die wegbekommen.
Und die überflüssige Zeile "------MEINE.INI" mit einem angehängten "^|Find/V "----"

Demo
d:\temp>for /F "tokens=1* delims=]" %i in ('Find /v /n "blubberlutsch" meineini.ini^|find /v "---"') do @echo %j
[MeineSection]
; eine Kommentarzeile mit ein paar == (Gleichheitszeichen) ==
; neuevar=wert
neuevar=wert

Grüße
Biber
Member: bastla
bastla Jan 20, 2012 at 15:59:54 (UTC)
Goto Top
@Biber
Und die überflussige Zeile "------MEINE.INI" mit einem angehängten "^|Find/V "----"
... oder gleich vermeiden mit
for /F "tokens=1* delims=]" %i in ('Find /v /n "blubberlutsch"^<meineini.ini') do @echo %j
Grüße
bastla

P.S.: Und Du schreibst Deine Batches immer noch ohne Verwendung von "blubberlutsch"? face-wink
Member: Biber
Biber Jan 21, 2012 at 00:20:59 (UTC)
Goto Top
[OT]
Moin bastla,

Zitat von @bastla:
P.S.: Und Du schreibst Deine Batches immer noch ohne Verwendung von "blubberlutsch"? face-wink
Na ja, ich speichere meine Oneliner ja selten als Batch ab, deshalb musste ich die Demo ja mit einer *.ini-Datei vorkaspern.. face-wink

Schönes Wochenende
Biber
[/OT]
Member: DarkPassenger
DarkPassenger Jan 21, 2012 at 16:30:47 (UTC)
Goto Top
Hallo ihr beiden,

@Biber: VIelen Dank für deinen Code... er behebt auf jeden Fall das Problem des Entfernens der Doppelpunkte. Was jetzt leider nicht mehr funktioniert ist das Einfügen eines Textes an eine bestimmte Stelle:


Mit folgendem Code suche ich nach einer bestimmten Stelle in der Datei:

 
for /f "delims=:" %%i in ('findstr /n /i /b /c:"%Mark%" "%TempTxt%"') do set Zeile=%%i  


es wird auch die richtige Zeile gefunden: in meinem Fall, Zeile= 178

Anschließend füge ich den Text ein, mit deinem (Biber) angepassten Code:

if %Zeile%==0 goto :Rest

for /F "tokens=1* delims=]" %%i in ('Find /v /n "blubberlutsch" "%TempTxt%"') do  if %%i leq %Zeile% echo. %%j>>%Quelle%    

Schließlich soll der Text an diese Stelle, also ab Zeile 179 eingefügt werden:

for /f "tokens=*" %%A in (<$einzufügenderTxt.txt>) do echo %%A>>%Quelle%  

Am Ende soll dann noch der restliche Text nach dem eingefügten Text wieder angefügt werden.

:Rest
more +%Zeile% "%TempTxt%">>"%Quelle%"  

Was ist das Resultat des ganzen?

Der Text wird zwar eingefügt, aber immer ans Ende der Datei... zusätzlich werden ab Zeile 179 alle anderen Zeilen nochmal hintendran gehangen.

Also:

Ursprünglicher Text 800 Zeilen

wird zu

#Ursprünglicher Text+
#eingefügter Text+
#Text ab Zeile 179

Ich blicke gerade überhaupt nicht mehr durch.. bin mir sicher, dass es nur ne Kleinigkeit ist

Wenn mir einer von euch noch einmal helfen könnte, wäre echt super!

Viele Grüße
Member: bastla
bastla Jan 21, 2012 at 19:26:47 (UTC)
Goto Top
Hallo DarkPassenger!

Wird's eventuell besser, wenn Du
for /f "tokens=1* delims=" %%i in ('find /v /n "blubberlutsch"^<"%TempText%"') do if %%i leq %Zeile% >>"%Quelle%" echo.%%j
verwendest (beachte den zweiten Delimiter; die anderen Änderungen sind nur Kosmetik)?
Das Einfügen der neuen Zeile (wenn diese offensichtlich aus einer Datei stammt) würde ich übrigens per
>>"%Quelle%" type $einzufügenderTxt.txt
erledigen.

Grüße
bastla