Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Textteil mittel Batch ersetzen

Frage Entwicklung Batch & Shell

Mitglied: HW-Schrauber

HW-Schrauber (Level 1) - Jetzt verbinden

31.01.2011, aktualisiert 14:51 Uhr, 4207 Aufrufe, 15 Kommentare

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
Mitglied: bastla
31.01.2011 um 16:23 Uhr
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:
01.
@echo off & setlocal 
02.
set "Datei=D:\settings.xml" 
03.
 
04.
set  "Von1=<TAG3>ghi</TAG3>" 
05.
set "Nach1=<TAG3>lmn</TAG3>" 
06.
set  "Von2=<Datei>Z:\www\xxx.yyy</Datei>" 
07.
set "Nach2=<Datei>Z:\aaa\bbb.ccc</Datei> 
08.
 
09.
set "R=%temp%\Replacer.vbs" 
10.
> %R% echo Set fso=CreateObject("Scripting.FileSystemObject"):T = fso.OpenTextFile("%Datei%").ReadAll 
11.
>>%R% echo fso.CreateTextFile("%Datei%").Write Replace(Replace(T,"%Von1%","%Nach1%"),"%Von2%","%Nach2%") 
12.
cscript //nologo %R%
Die Zeile für das Starten des Bearbeitungsprogrammes muss ich (mangels Informationen darüber) Dir überlassen.

Grüße
bastla
Bitte warten ..
Mitglied: HW-Schrauber
31.01.2011 um 17:45 Uhr
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
Bitte warten ..
Mitglied: Biber
31.01.2011 um 17:50 Uhr
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
Bitte warten ..
Mitglied: 60730
31.01.2011 um 18:09 Uhr
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ß
Bitte warten ..
Mitglied: bastla
31.01.2011 um 18:35 Uhr
Hallo HW-Schrauber!
Dann habe ich mich vermutlich unklar ausgedrückt.
Ja; daher neuer Versuch (ist immer noch ein Batch ):
01.
@echo off & setlocal 
02.
set "Datei=%~dp0settings.xml" 
03.
 
04.
set  "Von1=<TAG3>.*</TAG3>" 
05.
set "Nach1=<TAG3>lmn</TAG3>" 
06.
set  "Von2=<Datei>.*</Datei>" 
07.
set "Nach2=<Datei>Z:\aaa\bbb.ccc</Datei>" 
08.
 
09.
set "R=%temp%\Replacer.vbs" 
10.
> %R% echo Set fso=CreateObject("Scripting.FileSystemObject"):T=fso.OpenTextFile("%Datei%").ReadAll:Set rE=New RegExp:rE.Global=True 
11.
>>%R% echo rE.Pattern="%Von1%":T=rE.Replace(T,"%Nach1%"):rE.Pattern="%Von2%":fso.CreateTextFile("%Datei%").Write rE.Replace(T,"%Nach2%") 
12.
cscript //nologo %R% 
13.
 
14.
%~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
Bitte warten ..
Mitglied: HW-Schrauber
31.01.2011 um 18:36 Uhr
>>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
Bitte warten ..
Mitglied: Biber
31.01.2011 um 18:41 Uhr
[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]
Bitte warten ..
Mitglied: bastla
31.01.2011 um 18:47 Uhr
[OT] @Biber
Wie's aussieht geht ja Dein Montag auch schön langsam zu Ende ...

Wo ist eigentlich die Option mit der FDP geblieben?

Grüße
bastla
[/OT]
Bitte warten ..
Mitglied: HW-Schrauber
31.01.2011 um 18:53 Uhr
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.
Bitte warten ..
Mitglied: Skyemugen
31.01.2011 um 19:02 Uhr
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é
Bitte warten ..
Mitglied: bastla
31.01.2011 um 19:03 Uhr
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 - auch, weil ich noch nicht so recht wusste, was noch drangeschraubt werden sollte ...
[/Edit]
Bitte warten ..
Mitglied: Biber
31.01.2011 um 19:05 Uhr
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
Bitte warten ..
Mitglied: HW-Schrauber
31.01.2011 um 19:13 Uhr
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
Bitte warten ..
Mitglied: bastla
31.01.2011 um 19:23 Uhr
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
Bitte warten ..
Mitglied: HW-Schrauber
31.01.2011 um 20:07 Uhr
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
Bitte warten ..
Neuester Wissensbeitrag
Humor (lol)

Linkliste für Adventskalender

(3)

Information von nikoatit zum Thema Humor (lol) ...

Ähnliche Inhalte
Batch & Shell
gelöst Suchen und Ersetzen mehrerer Suchbegriffe per Batch (4)

Frage von makroll10 zum Thema Batch & Shell ...

Windows Netzwerk
Windows Server 2003 SBS Netzwerk durch neuen Server Ersetzen (9)

Frage von MultiStorm zum Thema Windows Netzwerk ...

Batch & Shell
Dateinamen nach Zeichnen abschneiden - Batch-Shell (9)

Frage von cberndt zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
Windows Server
DHCP Server switchen (22)

Frage von M.Marz zum Thema Windows Server ...

Hardware
gelöst Negative Erfahrungen LAN-Karten (19)

Frage von MegaGiga zum Thema Hardware ...

SAN, NAS, DAS
gelöst HP-Proliant Microserver Betriebssystem (14)

Frage von Yannosch zum Thema SAN, NAS, DAS ...

Grafikkarten & Monitore
Win 10 Grafikkarte Crash von Software? (13)

Frage von Marabunta zum Thema Grafikkarten & Monitore ...