haufeft
Goto Top

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
@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%"  

Content-Key: 88870

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

Printed on: May 9, 2024 at 07:05 o'clock

Member: bastla
bastla Jun 01, 2008 at 21:45:05 (UTC)
Goto Top
Hallo haufeft!

Wenn ich das richtig interpretiere, soll die Zeile
var pw = 0000;
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
var pw = 
beginnt, müsstest Du eigentlich nur eine Zeile
set "Entferne=var pw = "  
am Anfang des Batches (etwa in Zeile 10) hinzufügen und die letzte Zeile (23) ändern auf:
more +%Zeile% "%TempTxt%"|findstr /v /i /b /c:"%Entferne%">>"%Datei%"  
Grüße
bastla
Member: haufeft
haufeft Jun 01, 2008 at 22:12:41 (UTC)
Goto Top
Danke Bastla es geht^^ 1a wie immer bei Dir
Member: haufeft
haufeft Jun 02, 2008 at 18:05:13 (UTC)
Goto Top
Hallo und Danke an Biber
Hab ein gleiches neues Problem

Ich wollte mit dem Batch an eine bestimmt stelle in meinem Form eine value setzen, leider versage ich schon bei der suche....

hier mal die html :

<form method="post" onsubmit="document.location.href='teamspeak://'+this.ippo.value+'/?nickname='+this.name.value+'?loginname='+this.lname.value+'?password='+this.pw.value;return false">  
<table border="1" id="flashingborder" cellspacing="7">  
        <tr>
  <td>Nickname:</td>
<td><input type="text" name="name" size="12" maxlenght="35 "value="Nick"></td>  
</tr>
<tr>
<td>Login Name:</td>
                <td><input type="text" name="lname" size="12" maxlenght="35"></td>  
<td>Nur für Registrierte User Nötig</td>

        </tr>

<tr>
<td>Passwort:</td>
                <td><input type="password" name="pw" size="12" maxlenght="35"></td>  

        </tr>
<tr>
<td>IP und PORT:</td>
                <td><input type="text" name="ippo" value="xx.xx.xx.xx:xxxx" size="18" maxlenght="65" onfocus="if(this.value == 'xx.xx.xx.xx:xxxx') this.value='';" onblur="if (this.value=='') this.value='Vorgabetext';></td>  

        </tr>

        <tr>
                <td colspan="2"> <center>  
                <input style="width:60px;height:24px" type="submit" name="submit" value="Einlogen"><button style="width:140px;height:24px" align="center" onclick="ts2s()">Permanent TS2 Login</button></a>  
</td>
        </tr>
</table>
</form>


Ich wollte z.b bei <input name="name" die value"dein name" per batch setzen und sollte sie vorhanden sein auch entfernen.
das wollte ich bei jedem <input> machen natürlich auch mit verschiedenen values.
@bastla hoffe du kannst mir da helfen??
das ist nur der teil der html der bearbeitet werden soll.

danke
Member: bastla
bastla Jun 02, 2008 at 18:59:04 (UTC)
Goto Top
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:
'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)
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
<input name="name"  
gibt, war ich so frei, zur Demo die Alternative
<input type="text" name="name"  
zu verwenden ... face-wink

Vielleicht hätte aber auch schon
Von = """name"""  
Nach = """dein name"""  
genügt - aber es gilt (wie immer beim Suchen) auch hier: je länger der Suchbegriff, desto genauer das Ergebnis.

Grüße
bastla
Member: haufeft
haufeft Jun 03, 2008 at 05:40:45 (UTC)
Goto Top
Hallo Bastla
mit VBS kenne ich mich nicht aus aber es funktioniert^^

name="name" ist ein fester wert.

ich müsste schon value="tralala" ändern.

das problem das value"tralala" das "tralala" sich ändert und wenn ich den script starte wissen müsste was da in der value steht sonst kann ich es ja nicht ändern.
wollte das die batch frägt:
name:
ip
loginame
passwort
und das dan in die html in das jeweilige value schreibt.
so
<td><input type="text" name="name" size="12" maxlenght="35" value="Nick"></td>  
<td><input type="text" name="name" size="12" maxlenght="35" value="haufe"></td>  

sollte es zu viel arbeit sein lass es..

Vielen Dank
Member: bastla
bastla Jun 03, 2008 at 06:05:47 (UTC)
Goto Top
Hallo haufeft!

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 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:
NIP = InputBox("Bitte geben Sie die IP" & vbCrLF & vbCrLF "hier ein:", _  
               "IP-Eingabe", _  
               "127.0.0.1")  

Grüße
bastla
Member: haufeft
haufeft Jun 03, 2008 at 14:39:56 (UTC)
Goto Top
HUI ES GEHT DIKES DANKE AN bastlaface-big-smile

nur noch ein problem face-sad
nachdem die vbs gestartet worden ist ändert sich ja die value somit auch die such array.

gibt es eine möglichkeit das die eingaben auch in die vbs geschrieben werden so das ich sie mehrmals verwenden kann ohne die datei direkt zu bearbeiten.

hoffe das ist verständlich was ich möchte?

also wenn ich in die inputbox meine eingabe mache z.b name = haufe ändert sich die value in der html ja auf value="haufe" also muss sich auch Von = Array("value=""Name""", _ in
Von = Array("value=""Haufe""", _ ändern.

ist das machbar?

mfg
haufe
Member: bastla
bastla Jun 03, 2008 at 14:57:41 (UTC)
Goto Top
Hallo haufeft!

Ohne den Hintergrund der ganzen Aktion zu kennen, frage ich mich (bzw jetzt Dich face-wink), 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:
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
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
Member: haufeft
haufeft Jun 03, 2008 at 16:32:37 (UTC)
Goto Top
hallo bastla

brauche nur eine datei die ausgangsdatei flyout2 die im gleichen ordner wie die vbs ist.

die variablen in der datei muss ich immer wieder füllen das ist ein versuch eines progamm logins das ich dann weiter gebe

also wie gesagt muss immer nur die value ändern.

also jetzt die vbs so das ich imme wieder die gleiche datei mit der vbs bearbeiten kann.
darf ruhig auch ne txt da sein mit den angaben

danke dir

EDIT:

nach dem ich aufgehört habe zu schlafen DANKE bastla für deine super hilfe
Member: haufeft
haufeft Jun 03, 2008 at 18:27:59 (UTC)
Goto Top
noch ein nachtrag:

wie kann ich system variablen wie %username% setzen für pfadangaben???
Member: bastla
bastla Jun 03, 2008 at 19:14:58 (UTC)
Goto Top
Hallo haufeft!

Es gibt verschiedene Möglichkeiten dafür - allgemein kannst Du Systemvariablen so auslesen:
set WshShell = WScript.CreateObject("WScript.Shell")  
UserName = WshShell.ExpandEnvironmentStrings("%Username%")  
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
Member: haufeft
haufeft Jun 04, 2008 at 06:59:06 (UTC)
Goto Top
hallo bastla

also ich bin zu doof für das!!!

ich habe das jetzt zum testen mal so gemacht:

set WshShell = WScript.CreateObject("WScript.Shell")  

UserName = WshShell.ExpandEnvironmentStrings("%UserName%")  
Wscript.Echo  "UserName"  

aber kommt nur UserName
Member: bastla
bastla Jun 04, 2008 at 08:13:59 (UTC)
Goto Top
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
WScript.Echo UserName
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:
set WshShell = WScript.CreateObject("WScript.Shell")  

UserName = WshShell.ExpandEnvironmentStrings("%UserName%")  
UserDatei = "D:\Dein Pfad" & "\" & UserName & ".txt"  
WScript.Echo UserDatei
Grüße
bastla