149. VBS: mehrer Wörter mit einem Script Suchen und Ersetzen
Einleitung
Im meinem Projekt zur Textverschlüsselung NoNSA verwendete ich mehrfach VB-Skripte, um
jeweils einmalig einzelne Buchstabenkombinationen (Wörter)
auszuwechseln. Ich benutzte dabei den replace-Befehl und die bisherigen
Ansätze mehrere Wörter mit einem Skript zu ersetzen, die im Internet
kursierten, veranlassten mich, dann doch lieber ein Script pro
Auswechslung zu nehmen.
Dabei ist die Lösung für dieses Problem bei genauer Betrachtung relativ
simpel: Ein Textdokument muss nur einmalig geöffnet werden, der
Text in einen ersten String eingelesen werden, dann dieser String mit
einem Replace -Befehl ersetzt werden, wobei der veränderte Text
automatisch in einem neuen String landet.
Bis dahin kann das jeder VBS-Laie und der nächste Schritt ist auch
nicht schwerer und es ist unverständlich, warum der folgende
Lösungsansatz bis zum heutigen Tag nicht bei den Suchmaschinen
publiziert wird:
Einfach den veränderten Text im String wieder mit einem Replace-Befehl
bearbeiten, den veränderten String in einen neuen String schreiben und
diesen String bei zwei gewünschten Änderungen wieder ins
Textdokument schreiben. Das ist unkomplizierter und verständlicher als
irgendwelche and if - Lösungen...
---
Code-Beispiel:
Um Profis nicht zu langweilen ein kleines Codebeispiel mit einem VBS
und einem Textdokument. Überwiegend wurde die offizielle Nomenklatur
benutzt:
Textdokument
probe.txt (wo das
liegt ist egal, im VBS müssen Sie nur den Pfad anpassen):
Alle Christen kommen in den
Himmel
In den Himmel kommen alle
Christen
Dann ein VBS (irgendeinName.vbs):
Set objFSO =
CreateObject("Scripting.FileSystemObject")
Set objFile =
objFSO.OpenTextFile("C:\derPfadzumProbetetxt\probe.txt",
1)
strText = objFile.ReadAll
objFile.Close
wechseleins= Replace(strText, "Christen",
"Atheisten")
wechselzwei= Replace(wechseleins, "Himmel", "Hölle")
wechseldrei= Replace(wechselzwei, "den", "die")
strNewText = wechseldrei
Set objFile =
objFSO.OpenTextFile("C:\derPfadzumProbetetxt\probe.txt", 2)
objFile.WriteLine strNewText
objFile.Close
---
Legende
Blau: Quelltext
Rot: kompletter Pfad zum Textdokument
Grün: Anfangs- und
Endstring
Orange: Zwischenstrings
für drei Wechsel mit Replace-Befehl
---
Erklärung des Quellcodes Zeile für Zeile mit dem Vokabular
eines
intuitiven Programmierers leicht erklärt:
Set objFSO =
CreateObject("Scripting.FileSystemObject")
Eine leere Hülle zur Bearbeitung von VBS wird geöffnet
Set objFile =
objFSO.OpenTextFile("C:\derPfadzumProbetetxt\probe.txt",
1)
Das Textdokument wird geöffnet und der gesamte Inhalt eingelesen - eine
1 steht für lesen, einige Schwachmaten setzen hier eine vorher
definierte Variable für die 1
ein - absolut unsinnig...
strText = objFile.ReadAll
Jetzt wird es spannend: Der fest definierte objFile wird mit der Ergänzung
readAll als strText (der Name von strText ist im Gegenteil zum
fest definierten String
objFile.ReadAll ziemlich egal .) komplett eingelesen:
Zwischenstand im String strText
steht der o. a. Text.
objFile.Close
Das Textdokument wird geschlossen - wir arbeiten jetzt mit dem String
und später muss dann das Textdokument wieder geöffnet werden, um dann
den Endstring in das Dokument zu schreiben (destruktives überschreiben
- der alte ursprüngliche Text wird überschrieben...)
wechseleins= Replace(strText, "Christen",
"Atheisten")
Wir definieren einen neuen String. Man hätte auch am Anfang mit Dim wechseleins dem VB-Script
zuvor sagen können, dass es eine neue Variable Namens wechseleins gibt, aber das
ist zutiefstes Anfängerniveau. Hinter wechseleins steht
unbestritten ein Gleichheitszeichen und was hinter dem
Gleichheitszeichen steht, ist der Inhalt des neuen Strings;
nämlich der Text strText
aus dem Textdokument.
Der Inhalt ist also der ganze Text mit der Veränderung durch den
Replace Befehl, der nach fester Syntax das erste Wort gegen das zweite
Wort in Anführungszeichen austauscht.
An dieser Stelle setzt dann bei vielen VB-Script-Schreibern leider die
Logik aus - denn ich habe doch in wechseleins einen vollständigen
String mit dem gesamten Text - nur die Änderungen vom
Replace-Befehl unterscheiden diesen wechseleins-String vom
strText. Also muss
ich im nächsten Schritt den wechseleins-String
bearbeiten, damit die alten Änderungen nicht verloren gehen:
wechselzwei= Replace(wechseleins, "Himmel", "Hölle")
Ich schaffe also einen weiteren String mit Namen wechselzwei (Name ist
Schnurzpiepegal...), der nach dem Gleichheitszeichen als wechseleins definiert ist und
bei diesem bereits veränderten String wird durch den Replace-Befehl eine weitere
Änderung vorgenommen.
wechseldrei= Replace(wechselzwei, "den", "die")
Beim Wechseldrei
dasselbe Spiel. Nur das nun der wechselzwei-String
mit dem Replace-Befehl
bearbeitet wird
strNewText = wechseldrei
Den String wechseldrei
schreibe ich dann in einen neuen String.
Ich könnte genausogut strNewText
als z.b wechselzwei definieren,
hätte dann aber nur zwei Änderungen im Ergebnisstring, da wechselzwei ja vorher als wechselzwei=
Replace(wechseleins,
"Himmel", "Hölle") definiert wurde...Klar?!
Set objFile =
objFSO.OpenTextFile("C:\derPfadzumProbetetxt\probe.txt", 2)
Als nächstes wird das Textdokument zum Überschreiben geöffnet, daher
die 2 am Ende, die für
destruktives Überschreiben steht - der alte
Inhalt des Dokumentes geht dabei verloren....
objFile.WriteLine strNewText
Eine kleine festgeschriebene Formel für den Objektinhalt, der nun strNewText
beinhaltet, welches unserer Text mit den drei Änderungen ist...
objFile.Close
Nach der Bearbeitung sollte der Objektfile geschlossen werden.
Ansonsten frisst das unnötige Ressourcen...
----
Nachwort zur Stringbearbeitung mit VBS
Meine Webseite ist immer bemüht, Skript-Schreibern Hilfe auf der
Metaebene zu geben, damit Sie sich wiederholende Abläufe zur Lösung
anderer Aufgaben, zu Nutze machen können.
Ich könnte anhand dieser oben geschilderten Bearbeitung diverse
Forenfragen beantworten, weil das zu Grunde liegende Schema bei der
Stringbearbeitung immer dasselbe ist:
"Schreibe den Inhalt eines Dokumentes in einen String. Wende
einen beliebigen Befehl aus dem reichhaltigen Repertoire der
VBS-Befehle auf diesen String an und schreibe das Ergebnis in einen
neuen String. Bearbeite den veränderten String mit einem beliebigen
neuen Befehl und vergesse nicht das Resultat in einen neuen String zu
schreiben.
Wiederhole diesen Vorgang so oft Du willst. Schreibe den letzten String
der Bearbeitungskette in einen neuen String und schreibe diesen
destruktiv in das alte Dokument."
Der Rest ist "nur" eine Frage der Syntax. Aber wer das Grundprinzip
nicht verstanden hat, wird kläglich bei vielen eigenständigen
Lösungsansätzen scheitern...
Ich wünsche den VBS-Schreibern viel Erfolg...