Подсчитайте количество #defines в файле .c, используя VBS - PullRequest
2 голосов
/ 09 апреля 2009

Мне нужно подсчитать количество #define строк в файлах C (3 из них) с использованием VBS. Пожалуйста, предложите лучший способ сделать это.

Ответы [ 4 ]

1 голос
/ 21 июня 2009

В приведенном ниже сценарии используется регулярное выражение для подсчета операторов #define, которые появляются в начале строк. Пробел допускается перед оператором, а также между # и define. Список файлов для поиска должен быть передан в качестве аргументов, например ::

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

Вот код скрипта:

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

Вывод скрипта выглядит так:

There are 7 #define statement(s) in c:\myfile1.c
There are 0 #define statement(s) in c:\myfile2.c
0 голосов
/ 10 апреля 2009

Этот код должен считать все операторы #define в любом количестве входных файлов. В операторах предусмотрены пробелы, такие как «# define» или «# define», оба из которых являются допустимыми.

ПРИМЕЧАНИЕ: я не учитываю # в одной строке и "define" в следующей, я предполагаю, что # и "define", по крайней мере, находятся на одной строке, хотя вы могли бы сделать это, прочитав весь файл и удалив все пробелы, затем сохраните в переменную или временный файл или что-то в этом роде и используйте это в качестве ввода.

Вы можете сократить код кучей, отключив константы доступа к файлу, а что нет, иначе это даст вам вывод, подобный этому:

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

Командная строка будет выглядеть следующим образом: 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 голосов
/ 10 апреля 2009

Я не так хорош в сценарии VB, но что-то вроде ...

Dim re as New RegExp
re.IgnoreCase = True
re.Global = True
re.Pattern = "#define"
Set mc = re.Execute(yourFileText)
ans = mc.Count
0 голосов
/ 09 апреля 2009

Как насчет этого? просто передайте файлы в качестве аргументов


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

Это будет игнорировать пробелы между # и определять


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
...