Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Grep for VBScript

146 views
Skip to first unread message
Message has been deleted

Johnny Nielsen

unread,
Aug 2, 2001, 4:16:09 PM8/2/01
to
"Patrick" <pla...@freeshell.org> wrote in message
news:cfe5537f.0108...@posting.google.com...
> I've looked all over this newsgroup and online, but can't find anyone
> that has ported "grep" to a vbscript function yet. I know there is the
> regexp object, but why go through all this:
> Set re= new RegExp
> re.Global=true
> re.IgnoreCase=true
>
> if (re.test(val)) then
>
> when I could just use a grep function:
>
> if (grep (val, <item to grep for>) ) = true) then

You are absolutely right Patrick, and I wouldn't expect anything less than a
working implementation from you now that you brought it up ;-)


Best regards
Johnny Nielsen

Christoph Fricke

unread,
Aug 15, 2001, 5:02:11 AM8/15/01
to
Try this:

' ########################Anfang#############
Option Explicit

On Error Resume Next

Dim LineArray, args, fso, filename, stringtofind, linevar, searchstring,
CaseIgnore, Invert
Dim counter, openfile, line, Matches, Count, nolines, lines

CaseIgnore = FALSE
Invert = 0
Count=1
nolines=0
counter=0
lines=0

' Liest die auf Kommandoebene eigegebenen Parameter ein

Set args=WScript.Arguments
if args.count < 2 Then Call DisplayError(1)

' Wenn die korrekte Anzahl Parameter übergeben wurde, beginne mit der
Ausführung jeglicher welcher

if args.count > 2 Then Call GetOptions(args.count)

filename = args(0)
stringtofind = args(1)

' Erstelle das File System Object unnd öffne die Datei(en) die angegeben
wurde.
' Wenn die Datei nicht existiert, Fehler und wech

set fso = CreateObject("Scripting.FileSystemObject")
Set openfile = fso.OpenTextFile(filename, 1)
if err.number <> 0 then call DisplayError(2)

' Zeilen einlesen bis zum Ende der Datei

Do until openfile.AtEndOfStream = True
line = openfile.readline
counter=counter+1
' Je nachdem welche Schalter übegebn wurden, werden verschiedene Aktionen
getätigt
Select Case count
case 1

If lines=0 then
if ((Finder(line, stringtofind, CaseIgnore)) XOR invert) <> 0
then WScript.Echo(line)'WScript.Echo(line)
Else if ((Finder(line, stringtofind, CaseIgnore)) XOR invert)
<> 0 then WScript.Echo(counter&": "&line)
End If
Case 0
if ((Finder(line, stringtofind, CaseIgnore)) XOR invert) <> 0 then
nolines=nolines+1
End Select

Loop

' Zeige Ergebnisse
If (count=0 AND invert=0) then Wscript.Echo("Anzahl der Zeilen, welche den
String enthalten: " & nolines)
If (count=0 AND invert=1) then Wscript.Echo("Anzahl der Zeilen, welche den
String nicht enthalten: " & nolines)

Function Finder(linevar, searchstring, ignore)

' Suche kann "case sensitive" sein oder aber auch nicht
Dim grep

Set grep = New RegExp
grep.pattern = searchstring
grep.IgnoreCase=Ignore
Set Matches = grep.Execute(linevar)
If Matches.Count=0 Then
Finder=0
Exit Function
Else
Finder=1
End If

End Function

Sub DisplayError(ByVal errornumber)
' Zeigt Fehlermeldungen, je nachdem welche Werte der Funktion übergeben
wurden

Dim UsageMessage
Select Case errornumber
Case 1
UsageMessage = "Usage: cscript grepper.vbs <filename> <String to
Find> [ignore] [invert] [count] [lines]" & vbcrlf
UsageMessage = UsageMessage & "Ignore: Ignoriert Gross- und
Kleinschreibung" & VBCRLF
UsageMessage = UsageMessage & "Invert: Listet die Zeilen, die den
Suchstring nicht enthalten" & VBCRLF
UsageMessage = UsageMessage & "Count: Zeigt die Zeilen an, die den
String enthalten" & VBCRLF
UsageMessage = UsageMessage & "Lines: Zeigt die Zeilennummer des
Treffers" & VBCRLF & VBCRLF
UsageMessage = UsageMessage & "Windows 2000 können dieses Skript
auf der Kommandozeile ausführen"
Wscript.Echo UsageMessage
WScript.Quit
Case 2
WScript.Echo "Ungültiger Dateiname - Immer den ganzen Pfad
angeben"
WScript.Quit
Case Else
Wscript.Echo "Unerwarteter Fehler - Abbruch (Sollte eigentlich
nicht passieren)"
WScript.Quit
End Select

End Sub

Sub GetOptions(TotalArgs)
' Holt die Kommandozeilen Argumente und setzt die globalen Variablen

Dim CountArgs, ArgValue
CountArgs = 2
Do While CountArgs < TotalArgs
ArgValue = LCase(args(CountArgs))
Select Case ArgValue
Case "ignore" CaseIgnore = TRUE
Case "invert" Invert = 1
Case "count" Count=0
Case "lines" lines=1
Case Else CaseIgnore = TRUE
Invert = 0
End Select
CountArgs = CountArgs + 1
Loop

End Sub
' #####################Ende#################

CU

C
"Patrick" <pla...@freeshell.org> schrieb im Newsbeitrag

0 new messages