wisch
Goto Top

Mehrere Textstellen innerhalb einer TXT-Datei per Batch austauschen

Hallo.

Ich habe das Forum hier schon durchsucht, dabei einige möglichen Lösungen gefunden, bring es aber irgendwie nicht ans Laufen... ;-(

Mit nachfolgendem Script versuche ich in einer vorhandenen Datei den Begriff "WEBAPPS" durch einen Neuen zu ersetzen, den ich zuvor in die Variable %projekt% gepackt habe.
Die zweite verwendete Variable %pfad% ist ebenfalls korrekt gefüllt, denn zuvor laufende Dateikopieraktionen laufen einwandfrei.

set "Datei=%pfad%\conf\%projekt%.config.xml"   
set "Von=WEBAPPS"  
set "Nach=%projekt%"  
set "t=%pfad%\conf\text.tmp"   
if exist "%t%" del "%t%"   
for /f "usebackq delims=" %%i in ("%Datei%") do set "line=%%i" & set Line=!Line:%Von%=%Nach%! & echo %Line%>>"%t%"   

Der Fehler der kommt lautet:
">" ist syntaktisch an dieser Stelle nicht verarbeitbar.  

Was mache ich falsch?

Letztlich möchte ich dann mehrere Begriffe in dieser einen Datei austauschen... muß ich dafür obigen (wenn lauffähig) Code mehrfach ausführen, oder gibt es eine elegantere Lösung?

Danke für Eure Hilfe...


[edit]
Ich habe es zwischenzeitlich mit diesem Script hier aus dem Forum gelöst, aber
a) Wie bekomme ich dort noch ein drittes und viertes Replace mit rein?
b) würde ich das gerne lieber ohne VBS lösen...
[/edit]

Content-ID: 153998

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

Ausgedruckt am: 25.11.2024 um 15:11 Uhr

bastla
bastla 28.10.2010 um 17:15:24 Uhr
Goto Top
Hallo WiSch!

Zu a)
So, wie die beiden bisherigen auch schon ...

Zu b)
Gerade XML oder HTML enthalten mit (zumindest) "<" und ">" Sonderzeichen, die in Batch eine besondere Bedeutung haben und daher die Verarbeitung erschweren - insofern ist VBS mE jedenfalls die bessere Wahl. Wenn Du VBS (warum eigentlich?) vermeiden willst, könntest Du er mit dem folgenden abgewandelten Batch versuchen:
setlocal
set "Datei=%pfad%\conf\%projekt%.config.xml"  
set "Von=WEBAPPS"  
set "Nach=%projekt%"  
set "t=%pfad%\conf\text.tmp"  
if exist "%t%" del "%t%"  
for /f "usebackq delims=" %%i in ("%Datei%") do set "Line=%%i" & call :ProcessLine  
goto :eof

:ProcessLine
call set "Line=%%Line:%Von%=%Nach%%%"  
setlocal enabledelayedexpansion
echo %Line%>>"%t%"  
endlocal
goto :eof
Vor dem ersten "goto :eof" kann natürlich auch eine Fortsetzung des Batches stehen.

Das im nicht geposteten vorhergehenden Teil des Batches enthaltene "enabledelayedexpansion" sollte, wenn es nicht in diesem angesprochenen Teil benötigt wurde, entfernt werden ...

Grüße
bastla
WiSch
WiSch 28.10.2010 um 17:41:19 Uhr
Goto Top
Hallo Bastla,

auch mit der von Dir geposteten Lösung bekomme ich (anscheinend zu Zeile 13?) die gleiche Fehlermeldung!?

Ich glaube aber zwischenzeitlich auch, dass es nicht an einem ">" im Code sondern an einem aus dem XML-Inhalt liegt... also doch VBS?

Hab versucht, ein drittes Replace in die VBS zu bekommen, es aber mit dem Syntax wieder nicht hinbekommen?

Insgesamt habe ich 5 Begriffe auszutauschen, kannst Du mir mit dem Syntax helfen?


DANKE,
WiSch
bastla
bastla 28.10.2010 um 18:05:50 Uhr
Goto Top
Hallo WiSch!

Du beziehst Dich vermutlich auf den ersten Batch/VBS-Ansatz - der ließe sich auch etwas übersichtlicher gestalten (das Original hatte vermutlich ohnehin ich selbst mal verbrochen face-wink):
@echo off & setlocal
set "Datei=GroupInfo_2.txt"  

set R=%temp%\Replace5.vbs
>%R%  echo F = WScript.Arguments(0)
>>%R% echo Set fso = CreateObject("Scripting.FileSystemObject")  
>>%R% echo T = fso.OpenTextFile(F).ReadAll
>>%R% echo T = Replace(T, "Von1", "Nach1")  
>>%R% echo T = Replace(T, "Von2", "Nach2")  
>>%R% echo T = Replace(T, "Von3", "Nach3")  
>>%R% echo T = Replace(T, "Von4", "Nach4")  
>>%R% echo T = Replace(T, "Von5", "Nach5")  
>>%R% echo fso.CreateTextFile(F).Write T 

for %%f in ("%Datei%") do cscript //nologo %R% "%%f"  
Anstelle von "Nach1" etc (die Anführungszeichen werden benötigt) kann natürlich auch eine Batchvariable verwendet werden, also etwa:
>>%R% echo T = Replace(T, "WEBAPPS", "%projekt%")
Noch zu beachten: Es wird Groß-/Kleinschreibung unterschieden ...

Grüße
bastla
WiSch
WiSch 29.10.2010 um 08:51:50 Uhr
Goto Top
Hallo Bastla...

ich denke auch, daß der erste Code von Dir war...

So funktioniert es bestens, und bezügl. der Groß-/Kleinschreibung... das hilft mir sogar, denn in den Vorgabedateien wurden die auszutauschenden Platzhalter extra zur besseren Identifizierung komplett groß geschrieben!

Also Fall gelöst... vielen Dank für die schnelle Hilfe.


Grüße,
WiSch


[Edit]
Nun hab ich doch noch ein Problem... an einer Stelle ist es notwendig, nicht nur ein feststehenden Begriff wie z.B. WEBAPPS auszutauschen, sondern über zwei Zeilen zu gehen...
Im Auszutauschenden Text ist also eine Zeilenschaltung... geht das auch?
Beispiel aus
text</Property>
</Property>
soll
text</Property>
</Property>
-->
werden...
Hintergrund: Ich muß da einen kompletten Ast aus dem XML ausblenden und kann die exakte Stelle nicht anders identifizieren, da das </Property> öfters vorkommt.
Allerdings steht das immer in der selben Zeile der Datei, vielleicht kann man da was - in der Kombination mit obiger Lösung - mit machen?
[/Edit]
bastla
bastla 29.10.2010 um 10:11:01 Uhr
Goto Top
Hallo WiSch!

Die Zeile dafür müsste etwa so aussehen:
>>%R% echo T = Replace(T, "text</Property>"^&vbCrLf^&"</Property>", "text</Property>"^&vbCrLf^&"</Property>")
Soferne Du keine "Windows"-Zeilenschaltungen in der Datei hättest, wäre "vbCrLf" durch "vbCr" oder "vbLf" zu ersetzen ...

Grüße
bastla
WiSch
WiSch 29.10.2010 um 14:22:30 Uhr
Goto Top
Hallo Bastla.

Perfekt... läuft wie es soll, danke! Es war übrigends ein vbLf ...

Ähm, kennst Du das mit dem gereichten kleinen Finger? ... face-wink

Jetzt kommt mir doch noch ein Sonderzeichen in den Weg, sodas folgende Zeile nicht funktioniert:
>>%R% echo T = Replace(T, "<Property Name="JobSpooler", "<!-- <Property Name="JobSpooler")  
Ich hab auch schon versucht das Anführungszeichen vor JobSpooler mit einem ^ zu maskieren, hilft nicht.
Dann habe ich hier im Forum auch noch den Hinweis gesehen, daß ggf. auch das maskiert nochmal werden muß, aber auch ein und^ davor hilft nicht...
Zuletzt habe ich nochmal forsch ein
>>%R% echo T = Replace(T, "<Property Name="^&Chr$(34)^&"JobSpooler", "<!-- <Property Name="^&Chr$(34)^&"JobSpooler")  
versucht, was aber leider auch nicht funktioniert...

Weißt Du hier nochmal Rat?
bastla
bastla 29.10.2010 um 16:06:22 Uhr
Goto Top
Hallo WiSch!

Eigentlich sollte Deine letzte Zeile funktionieren (wobei VBS kein "$" für die Funktion "Chr()" benötigt), aber Du könntest es auch so versuchen:
>>%R% echo T = Replace(T, "<Property Name=""JobSpooler", "<!-- <Property Name=""JobSpooler")
Grüße
bastla

P.S.: Mittlerweile würde sich aber schon ein "direktes" (also nicht von einem Batch erzeugtes) Script aufdrängen ...
WiSch
WiSch 29.10.2010 um 16:20:21 Uhr
Goto Top
Hallo Bastla...

...es läuft nun auch in diesem Punkt! Nochmals Danke.

Zur Rückinfo:

Mein Versuch mit chr() läuft auch... wenn ich das "$" weglasse.
Deine Variante mit doppeltem Anführungszeichen läuft ebenfalls...

Mann, jetzt muß ich mich auch noch entscheiden! face-wink

Sollte ich jetzt nochwas finden, dann starte ich einen neuen Thread.

Danke und Grüße,
WiSch