Zeile in html finden und ersetzen
Guten Abend
Ich habe ein Batch mit dem ich eine zeile in eine html hinzufüge.
Nun bräuchte ich noch die Passende IF Abfrage
Ist die Zeile schon vorhanden== erseten.
Danke
Die Batch
Ich habe ein Batch mit dem ich eine zeile in eine html hinzufüge.
Nun bräuchte ich noch die Passende IF Abfrage
Ist die Zeile schon vorhanden== erseten.
Danke
Die Batch
@echo off & setlocal
set "Datei=flyout2.html"
set "Suche=function"
set "Zufuege=var pw = 0000;"
set "TempTxt=%temp%\TT.txt"
copy "%Datei%" "%TempTxt%">nul
set Zeile=0
for /f "delims=:" %%i in ('findstr /n /i /b /c:"%Suche%" "%TempTxt%"') do set Zeile=%%i
del "%Datei%"
if %Zeile%==0 goto :Rest
for /f "tokens=1* delims=:" %%i in ('findstr /n $ "%TempTxt%"') do if %%i leq %Zeile% echo.%%j>>"%Datei%"
echo %Zufuege%>>"%Datei%"
:Rest
more +%Zeile% "%TempTxt%">>"%Datei%"
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 88870
Url: https://administrator.de/forum/zeile-in-html-finden-und-ersetzen-88870.html
Ausgedruckt am: 14.05.2025 um 03:05 Uhr
13 Kommentare
Neuester Kommentar
Hallo haufeft!
Wenn ich das richtig interpretiere, soll die Zeile
nach der einzigen Zeile mit dem Zeilenanfang "function" in der Datei stehen - egal, ob erstere noch nicht vorhanden war oder vorher anders lautete.
Soferne diese Zeile als einzige mit
beginnt, müsstest Du eigentlich nur eine Zeile
am Anfang des Batches (etwa in Zeile 10) hinzufügen und die letzte Zeile (23) ändern auf:
Grüße
bastla
Wenn ich das richtig interpretiere, soll die Zeile
var pw = 0000;
Soferne diese Zeile als einzige mit
var pw =
set "Entferne=var pw = "
more +%Zeile% "%TempTxt%"|findstr /v /i /b /c:"%Entferne%">>"%Datei%"
bastla
Hallo haufeft!
Mit der HTML-typischen Ansammlung von "<", ">" und auch noch Anführungszeichen ist zumeist der Punkt erreicht, wo ein Lösungsversuch mit Batch aufhört Spaß zu machen ...
... vor allem, wenn Du als Vergleich eine VBScript-Version betrachtest:
Hier musst Du nur darauf achten, die Werte für "Von" und "Nach" in Anführungszeichen einzuschließen und innerhalb der beiden Texte jedes Anführungszeichen zu verdoppeln.
Wegen der Menge an Anführungszeichen ist übrigens eine Version mit Parameterübergabe (der Werte für "Von" und "Nach") etwas mühsam zu realisieren; dies gilt nicht für den Dateinamen, sodass also etwa ein Aufruf aus einer Batch-"for"-Schleife problemlos vorgenommen werden könnte.
Da es in Deiner Beispieldatei keine Stelle mit
gibt, war ich so frei, zur Demo die Alternative
zu verwenden ... 
Vielleicht hätte aber auch schon
genügt - aber es gilt (wie immer beim Suchen) auch hier: je länger der Suchbegriff, desto genauer das Ergebnis.
Grüße
bastla
Mit der HTML-typischen Ansammlung von "<", ">" und auch noch Anführungszeichen ist zumeist der Punkt erreicht, wo ein Lösungsversuch mit Batch aufhört Spaß zu machen ...
... vor allem, wenn Du als Vergleich eine VBScript-Version betrachtest:
'Ersetzen.vbs
F = "D:\flyout2.html"
Von = "<input type=""text"" name=""name"""
Nach = "<input type=""text"" name=""dein name"""
Set fso=CreateObject("Scripting.FileSystemObject")
T = fso.OpenTextFile(F).ReadAll
fso.OpenTextFile(F, 2, True).Write Replace(T, Von, Nach)
Wegen der Menge an Anführungszeichen ist übrigens eine Version mit Parameterübergabe (der Werte für "Von" und "Nach") etwas mühsam zu realisieren; dies gilt nicht für den Dateinamen, sodass also etwa ein Aufruf aus einer Batch-"for"-Schleife problemlos vorgenommen werden könnte.
Da es in Deiner Beispieldatei keine Stelle mit
<input name="name"
<input type="text" name="name"
Vielleicht hätte aber auch schon
Von = """name"""
Nach = """dein name"""
Grüße
bastla
Hallo haufeft!
Schematisch könnte das so aussehen:
Die Reihenfolge (und Anzahl) der Angaben in "Von" und "Nach" muss übereinstimmen, wobei in "Von" jeweils der Platzhalter der Vorlage angeführt ist.
Die Eingabe per "InputBox" ließe sich noch etwas ansprechender gestalten, indem ein mehzeiliger Text und ev noch ein Fenstertitel festgelegt wird; auch die Vorgabe eines Defaultwertes wäre möglich, aber hier vermutlich nicht sinnvoll. Eine entsprechende Zeile sähe dann so aus:
Grüße
bastla
Schematisch könnte das so aussehen:
'Ersetzen.vbs
F = "D:\flyout2.html"
Von = Array("value=""Name""", _
"value=""IP""", _
"value=""Nick""", _
"value=""Pass""")
NName = InputBox("Name:")
NIP = InputBox("IP:")
NLogin = InputBox("Login:")
NPass = InputBox("Passwort:")
Nach = Array("value=""" & NName & """", _
"value=""" & NIP & """", _
"value=""" & NLogin & """", _
"value=""" & NPass & """")
Set fso=CreateObject("Scripting.FileSystemObject")
T = fso.OpenTextFile(F).ReadAll
For i = 0 To UBound(Von)
T = Replace(T, Von(i), Nach(i))
Next
fso.OpenTextFile(F, 2, True).Write T
Die Eingabe per "InputBox" ließe sich noch etwas ansprechender gestalten, indem ein mehzeiliger Text und ev noch ein Fenstertitel festgelegt wird; auch die Vorgabe eines Defaultwertes wäre möglich, aber hier vermutlich nicht sinnvoll. Eine entsprechende Zeile sähe dann so aus:
NIP = InputBox("Bitte geben Sie die IP" & vbCrLF & vbCrLF "hier ein:", _
"IP-Eingabe", _
"127.0.0.1")
Grüße
bastla
Hallo haufeft!
Ohne den Hintergrund der ganzen Aktion zu kennen, frage ich mich (bzw jetzt Dich
), ob Du vielleicht "indivualisierte" Versionen immer der gleichen Ausgangsdatei benötigst?
In diesem Fall müsste eigentlich nur noch nach dem Namen (der Pfad könnte vielleicht konstant sein, und der Typ ".html" kann automatisch ergänzt werden) der Zieldatei gefragt werden, und es könnte, anstatt in der Quelldatei die Ersetzung vorzunehmen, einfach eine neue Datei erstellt werden. Als (ungetesteter) Ersatz für die Zeile 24 sähe das so aus:
Wenn Du das Eingabefenster einfach schließt bzw nichts eingibst, wird das Script beendet, ansonsten wird die Existenz einer gleichnamigen Zieldatei überprüft, um ein Überschreiben zu vermeiden und der (bereits vorhandene) Dateiname zum Editieren angeboten.
Oder liege ich mit meiner Überlegung ganz falsch? Dann müssten die aktuellen Werte aber sinnvoller Weise in einer Textdatei zwischengespeichert werden, um auch beim nächsten Aufruf des Scripts noch zur Verfügung zu stehen.
Grüße
bastla
Ohne den Hintergrund der ganzen Aktion zu kennen, frage ich mich (bzw jetzt Dich
In diesem Fall müsste eigentlich nur noch nach dem Namen (der Pfad könnte vielleicht konstant sein, und der Typ ".html" kann automatisch ergänzt werden) der Zieldatei gefragt werden, und es könnte, anstatt in der Quelldatei die Ersetzung vorzunehmen, einfach eine neue Datei erstellt werden. Als (ungetesteter) Ersatz für die Zeile 24 sähe das so aus:
Pfad = "D:\Dein Pfad"
Neu = InputBox("Bitte den Dateinamen eingeben:", "Dateiname", "Defaultname")
Do Until Neu = "" Or Not fso.FileExists(Pfad & "\" & Neu & ".html")
Neu = InputBox("Datei bereits vorhanden - bitte neu eingeben:", "Dateiname", Neu)
Loop
If Neu = "" Then
WScript.Echo "Datei wurde nicht erstellt."
WScript.Quit
Else
fso.OpenTextFile(Pfad & "\" & Neu & ".html", 2, True).Write T
End If
Oder liege ich mit meiner Überlegung ganz falsch? Dann müssten die aktuellen Werte aber sinnvoller Weise in einer Textdatei zwischengespeichert werden, um auch beim nächsten Aufruf des Scripts noch zur Verfügung zu stehen.
Grüße
bastla
Hallo haufeft!
Es gibt verschiedene Möglichkeiten dafür - allgemein kannst Du Systemvariablen so auslesen:
Falls Du mehrere der Variablen auslesen willst, immer nur die zweite Zeile (angepasst) verwenden - die erste Zeile ist nur einmal am Anfang des Scripts erforderlich.
Grüße
bastla
Es gibt verschiedene Möglichkeiten dafür - allgemein kannst Du Systemvariablen so auslesen:
set WshShell = WScript.CreateObject("WScript.Shell")
UserName = WshShell.ExpandEnvironmentStrings("%Username%")
Grüße
bastla
Hallo haufeft!
Wenn Du Anführungszeichen verwendest, weist Du Basic damit an, den dazwischen stehenden Text als Konstante zu betrachten und (in diesem Fall) einfach auszugeben.
Wenn Du nur
schreibst, sucht der Interpreter nach einer Variablen dieses Namens, findet sie in diesem Fall auch und gibt deren Inhalt aus.
Um mehrere "Textbausteine" (Konstante oder Variable) zu verknüpfen, verwende dafür ein "&" - Beispiel:
Grüße
bastla
Wenn Du Anführungszeichen verwendest, weist Du Basic damit an, den dazwischen stehenden Text als Konstante zu betrachten und (in diesem Fall) einfach auszugeben.
Wenn Du nur
WScript.Echo UserName
Um mehrere "Textbausteine" (Konstante oder Variable) zu verknüpfen, verwende dafür ein "&" - Beispiel:
set WshShell = WScript.CreateObject("WScript.Shell")
UserName = WshShell.ExpandEnvironmentStrings("%UserName%")
UserDatei = "D:\Dein Pfad" & "\" & UserName & ".txt"
WScript.Echo UserDatei
bastla