fliop1
Goto Top

Mit Batch htm-datei auslesen string suchen und darunter Inhalt einer TXT Datei einfügen

Hallo,

ich möchte eine *.Htm Datei mit Hilfe einer Batch durchsuchen lassen nach einem String z.B. <hier> und nach diesem String soll dann der inhalt einer Textdatei eingefügt werden z.B. 123 hier ein Beispiel:

test.htm

html befehle usw
bla
blaaaa
<hier>
noch mehr html befehle 
und
so
weiter

und in der test2.txt steht
123
nach dem Batchdurchlauf soll die neue test.htm folgendermaßen aussehen:

html befehle usw
bla
blaaaa
<hier>
123
noch mehr html befehle 
und
so
weiter

Ich schaffe es normale Dateien zu durchsuchen aber leider hängt es bei den ganzen html befehlen, leider kam ich auch mit ähnlichen Lösungen nicht weiter!

Normale Dateien kann ich mit folgendem Befehlen durchsuchen, klappt auch einwandfrei - ich weiß, da HTML Codes durchsucht werden sollen, etwas verändert werden muss und die < und > besonders maskiert werden müssen.. aber ich komme nicht weiter..

@echo off & Setlocal

set "Nach=abc"  
set "Datei=txt2.txt"  
set "DateiTmp=Textfile.tmp"  
move "%Datei%" "%DateiTmp%"   
for /f "delims=" %%i in (%DateiTmp%) do (   
    >>"%Datei%" echo %%i  
    echo %%i|findstr /b "%Nach%">nul && >> echo more txt1.txt >> "%Datei%"  
)
pause

Kann mir bitte jemand helfen!

Danke und viel grüße!

Content-Key: 161729

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

Printed on: April 16, 2024 at 16:04 o'clock

Member: Snowman25
Snowman25 Feb 28, 2011 at 14:40:42 (UTC)
Goto Top
Hallo @fliop1 und willkommen auf Administrator.de,

wärst du bitte so freundlich und formatierst deinen Code ?
Dann ist deine Frage schonmal wesentlich einfacher zu lesen und die User zeigen sich hilfsbereiter. Inwiefern hast du es denn bisher geschafft, normale Dateien zu durchsuchen?
Mit welchem Befehl/Programm hast du das gemacht bzw. wie sieht die Schleife dazu aus?

Wenn es nur um das massenweise ändern geht, dann wäre evtl. auch Notepad++ für deine Aufgabe zu empfehlen. Hier müsstest du alle fraglichen Dateien öffnen und die Suchen&Ersetzen-Funktion auf den gesuchten Wert loslassen. Als Austauschstring gibst du deinen Suchstring + den Inhalt von 123 an.
Geht dein Suchtext und/oder dein Einfügetext über mehrere Zeilen, so müsstest du dir noch die Regeln zu regulären Ausdrücken innerhalb des NP++ anschauen.

Gruß
Snow
Member: fliop1
fliop1 Feb 28, 2011 at 15:07:51 (UTC)
Goto Top
Habe es angepasst, Notepad kommt leider nicht in Frage, es geht darum bei vielen Leuten die Signatur von Mails zu ändern - und daher wäre es besser mit einem Doppelklick die Änderung durchzuführen! Der Inhalt des einzufügenden Textes ist mehrere Zeilen lang, daher dachte ich an move txt1.txt << txt2.htm an der gesuchten Stelle!
Member: Snowman25
Snowman25 Feb 28, 2011 at 15:13:28 (UTC)
Goto Top
Da du nach einem Batchscript fragst und es um Emailsignaturen geht, vermute ich mal, dass ihr Outlook verwendet?
Dafür gibt es ein tolles Tool von zerbIT, gennant OutlookSignature.
Die Software ist Freeware und ermöglicht eine zentrale Verwaltung von Signaturen mit verschiedensten Outlook-Versionen.
Tut mir leid, falls du eine Batch-antwort erwartet hättest, aber ich empfehle lieber Sachen mit Hand und Fuß anstatt einmalige Lösungen.


Gruß
Snow
Member: fliop1
fliop1 Feb 28, 2011 at 15:20:21 (UTC)
Goto Top
Wir verwenden Lotus Notes face-smile Und es geht tatsächlich nur um eine einmalige Änderung daher wäre es sehr praktisch!
Member: Snowman25
Snowman25 Feb 28, 2011 at 15:27:17 (UTC)
Goto Top
Na wenn das so ist, gibt es schon einige Fragen zu diesem Thema. z.B. hier: Batch Problem, Suchen und Ersetzen in einer ini-Datei
Member: bastla
bastla Feb 28, 2011 at 15:31:40 (UTC)
Goto Top
Hallo fliop1 und willkommen im Forum!

Für die Bearbeitung einer HTML-Datei würde ich ja eigentlich reflexartig zu VBS greifen, aber da Du nun schon einen Batch suchst, etwa so:
@echo off & setlocal
set "Nach=<hier>"  
set "Datei=txt2.txt"  
set "DateiEinf=txt1.txt"  

set "DateiTmp=Textfile.tmp"  
move "%Datei%" "%DateiTmp%"   
for /f "usebackq delims=" %%i in ("%DateiTmp%") do set "Zeile=%%i" & call :ProcessLine  
pause
goto :eof

:ProcessLine
setlocal enabledelayedexpansion
>>"%Datei%" echo !Zeile!  
echo "!Zeile!"|findstr /b /L """%Nach%">nul && type "%DateiEinf%">>"%Datei%"  
endlocal
goto :eof
Grüße
bastla
Member: fliop1
fliop1 Feb 28, 2011 at 15:54:56 (UTC)
Goto Top
set "Nach=<td class="inner">&nbsp;Germany</td>"  

Besteht auch die Möglichkeit hiernach zu suchen? Nach <hier> funktioniert perfekt.. aber sobald ich nach <td class="inner">&nbsp;Germany</td> ist es vorbei und es kommen Fehler..

Aber vielen vielen Dank schon mal! Beide Sachen waren schon mal sehr hilfreich! Ich probier gleichzeitig noch rum, vllt finde ich es ja auch selber noch raus ansonsten freu ich mich auf weiter Hilfe face-smile

Grüße
Member: Snowman25
Snowman25 Feb 28, 2011 at 16:03:00 (UTC)
Goto Top
Du musst die Anführungszeichen und möglicherweise auch die UND-Zeichen maskieren.
Also so:
set "Nach=<td class=^"inner^">^&nbsp;Germany</td>"

Gruß
Snow
Member: bastla
bastla Feb 28, 2011 at 16:06:57 (UTC)
Goto Top
@Snowman
Du musst die Anführungszeichen und möglicherweise auch die UND-Zeichen maskieren.
Nicht in einem Suchstring ...
Soferne es nicht unbedingt eine Suche am Zeilenanfang (also mit "/b") sein muss, könnte eigentlich
echo "!Zeile!"|findstr /L "%Nach%">nul && type "%DateiEinf%">>"%Datei%"
(als Ersatz der Zeile 15) funktionieren ... [Edit] wird's doch nicht tun face-sad [/Edit]

Grüße
bastla
Member: Snowman25
Snowman25 Feb 28, 2011 at 16:08:01 (UTC)
Goto Top
Zitat von @bastla:
@Snowman
> Du musst die Anführungszeichen und möglicherweise auch die UND-Zeichen maskieren.
Nicht in einem Suchstring ...

Also zumindest die Anführungszeichen muss er maskieren.
Member: bastla
bastla Feb 28, 2011 at 16:31:16 (UTC)
Goto Top
@Snowman
Anführungszeichen kannst Du nicht maskieren, sondern bestenfalls verdoppeln ...

... aber bevor sich das Ganze noch mehr in die Länge zieht, lieber gleich die VBS-Ausführung:
Datei = "txt2.txt"  
DateiEin = "txt1.txt"  
Nach = "<td class=""inner"">&nbsp;Germany</td>"  

LNach = Len(Nach)
Set fso = CreateObject("Scripting.FileSystemObject")  
Ein = fso.OpenTextFile(DateiEin).ReadAll
Inhalt = Split(fso.OpenTextFile(Datei).ReadAll, vbCrLf)

For i = 0 To UBound(Inhalt)
    If Left(Inhalt(i), LNach) = Nach Then Inhalt(i) = Inhalt(i) & vbCrLf & Ein
Next
fso.CreateTextFile(Datei).Write Join(Inhalt, vbCrLf)
Wenn die zu bearbeitende Datei per Kommandozeilenparameter - also etwa aus einem Batch mit:
cscript //nologo "C:\Utils\SigEinf.vbs" "D:\txt2.txt"
oder per Drag & Drop übergeben werden soll, die Zeile 1 durch
If WScript.Arguments.Count = 0 Then
    WScript.Echo "Bitte zu bearbeitende Datei als Parameter übergeben!"  
    WScript.Quit 1
End If
Datei = WScript.Arguments(0)
ersetzen.

Grüße
bastla

[Edit] VBS-Version durch andere Variante ersetzt [/Edit]
Member: pieh-ejdsch
pieh-ejdsch Feb 28, 2011 at 20:04:46 (UTC)
Goto Top
moin zusammen,

Die zu dursuchenden Zeilen mit Findstr in der Forschleife habe ich öfter mittels Temporären Script gemacht, da so die Ausgabe dieses Scriptes vom Findstr verarbeitet wird.
dabei ist es unerheblich ob in dieser Zeile SonderZeichen oder eine Ungerade Anzahl Anführungszeichen enthalten sind.

@echo off & setlocal disabledelayedexpansion
set "Nach=<hier>"  
set "Datei=txt2.txt"  
set "DateiEinf=txt1.txt"  

set "DateiTmp=Textfile.tmp"  

>"%temp%\Line.cmd" echo @echo off ^& setlocal enabledelayedexpansion  
>>"%temp%\Line.cmd" echo echo.!Zeile!  
>>"%temp%\Line.cmd" echo endlocal  

move "%Datei%" "%DateiTmp%"  
for /f "usebackq delims=" %%i in ("%DateiTmp%") do set "Zeile=%%i" & call :ProcessLine  
del "%temp%\Line.cmd"  
pause
goto :eof

:ProcessLine
setlocal enabledelayedexpansion
>>"%Datei%" echo !Zeile!  
"%temp%\Line.cmd"|findstr /b /L "%Nach%">nul && type "%DateiEinf%">>"%Datei%"  
endlocal
goto :eof

Gruß Phil
Member: bastla
bastla Feb 28, 2011 at 20:13:19 (UTC)
Goto Top
@ph
[Edit] Das Problem ist nicht die Ausgabe der Zeile, sondern der Suchstring %Nach% ...

... leicht zu erkennen, wenn zB anstelle des richtigen
set "Nach=<td class="inner">&nbsp;Germany</td>" 
eine leicht abgewandelte Version verwendet wird:
set "Nach=<td class="inner">&nbsp;Germany2</td>" 
Ersetzt wird nämlich auch dann ...
/Edit]

Grüße
bastla
Member: pieh-ejdsch
pieh-ejdsch Feb 28, 2011 at 20:26:31 (UTC)
Goto Top
ist doch auch kein Problemchen.

da müsste doch /g:"Datei" Temporär auch gehen

@echo off & setlocal disabledelayedexpansion
set "Nach=<hier>"  
set "Datei=txt2.txt"  
set "DateiEinf=txt1.txt"  

set "DateiTmp=Textfile.tmp"  

>"%temp%\Line.cmd" echo @echo off ^& setlocal enabledelayedexpansion  
>>"%temp%\Line.cmd" echo echo.!Zeile!  
>>"%temp%\Line.cmd" echo endlocal  

setlocal enabledelayedexpansion
>"%temp%\Suchtext" echo !Nach!  
endlocal

move "%Datei%" "%DateiTmp%"  
for /f "usebackq delims=" %%i in ("%DateiTmp%") do set "Zeile=%%i" & call :ProcessLine  
del "%temp%\Line.cmd"  
pause
goto :eof

:ProcessLine
setlocal enabledelayedexpansion
>>"%Datei%" echo !Zeile!  
"%temp%\Line.cmd"|findstr /b /g:"%temp%\Suchtext">nul && type "%DateiEinf%">>"%Datei%"  
endlocal
goto :eof

auch genügen.

Gruß Phil
Member: bastla
bastla Feb 28, 2011 at 20:37:09 (UTC)
Goto Top
@ph
Yep - damit wär's dann wohl erschlagen ... face-smile

... wobei aber die eine Temporärdatei auch noch eingespart werden könnte:
@echo off & setlocal disabledelayedexpansion
set "Nach=<td class="inner">&nbsp;Germany</td>"  
set "Datei=txt2.txt"  
set "DateiEinf=txt1.txt"  

set "DateiTmp=Textfile.tmp"  

setlocal enabledelayedexpansion
>"%temp%\Suchtext" echo "!Nach!  
endlocal

move "%Datei%" "%DateiTmp%"  
for /f "usebackq delims=" %%i in ("%DateiTmp%") do set "Zeile=%%i" & call :ProcessLine  
pause
goto :eof

:ProcessLine
setlocal enabledelayedexpansion
>>"%Datei%" echo !Zeile!  
echo "!Zeile!"|findstr /b /g:"%temp%\Suchtext">nul && type "%DateiEinf%">>"%Datei%"  
endlocal
goto :eof
Grüße
bastla

P.S.: Ohne Parameterprüfung wäre in diesem Fall aber mal die VBS-Variante kürzer ... face-wink