2009-04-09 9 views
2

je dois compter le nombre de lignes dans les fichiers #define C (3 d'entre eux) à l'aide VBS. S'il vous plaît, suggérez la meilleure façon d'accomplir ceci.Comptez le nombre de #defines dans un fichier .c VBS

+0

Un fichier texte consiste en une séquence de caractères. Si vous ne définissez pas où une "chaîne" se termine et où la suivante commence, la réponse est juste "1". Vous pouvez créer une fonction qui renvoie simplement 1. –

+0

salut daniel, Pour rendre la question plus claire et better.i voulez écrire un fichier de script VBS qui compte le nombre de chaînes de #define présentes dans a.c, et b.c C.C. – Maddy

+0

J'ai réécrit la question en fonction de cela. S'il vous plaît laissez-moi savoir si c'est exact. –

Répondre

0

Que diriez-vous quelque chose comme ça? juste passer les fichiers comme arguments


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 

Cela ne tient pas compte des espaces vides entre # et définir


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

Notez que les jetons '#' et 'define' peuvent être séparés par un nombre arbitraire d'espaces! '# define' est toujours une macro de définition valide et n'est pas trouvée par votre code. –

0

Ce code doit compter tous les #define de tout nombre de fichiers d'entrée. Des dispositions ont été prises pour les espaces dans les instructions, telles que "# define" ou "# define" qui sont toutes les deux des instructions valides.

NOTE: Je ne compte pas pour le # sur une ligne et le "définir" sur le suivant, je suppose que le # et "définir" sont au moins sur la même ligne, bien que vous puissiez le faire en lisant l'ensemble du fichier et en supprimant tous les espaces, puis enregistrer dans un fichier variable ou temporaire ou quelque chose comme ça et l'utiliser comme votre entrée.

Vous pouvez raccourcir le code d'un groupe en abandonnant les constantes d'accès aux fichiers et ce pas, sinon il vous donnera la sortie comme ceci:

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 

La ligne de commande serait: 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

Je ne suis pas bon au script VB, mais quelque chose comme ...

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

Le script ci-dessous utilise une expression régulière pour compter les instructions #define qui apparaissent au début des lignes. Les espaces sont autorisés avant l'instruction ainsi qu'entre # et define. La liste des fichiers à rechercher dans doit être transmis comme arguments, par exemple:

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

Voici le code de script:

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 

La sortie du script est comme:

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