2009-04-09 4 views
2

Ich muss die Anzahl der #define Zeilen in C-Dateien (3 von ihnen) mit VBS zählen. Bitte schlagen Sie den besten Weg vor, dies zu erreichen.Zählen Sie die Anzahl der #defines in einer .c-Datei mit VBS

+0

Eine Textdatei besteht aus einer Folge von Zeichen. Wenn Sie nicht definieren, wo eine "Zeichenfolge" endet und wo die nächste beginnt, ist die Antwort nur "1". Sie könnten eine Funktion erstellen, die nur 1 zurückgibt. –

+0

hi daniel, Um die Frage klarer und besser zu machen.Ich möchte eine VBS-Skriptdatei schreiben, die die Anzahl der in a.c, b.c und d.c. vorhandenen #define-Zeichenfolgen zählt. – Maddy

+0

Ich habe die Frage basierend darauf umgeschrieben. Bitte lassen Sie mich wissen, ob es korrekt ist. –

Antwort

0

Wie wäre es mit so etwas? Pass nur die Dateien in als Argumente


Const token = "#define" 
Set objArgs = WScript.Arguments 

tokenCount = 0 

Set fso = CreateObject("Scripting.FileSystemObject") 

For i = 0 To objArgs.Count - 1 
    Set objFile = fso.OpenTextFile(objArgs(i), 1) 
    Do Until objFile.AtEndofStream 
     lineCount = lineCount + 1 
     If InStr(1, objFile.ReadLine, token, 1) 0 Then 
       tokenCount = tokenCount + 1 
     End If 
    Loop 
Next 

WScript.echo tokenCount 

Diese Leerzeichen zwischen # ignorieren und definieren


Const token = "#define" 
Set objArgs = WScript.Arguments 

tokenCount = 0 

Set fso = CreateObject("Scripting.FileSystemObject") 

For i = 0 To objArgs.Count - 1 
    Set objFile = fso.OpenTextFile(objArgs(i), 1) 
    Do Until objFile.AtEndofStream 
     lineCount = lineCount + 1 
     If InStr(1, Replace(objFile.ReadLine, " ", "", 1, -1, 1), token, 1) 0 Then 
      tokenCount = tokenCount + 1 
     End If 
    Loop 
Next 

WScript.echo tokenCount 
+1

Beachten Sie, dass die Token '#' und 'define' durch eine beliebige Anzahl von Leerzeichen getrennt sein können! '# define' ist immer noch ein gültiges Define-Makro und wird von Ihrem Code nicht gefunden. –

0

Dieser Code sollte alle # define-Anweisungen in einer beliebigen Anzahl von Eingabedateien zählen. In den Anweisungen wurden Vorkehrungen für Leerzeichen getroffen, z. B. "# definieren" oder "# definieren", die beide gültige Anweisungen sind.

HINWEIS: Ich zähle nicht für die # auf einer Zeile und die "definieren" auf der nächsten, ich nehme an, die # und "definieren" sind mindestens in der gleichen Zeile, obwohl Sie dies durch Lesen könnten die gesamte Datei und entfernen Sie alle Leerzeichen, dann speichern Sie in eine Variable oder temporäre Datei oder so ähnlich und verwenden Sie das als Ihre Eingabe.

Sie den Code ein Bündel von einem Graben umgeben, die Dateizugriffskonstanten verkürzen kann und was nicht, sonst wird es Ihnen Ausgabe wie folgt geben:

There are: 9 define statements in the source: c:\define.txt 
There are: 11 define statements in the source: c:\define2.txt 
There are: 10 define statements in the source: c:\define3.txt 

Die Kommandozeile wäre: cscript scriptname.vbs c: \ define.txt c: \ define3.txt etc ...

' Define constants for file access 
Const TristateFalse = 0 
Const ForReading = 1 
Const ForWriting = 2 
Const ForAppending = 8 

Set objFSO = CreateObject("Scripting.FileSystemObject") 
Set objArgs = WScript.Arguments 

If objArgs.Count > 0 then 

    For i = 0 To objArgs.Count - 1 

     Set objFileInputStream = objFSO.OpenTextFile(objArgs(i), ForReading, False, TristateFalse) 

     intTempCount = 0 
     tokenCount = 0 
     Do while not objFileInputStream.AtEndOfStream 

      strLine = replace(ucase(objFileInputStream.ReadLine), " ", "") 
      intLineLength = len(strLine) 

      Do  

       If instr(strLine, "#DEFINE") <> 0 then 
        tokenCount = tokenCount + 1 
        strLine = replace(strLine, "#DEFINE","", 1, 1) 
        intTempCount = intTempCount + 1   
       else 
        exit do 
       End If 

      Loop until intTempCount = intLineLength 

     Loop 

     objFileInputStream.Close 
     wscript.echo "There are: " & tokenCount & " define statements in the source: " & objArgs(i) 

    Next 

Else  
    wscript.echo "You must enter at least one filename." 
End If 
0

ich bin nicht so bei VB-Skript gut, aber so etwas wie ...

Dim re as New RegExp 
re.IgnoreCase = True 
re.Global = True 
re.Pattern = "#define" 
Set mc = re.Execute(yourFileText) 
ans = mc.Count 
1

Das folgende Skript verwendet einen regulären Ausdruck, um die #define Anweisungen zu zählen, die am Anfang der Zeilen angezeigt werden. Whitespace ist vor der Anweisung zulässig sowie zwischen und define. Die Liste der Dateien sollte die Suche in übergeben als Argumente, wie zB:

cscript.exe script_name.vbs c:\myfile1.c c:\myfile2.c 

Hier ist der Script-Code:

Const ForReading = 1 

Set oFSO = CreateObject("Scripting.FileSystemObject") 

Set re = New RegExp 
re.Pattern = "^\s*#\s*define\b" 
re.IgnoreCase = False 
re.Global  = True 
re.Multiline = True 

strReport = "" 
For Each strFileName in WScript.Arguments.Unnamed 
    Set oFile = oFSO.OpenTextFile(strFileName, ForReading) 
    strText = oFile.ReadAll 
    oFile.Close 

    intCount = re.Execute(strText).Count 
    strReport = strReport & "There are " & intCount & " #define statement(s) in " & strFileName & vbNewLine 
Next 

WScript.Echo strReport 

Die Skript-Ausgabe ist wie:

There are 7 #define statement(s) in c:\myfile1.c 
There are 0 #define statement(s) in c:\myfile2.c 
Verwandte Themen