19. februar 2009 - 12:38Der 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.
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.
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
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
'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
Synes godt om
Ny brugerNybegynder
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.