Avatar billede angelenglen Nybegynder
19. februar 2009 - 12:38 Der er 8 kommentarer og
2 løsninger

Oversigt over filtyper og størrelser.

Jeg har en mappe med en masse filer (300.000+) i en masse mapper (10.000+).

Jeg har brug for at få en oversigt over hvor stor en del af disse filer, visse filtyper udgør.
Jeg har en liste over filtyper, fx: exe, zip, doc, mdb, vbs, bat, txt, bmp, csv - osv.

Jeg mangler et program eller et script eller lign. der kan give mig en oversigt, fx noget i stil med:

exe: 10.000 filer. 3.33 % af alle filer, 23.1% af pladsforbrug.
doc: 3.500 filer. 1.17% af alle filer, 3.5% af pladsforbrug.
csv: 2.000 filer. 0.67% af alle filer, 0.4% af pladsforbrug.
zip: 1.250 filer. 0.42% af alle filer, 42.7% af pladsforbrug.
osv osv.

Om det præsenteres grafisk eller tekst-baseret er ikke vigtigt for mig, faktisk kan det have sin fordel hvis det er tekst-baseret, da jeg så selv kunne lave grafer osv via fx Excel, men det er ikke et must.

Hvis der skal bruges software der koster lidt, kan det nok også gå, men det er vigtigt at der findes en demo-version eller god beskrivelse/screenshots, så jeg ikke spilder pengene på software der ikke kan hvad jeg har brug for.
Avatar billede scorp-d Nybegynder
19. februar 2009 - 12:46 #1
start -> kør -> cmd -> dir *.filtype /s

:P
Avatar billede scorp-d Nybegynder
19. februar 2009 - 12:47 #2
start -> kør -> cmd -> dir *.filtype /s

:P
Avatar billede Slettet bruger
19. februar 2009 - 12:57 #3
evt. dir *.filtype /s >Resultat.txt
således du gemmer det i en fil
Avatar billede angelenglen Nybegynder
19. februar 2009 - 13:01 #4
jo, det giver mig en liste over alle filerne, men det er ikke selve filerne jeg er interesseret i, det er antallet af dem (i forhold til samlet antal filer) samt pladsforbruget (ud fra alle filers pladsforbrug).

Der er alt for meget arbejde i at analysere alle de resultat.txt filer jeg ville få brug for.
Avatar billede scorp-d Nybegynder
19. februar 2009 - 13:03 #5
de sidste 2 linjer giver dig antal og størrelse....
Avatar billede angelenglen Nybegynder
19. februar 2009 - 13:06 #6
ja, men kun for én filtype, det viser ikke hvor mange procent af pladsforbruget, eller hvor mange procent af filantallet.

Hvis jeg skal checke fx 200 forskellige filtyper, er der pludselig ret meget arbejde i det alligevel.

dir-kommandoen kan jeg derfor ikke se brugt alene i den sammenhæng.
Avatar billede Slettet bruger
19. februar 2009 - 13:34 #7
Prøv denne gratis version. Den giver en masse informationer og er lynhurtig: http://www.contactplus.com/products/freestuff/stats.htm
Avatar billede angelenglen Nybegynder
19. februar 2009 - 13:57 #8
ok. I mellemtiden fik jeg smækket følgende Vbscript sammen, der kan køres fra kommandoprompten via cscript (fx "cscript filoversigt.vbs" hvis scriptet er gemt i filen filoversigt.vbs)

Det er på ingen måde lavet særligt optimalt, da alting løbes igennem mange gange, men det virker dog.
Fordelen ved vbscript, er jo at man kan rette i det som man har lyst, og derved kan man få præcis det output der ønskes.

Det program jape44 kom med er også fedt, så hvis jape44 laver et svar, vil jeg gerne give points for det.

Mit script giver p.t. et output der ser således ud:

Tæller mapper...
Tæller filer...
Beregner pladsforbrug...
Antal mapper:          77 mapper.
Antal Filer:            290 filer.
Pladsforbrug ialt:      515981103 bytes.
Ingen EXE-filer fundet.
Antal DOC: 13  4,48% af alle filer.    0,52% af pladsforbrug.
Antal TXT: 3    1,03% af alle filer.    0% af pladsforbrug.
Antal JPG: 58  20% af alle filer.      12,62% af pladsforbrug.
Antal GIF: 11  3,79% af alle filer.    0,09% af pladsforbrug.
Ingen DOCX-filer fundet.
Antal ZIP: 16  5,52% af alle filer.    30,84% af pladsforbrug.
Ingen HTM-filer fundet.


Hvis det har interesse, er scriptet her til kopiering:


' Angiv hvilke filtyper der skal tælles, adskil med komma.
Filtyper = "exe,doc,txt,jpg,gif,docx,zip,htm"

Function subGetFolder
    Dim objShell, objFOlder, objFolderItem, objPath
    Const windowHandle = 0
    Const folderOnly = 0
    const folderAndFiles = &H4000&
    Set objShell = CreateObject("Shell.Application")     
    Set objFOlder = objShell.BrowseForFolder(windowHandle, "Vælg mappen der skal behandles:", folderOnly)     
    Set objFolderItem = objFolder.Self 
    objPath = objFolderItem.Path
    subGetFolder = objPath
End Function

Function CountAllFolders(strPath)
    Set FSO = CreateObject("Scripting.FileSystemObject")
    Set Folder = FSO.GetFolder(strPath)
    Set SubFolders = Folder.SubFolders
    intTemp = SubFolders.Count
    for each SubFolder in SubFolders
        intTemp = intTemp + CountAllFolders(SubFolder.Path)
    Next
    CountAllFolders = intTemp
End Function

Function CountAllFiles(strPath)
    Set FSO = CreateObject("Scripting.FileSystemObject")
    Set Folder = FSO.GetFolder(strPath)
    Set SubFolders = Folder.SubFolders
    Set Files = Folder.Files
    intTemp = Files.Count
    for each SubFolder in SubFolders
        intTemp = intTemp + CountAllFiles(SubFolder.Path)
    Next
    CountAllFiles = intTemp
End Function

Function GetTotalFileSize(strPath)
    Set FSO = CreateObject("Scripting.FileSystemObject")
    Set Folder = FSO.GetFolder(strPath)
    Set SubFolders = Folder.SubFolders
    Set Files = Folder.Files
    For each File in Files
        intTemp = intTemp + File.Size
    Next
    For each SubFolder in SubFolders
        intTemp = intTemp + GetTotalFileSize(SubFolder.Path)
    Next
    GetTotalFileSize = intTemp
End Function

Function CountFileType(strPath, strFileType)
    Set FSO = CreateObject("Scripting.FileSystemObject")
    Set Folder = FSO.GetFolder(strPath)
    Set SubFolders = Folder.SubFolders
    Set Files = Folder.Files
    intTemp = 0
    For each File in Files
        tmpFiltype = Ucase(FSO.GetExtensionName(File))
        if tmpFiltype = ucase(strFileType) then intTemp = intTemp + 1
    Next
    For each SubFolder in SubFolders
        intTemp = intTemp + CountFileType(SubFolder.Path, strFileType)
    Next
    CountFileType = intTemp
End Function

Function CountFileSize(strPath, strFileType)
    Set FSO = CreateObject("Scripting.FileSystemObject")
    Set Folder = FSO.GetFolder(strPath)
    Set SubFolders = Folder.SubFolders
    Set Files = Folder.Files
    intTemp = 0
    For each File in Files
        tmpFiltype = Ucase(FSO.GetExtensionName(File))
        if tmpFiltype = ucase(strFileType) then intTemp = intTemp + File.Size
    Next
    For each SubFolder in SubFolders
        intTemp = intTemp + CountFileSize(SubFolder.Path, strFileType)
    Next
    CountFileSize = intTemp
End Function

dim TopPath
TopPath = subGetFolder()

Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFolder = objFSO.GetFolder(TopPath)
Set sf = objFolder.SubFolders

WScript.Echo "Tæller mapper..."
TotalAntalMapper = CountAllFolders(TopPath)
WScript.Echo "Tæller filer..."
TotalAntalFiler = CountAllFiles(TopPath)
WScript.Echo "Beregner pladsforbrug..."
TotalPladsforbrug = GetTotalFileSize(TopPath)

WScript.Echo "Antal mapper: " & vbtab & vbtab & TotalAntalMapper & " mapper."
WScript.Echo "Antal Filer: " & vbtab & vbtab & TotalAntalFiler & " filer."
WScript.Echo "Pladsforbrug ialt: " & vbtab & TotalPladsforbrug & " bytes."

arrFiltyper = Split(Filtyper,",")
For each Filtype in arrFiltyper
    AntalFiler = CountFileType(TopPath, Filtype)
    FilSize = CountFileSize(TopPath, Filtype)
    if AntalFiler > 0 then
        WScript.Echo "Antal " & Ucase(Filtype) & ": " & AntalFiler & vbtab & Round((100/TotalAntalFiler)*AntalFiler,2) & "% af alle filer." & vbtab & Round((100/TotalPladsforbrug)*FilSize,2) & "% af pladsforbrug."
    else
        WScript.Echo "Ingen " & Ucase(Filtype) & "-filer fundet."
    end if
Next
Avatar billede Slettet bruger
19. februar 2009 - 14:08 #9
Ok! Jeg ville nu også holde mig til dit script, så man kan bruge output i andre sammenhæng
Avatar billede angelenglen Nybegynder
20. februar 2009 - 10:59 #10
Jeg har lige optimeret scriptet lidt, så det nu kun løber filerne igennem én gang, så det går nu mange gange hurtigere.
Desuden er koden mere overskuelig.

Nuværende output:

Tæller filer og mapper i U:\Dokumenter
Vent venligst...

- - - - - - - - - - - - - - - - - - - -
  Statistik for:        U:\Dokumenter
  Total antal mapper:  77
  Total antal filer:    290
  Samlet pladsforbrug:  492,08 MB
- - - - - - - - - - - - - - - - - - - -

  Filtype statistik:

  DOC-filer:    13 - 4,48% af alle filer.      0,52% af samlet pladsforbrug.
  TXT-filer:    3 - 1,03% af alle filer.        0,00% af samlet pladsforbrug.
  JPG-filer:    58 - 20,00% af alle filer.      12,62% af samlet pladsforbrug.
  GIF-filer:    11 - 3,79% af alle filer.      0,09% af samlet pladsforbrug.
  ZIP-filer:    16 - 5,52% af alle filer.      30,84% af samlet pladsforbrug.


Kode:

Option Explicit
'Angiv hvilke filtyper der skal tælles, adskil med komma.
Dim Filtyper
Filtyper = "exe,doc,txt,jpg,gif,docx,zip,htm"

Function subGetFolder
    Dim objShell, objFOlder, objFolderItem, objPath
    Const windowHandle = 0
    Const folderOnly = 0
    const folderAndFiles = &H4000&
    Set objShell = CreateObject("Shell.Application")   
    Set objFOlder = objShell.BrowseForFolder(windowHandle, "Vælg mappen der skal behandles:", folderOnly)   
    Set objFolderItem = objFolder.Self
    objPath = objFolderItem.Path
    subGetFolder = objPath
End Function

Dim TopPath, arrFiltyper, arrNumFiles, arrSizeFiles, TotalAntalMapper, TotalAntalFiler, TotalFileSize, FilType, FSO, Folder, SubFolders, Subfolder, Files, FileType, File, tmp, i

TotalAntalMapper = 0
TotalAntalFiler = 0
TotalFileSize = 0
i = 0

'Opret arrays
arrFiltyper = Split(Filtyper,",")
arrNumFiles = Split(Filtyper,",")
arrSizeFiles = Split(Filtyper,",")

TopPath = subGetFolder()

'Nulstil Filtype/Filstørrelse tæller-arrays (Fusk, men det virker):
For each FilType in arrFiltyper
    arrNumFiles(i) = 0
    arrSizeFiles(i) = 0
    i = i + 1
Next
i = 0

Function CountEverything(strPath)
    Set FSO = CreateObject("Scripting.FileSystemObject")
    Set Folder = FSO.GetFolder(strPath)
    Set SubFolders = Folder.SubFolders
    Set Files = Folder.Files
    TotalAntalMapper = TotalAntalMapper + SubFolders.Count
    TotalAntalFiler = TotalAntalFiler + Files.Count
    For each File in Files
        TotalFileSize = TotalFileSize + File.Size
        i = 0
        tmp = Ucase(FSO.GetExtensionName(File))
        For each FileType in arrFiltyper
            If Ucase(FileType) = tmp then
                arrNumFiles(i) = arrNumFiles(i) + 1
                arrSizeFiles(i) = arrSizeFiles(i) + File.Size
            End if
            i = i + 1
        Next
    Next
    For each SubFolder in SubFolders
        Call CountEverything(SubFolder.Path)
    Next
    Set FSO = Nothing
    Set Folder = Nothing
    Set SubFolders = Nothing
    Set Files = Nothing
End Function

Function ConvertSize(Size)
    Dim Suffix
    Do While InStr(Size,",") 'Remove commas from size
        CommaLocate = InStr(Size,",")
        Size = Mid(Size,1,CommaLocate - 1) & _
            Mid(Size,CommaLocate + 1,Len(Size) - CommaLocate)
    Loop

    Suffix = " Bytes"
    If Size >= 1024 Then suffix = " KB"
    If Size >= 1048576 Then suffix = " MB"
    If Size >= 1073741824 Then suffix = " GB"
    If Size >= 1099511627776 Then suffix = " TB"

    Select Case Suffix
        Case " KB" Size = Round(Size / 1024, 2)
        Case " MB" Size = Round(Size / 1048576, 2)
        Case " GB" Size = Round(Size / 1073741824, 2)
        Case " TB" Size = Round(Size / 1099511627776, 2)
    End Select

    ConvertSize = Size & Suffix
End Function

WScript.Echo "Tæller filer og mapper i " & TopPath
WScript.Echo "Vent venligst..." & vbcrlf
Call CountEverything(TopPath)
WScript.Echo " - - - - - - - - - - - - - - - - - - - -"
WScript.Echo "  Statistik for: " & vbtab & TopPath
WScript.Echo "  Total antal mapper: " & vbtab & TotalAntalMapper
WScript.Echo "  Total antal filer: " & vbtab & TotalAntalFiler
WScript.Echo "  Samlet pladsforbrug: " & vbtab & ConvertSize(cstr(TotalFileSize))
WScript.Echo " - - - - - - - - - - - - - - - - - - - -" & vbcrlf
WScript.Echo "  Filtype statistik:" & vbcrlf
i = 0
For each FilType in arrFiltyper
    if arrNumFiles(i) > 0 then
        WScript.Echo "  " & Ucase(FilType) & "-filer:" & vbtab & arrNumFiles(i) & " - " & FormatNumber(Round((100/TotalAntalFiler)*arrNumFiles(i),2),2) & "% af alle filer." & vbtab & FormatNumber(Round((100/TotalFileSize)*arrSizeFiles(i),2),2) & "% af samlet pladsforbrug."
    else
        'WScript.Echo "  Ingen " & Ucase(Filtype) & "-filer fundet."
    end if
    i = i + 1
Next
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester