hw-schrauber
Goto Top

Textteil mittel Batch ersetzen

Hallo zusammen,

tüfftle seit geraumerzeit an einem kleineren Problem, das ich aber noch nicht gelöstbekommen habe.

Ich habe eine xml Datei mit folgendem Aufbau:

Inhalt der Datei Settings.xml
<TAG1>abc</TAG1><TAG2>def</TAG2><TAG3>ghi</TAG3><TAG4>jkl</TAG4><Datei>Z:\www\xxx.yyy</Datei><TAG5>mno</TAG5>
<TAG4>jkl</TAG4><TAG2>def</TAG2><TAG1>abc</TAG1><TAG3>ghi</TAG3><TAG5>mno</TAG5><Datei>Z:\www\xxx.yyy</Datei>

Jede andere Mischung der Tags wäre auch noch denkbar.

Nun möchte ich, am liebsten mittels Batch (oder ggf auch VBS) die Daten zweier Tags ändern. Hier als Beispiel den Wert von <TAG3> und von <Datei> den neuen Wert, also ghi bzw. die Dateiangabe, möchte ich am Anfang das Batches angeben und am Ende des Batches möchte ich dann das verarbeitente Programm aufrufen.

IOch hatte auch schon den ein oder anderen Lösungsansatz, diese sind aber alle daran gescheitert, dass ich bei Verwendung des for /f Delims nur einzelne Zeichen aber keine Zeichenketten verwenden kann. Sprich, Sprich, wenn ich TAG3 eingeb dann teilt er ja sowohl nach T wie nach A wie nach G und nach 3. Das bringt mich also nicht weiter.

Hat jemand eine Idee?

LG, HW-Schrauber

Content-Key: 159809

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

Printed on: April 25, 2024 at 11:04 o'clock

Member: bastla
bastla Jan 31, 2011 at 15:23:06 (UTC)
Goto Top
Hallo HW-Schrauber!

Gerade XML / HTML mag ich per native Batch (wegen der Sonderzeichen "<" und ">") nicht soo gerne bearbeiten und greife lieber zu ein wenig (integriertem) VBS:
@echo off & setlocal
set "Datei=D:\settings.xml"  

set  "Von1=<TAG3>ghi</TAG3>"  
set "Nach1=<TAG3>lmn</TAG3>"  
set  "Von2=<Datei>Z:\www\xxx.yyy</Datei>"  
set "Nach2=<Datei>Z:\aaa\bbb.ccc</Datei>  

set "R=%temp%\Replacer.vbs"  
> %R% echo Set fso=CreateObject("Scripting.FileSystemObject"):T = fso.OpenTextFile("%Datei%").ReadAll  
>>%R% echo fso.CreateTextFile("%Datei%").Write Replace(Replace(T,"%Von1%","%Nach1%"),"%Von2%","%Nach2%")  
cscript //nologo %R%
Die Zeile für das Starten des Bearbeitungsprogrammes muss ich (mangels Informationen darüber) Dir überlassen.

Grüße
bastla
Member: HW-Schrauber
HW-Schrauber Jan 31, 2011 at 16:45:38 (UTC)
Goto Top
Hallo bastla,

danke für deine schnelle Antwort. Habe das auch schon mal versucht umzusetzen. Habe dein Script (angepasst) auch schon mal so übernommen. Da ich mich mit VBS noch nicht so auskenne, habe ich dann den code in eine VBS-Datei gespeichert. Wenn ich dann die Datei mit Doppelklick starte, kommt eine Fehlermeldung mit Zeile1, Zeichen1 ungültiges Zeichen für VBScipt.

Dann habe ich mich vermutlich unklar ausgedrückt. Das was zu beginn zwischen den Tags steht, kenne ich nicht. Ich möchte also diesen mir unbekannetn Eintrag gegen einen von mir definierten Eintrag tauschen.

Und was den Programmaufruf anbetrifft wäre das im Batch einfach der Call %~dp0xxx.exe

Schön wäre noch, wenn die Verzeichnisangabe für die Datein wie im Batch mit %~dp0 wäre.

Dürfte ich dich noch mal um einen weiteren Anlauf bitten?

LG, HW-Schrauber
Member: Biber
Biber Jan 31, 2011 at 16:50:14 (UTC)
Goto Top
Moin HW-Schrauber,

ist ein Missverständnis - bastla erzeugt ein temporäres VBScript... aber aus einer ganz harmlosen Batchdatei.

Speichere den Vielzeiler mit allen seinen Kommentaren unter der Endung ".cmd" oder "bat". statt mit der Endung .vbs.

Grüße
Biber
Mitglied: 60730
60730 Jan 31, 2011 at 17:09:24 (UTC)
Goto Top
Servus,

Dann habe ich mich vermutlich unklar ausgedrückt.
Das was zu beginn zwischen den Tags steht, kenne ich nicht.
Ich möchte also diesen mir unbekannetn Eintrag gegen einen von mir definierten Eintrag tauschen.

Da es sich um eine Batch handelt, die ein VBS erzeugt, wäre es doch sinnvoll und simpel, wenn du dir alle Zeilen (speziell zeile 4) genauer anschaust und evt. mit Hilfe einer Dosbox und dem Befehl set mit parameter /? mal nachschaust, was die eigentlich macht.

Es soll den Parameter /P geben mit dem könnte man einen allerdings müste der bekannt sein variablen Wert benennen der ausgetauscht werden soll.

btw:
Sprich, Sprich, wenn ich TAG3 eingeb dann teilt er ja sowohl nach T wie nach A wie nach G und nach 3. Das bringt mich also nicht weiter.
Und warum hast du dann nicht "<>" als delims definiert?

PS:
Dürfte ich dich noch mal um einen weiteren Anlauf bitten?
Mea culpa, aber nach der Bastlaschen und deiner Steilvorlage - genau dieses Thema hat der Bastla schon das eine oder andere mal gezimmert, das hätte man wirklich mit dem Produkt Forensuche finden können - hoffe ich dir keinen Einlauf sondern einen Ansatz, alleine weiterzukommen gegeben.

Gruß
Member: bastla
bastla Jan 31, 2011 at 17:35:50 (UTC)
Goto Top
Hallo HW-Schrauber!
Dann habe ich mich vermutlich unklar ausgedrückt.
Ja; daher neuer Versuch (ist immer noch ein Batch face-wink):
@echo off & setlocal
set "Datei=%~dp0settings.xml"  

set  "Von1=<TAG3>.*</TAG3>"  
set "Nach1=<TAG3>lmn</TAG3>"  
set  "Von2=<Datei>.*</Datei>"  
set "Nach2=<Datei>Z:\aaa\bbb.ccc</Datei>"  

set "R=%temp%\Replacer.vbs"  
> %R% echo Set fso=CreateObject("Scripting.FileSystemObject"):T=fso.OpenTextFile("%Datei%").ReadAll:Set rE=New RegExp:rE.Global=True  
>>%R% echo rE.Pattern="%Von1%":T=rE.Replace(T,"%Nach1%"):rE.Pattern="%Von2%":fso.CreateTextFile("%Datei%").Write rE.Replace(T,"%Nach2%")  
cscript //nologo %R%

%~dp0xxx.exe
Das vom Batch erzeugte VBScript führt zwei Ersetzungen mittels RegEx durch (deswegen auch die Schreibweise der jeweiligen "Von"-Angaben mit ".*" für "beliebige Werte"). Die Daten dafür werden "maßgeschneidert" in den Programmcode eingebaut. Zu beachten: Die "settings.xml" wird (ohne Sicherungskopie) durch die neue Fassung ersetzt.

BTW: Wozu soll eigentlich "call" beim Aufruf der "xxx.exe" gut sein?

Grüße
bastla
Member: HW-Schrauber
HW-Schrauber Jan 31, 2011 at 17:36:14 (UTC)
Goto Top
Danke Biber,

das hab ich verstanden und dann natürlich auch gleich umgesetzt. Dann komme ich aber wieder zu einem mir bereits bekannten Problem in der Zeile:

Set "vo1=<TAG3>...........

Hier kommt die Fehlermeldung: "<" kann syntaktisch an dieser Stelle nicht verarbeitet werden.


Hallo Timo,

<> als Delims weiß ich ja noch nicht wo denn der gewünschte Eintarg steht. Und wenn es so einfach ist, dann mach doch mal einen Vorschlag. Entweder zum Code, oder vielleicht zu einem Thema. Denn die Suche habe ich schon beschäftig aber mit den Antworten mein Problem nicht lösen können.

Die Textdatei hat nur eine Zeile aber bald an die hundert TAG Paare.

Und was den Ansatz mit set /P anbetrifft; genau da liegt ja das Problem. Ich habe z.B. <TAG2>def</TAG2>. Ich weiß, dass es Tag2 ist, aber ich weiß nicht was und wie lang der Eintrag (hier "def") ist. Er ist mir auch egal, da ich den Eintrag durch meine Vorgabe ersetzen will. Also, vorher <TAG2>???</TAG2> hinterher <TAG2>Beispiel</TAG2> oder <TAG2>irgendetwasanderes</TAG2>

LG, HW-Schrauber
Member: Biber
Biber Jan 31, 2011 at 17:41:53 (UTC)
Goto Top
[OT] @bastla
Zitat von @bastla:
BTW: Wozu soll eigentlich "call" beim Aufruf der "xxx.exe" gut sein?
[_] Ausbau der Vollbeschäftigung? Ankurbelung der 16-Kernel-Prozessoren-Entwicklung?
[_] Fehlende Kommentierung bleibt dadurch unbemerkt (Empfehlung von Houdini)
[_] Verwandte vom Land beeindrucken?
[_] ist eine alte Masche von Trickdieben - während die CMD.exe abgelenkt ist krabbelt ein Virus durch den Lüftungsschlitz.


Grüße auch an alle Günther J. Jauche dieser Welt.

Biber
[Edit] Re:@bastla
Wo ist eigentlich die Option mit der FDP geblieben?
Da oben stehen doch nur Antworten..... etwas, was für mich vorstellbar ist ....
Als FDP-Imitator oder gar Vordenker wäre ich ungeeignet ...*gg
[Edit]
[/OT]
Member: bastla
bastla Jan 31, 2011 at 17:47:01 (UTC)
Goto Top
[OT] @Biber
Wie's aussieht geht ja Dein Montag auch schön langsam zu Ende ... face-wink

Wo ist eigentlich die Option mit der FDP geblieben? face-wink

Grüße
bastla
[/OT]
Member: HW-Schrauber
HW-Schrauber Jan 31, 2011 at 17:53:22 (UTC)
Goto Top
Sorry, dass mit dem Call sollte es etwas deutlicher machen.

Trotzdem hängt das ganze hier. Ich habe deinen Code genau 1:1 in eine Test.cmd eingefügt und ich erhalte folgende Meldung:

C:\Users\FRANZ-~1\AppData\Local\Temp\Replacer.vbs(1, 52) Laufzeitfehler in Micro
soft VBScript: Die Datei wurde nicht gefunden.
Member: Skyemugen
Skyemugen Jan 31, 2011 at 18:02:49 (UTC)
Goto Top
Aloha,

[OT]das Ganze war auch nur dazu da, deinen Namen herauszubekommen *lach*[/OT]

aber b²t:

Halbes batch, halbes vbs bääh, mach ich zwar auch gerne aber irgendwie wäre hier ein reines .vbs doch schöner anzusehen oder nicht, bastla? ;)

greetz André
Member: bastla
bastla Jan 31, 2011 at 18:03:12 (UTC)
Goto Top
Hallo HW-Schrauber!

Und Du bist Dir ganz sicher, dass es im Ordner mit der Batch-Datei eine "settings.xml" gibt? Die wird nämlich an der in der Fehlermeldung genannten Position vom VBScript zu öffnen versucht.

Zu Testzwecken könntest Du ja in Zeile 2 nochmals einen absoluten Pfad schreiben ....

Grüße
bastla

[Edit] @Skyemugen
aber irgendwie wäre hier ein reines .vbs doch schöner anzusehen oder nicht, bastla? ;)
Letzteres face-wink - auch, weil ich noch nicht so recht wusste, was noch drangeschraubt werden sollte ...
[/Edit]
Member: Biber
Biber Jan 31, 2011 at 18:05:26 (UTC)
Goto Top
Hmmm, HW-Schrauber,

ich frag mal ohne Kästchen (und alle Joker sind schon weg - Höchstens die D. Katzenbregen unter 11800 wäre erreichbar)...

Welche settings.xml hat den im Lauf der Schnipsel ihren Aufenthaltsort
von SET "Datei=D:\settings.xml"
nach set "Datei=%~dp0settings.xml" verlagert und könnte unauffindbar sein?

Grüße
Biber
Member: HW-Schrauber
HW-Schrauber Jan 31, 2011 at 18:13:12 (UTC)
Goto Top
Hallo bastla,

da hatte ich vergessen noch ein Unterverzeichnis einzufügen. Batch läuft fehlerfrei durch. Es ist auch eine Replace.vbs im temp Verzeiochnis. Aber geändert an der Datei hat sich nix. Auch wenn ich die VBS mit Doppelklick aufrufe, ändert sich nix. "settings.xml" ist nachher wie vorher.

LG, HW-Schrauber
Member: bastla
bastla Jan 31, 2011 at 18:23:13 (UTC)
Goto Top
Hallo HW-Schrauber!

Tja, bei mir sähe das (mit Deinen Testdaten von oben) so aus:
Z:\TEMP>type settings.xml
<TAG1>abc</TAG1><TAG2>def</TAG2><TAG3>ghi</TAG3><TAG4>jkl</TAG4><Datei>Z:\www\xx
x.yyy</Datei><TAG5>mno</TAG5>
Z:\TEMP>replacer

Z:\TEMP>type settings.xml
<TAG1>abc</TAG1><TAG2>def</TAG2><TAG3>lmn</TAG3><TAG4>jkl</TAG4><Datei>Z:\aaa\bb
b.ccc</Datei><TAG5>mno</TAG5>
- allerdings nur, wenn die Schreibweise (inkl Groß-/Kleinschreibung) des Suchbegriffes (also etwa "<TAG3>") in Datei und Batch übereinstimmt ...

Wenn Du am Ende der Zeile 10 noch
:rE.IgnoreCase=True
hinzufügst, wird ein Unterschied in der Groß-/Kleinschreibung nicht berücksichtigt.

Grüße
bastla
Member: HW-Schrauber
HW-Schrauber Jan 31, 2011 at 19:07:31 (UTC)
Goto Top
Hallo bastla,

danke für deine Hilfe. Nun hat alles bestens geklappt. Hatte bei der ganzen Kopierei in der Batch irgendwann wieder falsche tags. Nun läufts aber wie gewünscht. Ich habe auch bereits noch eine Erweiterung auf eine dritte Ersetzung durchgeführt. Auch das klappt.

Also, DANK noch mal.

LG, HW-Schrauber