VBS Nach Wort suchen und Zeile auslesen?
Hallo Leute,
ich hätte ein kleines Vorhaben.
Ich möchte eine VBS-Datei schreiben.
Es soll so ablaufen:
- Man gibt ein Wort ein, nach dem in einer Word-Datei (wenn's nicht geht, dann .txt) gesucht wird.
- Es wird die gesamte Zeile, in der das Wort steht, ausgegeben.
- Es wird die darauf folgende Zeile ausgegeben.
Ist eigentlich mega simpel, aber ich krieg es nicht auf die Reihe.
Für Lösungsansätz, Denkanstöße und Lösungen wäre ich dankbar. =)
MfG,
Arthur
3 Antworten
Das ist relativ einfach:
Als erstes brauchst Du ein TextStreamObjekt oder WordDocumentObject – je nach Datei-Typ.
Das TextStreamObjekt ist aber einfacher zu händeln.
In das TextStreamObjekt lädtst Du dann die Datei und läufst den Inhalt Zeile für Zeile durch und prüfst dabei, ob das gesuchte Wort in dem String enthalten ist und gibst das dann aus.
Hier mal ein Muster-Code (Declares nicht vergessen!):
Set fso = CreateObject("Scripting.FileSystemObject")
fn = "C:\Mein\Pfad\zu\MeinText.txt"
strSearch = "Bubblegum"
Set f = fso.GetFile(fn)
Set ts = f.OpenAsTestStream(ForReading)
Do While Not ts.AtEndOfStream
line = ts.ReadLine
If Instr(1, line, strSearch) Then
WScript.Echo line
End If
Loop
Das war es schon.
Für Word musst Du aber ein Word-Dokument-Objekt laden und hier wird es haarig, denn dazu musst Du auch die entsprechenden Eigenschaften de WordDocumentObject kennen, um den Text zeilenweise durchlaufen zu können. Ich bin mir hier nicht sicher, aber ich denke, dass die ReadLine-Methode hier anders lauten dürfte.
Hier ist aber mal die Hilfe zum TextStream-Objekt:
https://msdn.microsoft.com/en-us/library/312a5kbt(v=vs.84).aspx
Bei Word musst Du mal recherchieren.
Es hat mich gerade selbst mal gereizt:
fn = "C:\Mein\Pfad\zu\MeinDocument.docx"
strSearch = "Bubblegum"
Set wdApp = CreateObject("Word.Application")
Set wdDoc = wdApp.Open(fn)
Das war's dann auch schon und weiter bin ich auf die Schnelle jetzt aber nicht gekommen.
Ich muss zugeben, dass Word-Dokumente wirklich nicht leicht zu analysieren sind, da es hier völlig andersartige und abstrakte Objekt-Konstruktionen gibt. Daher gibt es auch keine einfachen Zeilen, wie in einem normalen Text, sondern Bereiche, Absätze, Wörter und vieles mehr als Collections.
Daher ist es auch nicht möglich, eine einzelne Zeile auszugeben, da es so etwas dort gar nicht gibt ohne den Kontext einer Seite, an deren Rand dann eine Zeile dynamisch umgebrochen wird, aber eben nicht im Roh-Text. So gesehen entspricht eine Zeile eher einem Absatz. Daher müsstest Du dann ganze Absätze ausgeben:
wdDoc.Select
Set wdParagraphs = wdDoc.Selection(1).Range.Paragraphs
For Each line in wdParagraphs
If Instr(1, line.Text, strSearch) Then
WScript.Echo line
End If
Next
Das ist jetzt mal total ins Blaue geschossen und ohne ObjectModelBrowser würde ich hier keinen Cent auf Richtigkeit setzen – eher umgekehrt. Aber so in etwa müsste das aussehen.
Wenn Du Dich aber selbst mal hier einarbeiten willst, gibt es hier die Online-Hilfe:
https://msdn.microsoft.com/en-us/library/office/ff841928(v=office.14).aspx
Aber das ist wirklich nichts für Anfänger.
OH, Sorry! Schreibfehler!!!
Das muss heißen:
Set ts = f.OpenAsTextStream(ForReading)
Text und nicht Test
Teile doch erstmal deine Versuche. Lösungsansätze braucht es für dein Problem an sich nicht mehr. Du musst halt recherchieren, wie man Text von der Konsole ausliest, wie man ihn ausgibt und wie man Text aus einer Datei liest.
Für die Recherche eignet es sich, die zugehörige Dokumentation zu nutzen:
https://msdn.microsoft.com/fr-fr/library/d1wf56tt(v=vs.84).aspx
Zum Suchen kannst du linear jedes Zeichen abklappern oder einen regulären Ausdruck verwenden.
Nimm lieber einen andere, vernünftigere Programmiersprache z.B. C# oder Java
Da hast du auch in Zukunft noch was von
VBScript ist keine Programmiersprache!
Und abgesehen davon wünsche ich viel Spaß bei der Programmierung dieser kleinen Aufgabe mit C# oder Java. Der Code dürfte um Einiges größer werden.
VBScript ist hierbei schon absolut korrekt.
Und wieso sollte VBScript keine Programmiersprache sein? Du selbst verwendest in deiner Antwort doch eine Schleife.
Es ist eine Skriptsprache und die erfordert einen Interpreter.
Eine Programmiersprache erfordert keinen Interpreter und muss zudem vorher kompiliert werden, bevor sie überhaupt irgendwas tun kann.
Bei einer Skriptsprache übernimmt der Interpreter das Kompilieren in ausführbaren Code.
Och.. dafür brauche ich keinen Interpreter und kann etwas einfacher arbeiten
Und viel ist das definitiv nicht!
Nein, Du musst den Code jedes mal neu kompilieren und hinzu kommt, dass Du die ganzen System-Objekte vorher einbinden musst und natürlich nicht die Header vergessen, sowie mind. eine Fenster-Instanz, etc. pp.
Man kann es sich natürlich auch einfacher machen und einfach eine Skriptsprache ohne Deklarations-Overhead nehmen. Aber wenn man nichts zu tun hat, kann man sich natürlich auch unnötige Arbeit machen.
Genau dafür sind Skripte eben gedacht.
Aber jetzt hätte ich wirklich gerne mal Deinen "Einfach-Code" gesehen. Nimm bitte mal meinen Mustercode oben und übersetze mir den in C# oder Java. Aber bitte komplett und funktionstüchtig und einheitlich für alle Windows-Versionen ab Win98! Na, gut ich mach es Dir gaaanz einfach: ab Vista reicht.
Der Interpreter ist halt schon vorher eingebunden im System..
Ich muss die Sachen im C# z.B. auch einbinden (was bei einem System-Interpreter schon drin ist)
Außerdem.. Ich welcher Zeit lebst du?
Mit einem Kompiliertem Programm brauche ich eben auf dem Ziel-Rechner KEINEN Interpreter mehr
In welcher Zeit?
Du schießt mit Kanonen auf Spatzen und das ist in jeder Zeit Kappes.
Abgesehen davon ist Dein Code nicht flexibel und benötigt einen Compiler welcher im Interpreter bereits zur Laufzeit integriert ist. Hinzu kommt, dass Du mit C#, Java und Co. einen unnötigen Haufen Arbeit erledigen muss, denn Du musst manuell jedes Mal eine Fenster-Klasse und Interfaces erstellen und alles neu kompilieren. Kleine Änderungen sind so nicht möglich ohne alles immer wieder erneut zu kompilieren.
Ein Skript ist schnell erstellt und schnell abgearbeitet, während Du noch mit dem Fenster-Rahmen Deines Programms beschäftigt bist.
Ja und wo ist jetzt Dein schneller C#-Code? Das, was ich oben geschrieben habe, ist so 1:1 lauffähig. Das bekommst Du mit einer vollwertigen Programmiersprache niemals mit so wenig Codezeilen und on-the-fly änderbar hin. DARIN liegt die Stärke und der Vorteil von Skripten.
Man muss kein Haus bauen, wenn man im Regen auf den Bus wartet. Da reicht ein Regenschirm völlig aus.
Das ist aber nicht das Merkmal, woran sich entscheidet, ob man eine Programmiersprache vor sich hat oder nicht. Der Begriff Skriptsprache beschreibt nur, dass es sich um eine Programmiersprache handelt, die in einer Engine ausgeführt wird - also in welchem Kontext sie läuft. So wie bei JavaScript (diese wird interessanterweise im Chrome-Browser kompiliert). Jede Skriptsprache kann kompiliert werden, wenn man nur einen Compiler für sie baut (wie bei Python). Andersrum kann auch jede Programmiersprache als Skriptsprache eingesetzt werden, wenn man einen geeigneten Rahmen um sie baut (Bsp.: C# in Unity3D).
Eine Sprache kann als Programmiersprache definiert werden, wenn sie selbst Iteration/Rekursion sprachlich ausdrücken kann. Das ist sowohl bei VBScript der Fall, als auch bei anderen typischen Skriptsprachen (JavaScript, PHP, Python, ...).
Markus.. sitzt genervt in der IT-Abteilung als Supporter und weiß nicht was zu tun..
Es geht um den Ansatz, Kompatibilität und freie Modifizierbarkeit.
Ich hab schon genug Zeit mit deinem selbstlosen Ich verschwendet.. Geh, antworte dem nächsten Support Ticket "Das geht nicht"
Ob man ein Problem mit einer Skriptsprache löst oder nicht, hängt von dem Kontext ab. Markus hat schon Recht, mit einer Skriptsprache kann man viel schneller entwickeln, dazu wurden sie konzipiert. Freie Modifizierbarkeit ist gerade eine der positiven Eigenschaften von Skripten.
Deine Häme, die du versuchst, einzubringen, ist im Übrigen nicht förderlich für eine Diskussion.
Aloha,
danke für dieses Musterskript. =)
Habe noch eine Inputbox eingebaut und bis Zeile 5 läuft alles.
Allerdings bekomme ich dann die Meldung: "Fehler: Das Objekt unterstützt diese Eigenschaft oder Methode nicht.: 'f.OpenAsTextStream'
Code: 800A01B6"