Problem
Es kommt häufig vor, dass eine Festplatte fast voll ist, ohne dass man weiß, was eigentlich den ganzen Platz beansprucht. Mit Windows Explorer kann man zwar die einzelnen Verzeichnisse untersuchen, aber dies ist oft recht mühsam und führt nicht immer zum Ziel. Manche GUI-Programme bieten eine graphische Darstellung der Datenverteilung auf der Festplatte, aber viele von ihnen überspringen versteckte Verzeichnisse. Zudem können sie meist nur den aktuellen Rechner untersuchen.
Lösung
RDir („Recursive Dir“) erstellt auf der Konsole rasch eine Zusammenfassung des gewünschten Verzeichnisses und seiner Unterverzeichnisse. Mit Hilfe von psexec.exe (www.sysinternals.com) kann das Programm auch leicht auf andern Rechnern ausgeführt werden, sofern sie mit dem gegenwärtigen Rechner vernetzt sind.
Installation
Eine eigentliche Installation ist nicht nötig, bloß die folgenden zwei Schritte:
– Den Quelltext in die Datei RDir.vbs in einem Verzeichnis kopieren, das im Pfad erwähnt ist, z.B. in c:\Windows.
– Über Start / Run den folgenden Befehl ausführen: cscript //H:CScript
Bitte beachten: Das Programm braucht mindestens Internet Explorer 6.
Anwendung
RDir.vbs läuft vom Command Prompt aus und kann auf zwei Arten angewandt werden:
a) Ohne Parameter – Man tippt einfach rdir.vbs. In diesem Fall bekommt man eine Zusammenfassung des aktuellen Verzeichnisses samt aller Unterverzeichnisse.
b) Mit Parameter, also z:B. rdir.vbs „c:\Dokumente und Einstellungen“. In diesem Fall bekommt man eine Zusammenfassung des angegebenen Verzeichnisses und seiner Unterverzeichnisse.
Quelltext
- ‚Dieses Programm zeigt an, wie viel Platz das gewählte Verzeichnis
- ‚(samt Unterverzeichnissen) auf der Festplatte beansprucht.
- ‚20.1.2007 FNL
- Option Explicit
- Const Col1 = 16 ‚Breite der „Grösse“-Spalte
- Const Col2 = 7 ‚Breite der „Dateien“-Spalte
- Const Col3 = 37 ‚Breite der „Dateiname“-Spalte
- Const WshRunning = 0, WshFinished = 1, WshFailed = 2
- Const ForReading = 1, ForWriting = 2, ForAppending = 8
- Dim objStream, objFldr, objSFldr, objFl, ObjWshShell
- Dim Folder, NL, AccessDenied, ProblemFolder, NoFileOutput, OutputStream
- Dim MaxSizeS, MaxSizeF, MaxSizeD
- Dim MaxFilesS, MaxFilesF, MaxFilesD
- Dim temp, Tempname1, TempName2, Output
- NL = Chr(10)
- AccessDenied = False
- ‚==============
- ‚Hauptprogramm
- ‚==============
- Dim Help, objFSO, objArgs
- Set objFSO = CreateObject(„Scripting.FileSystemObject“)
- Set ObjWshShell = WScript.CreateObject(„WScript.Shell“)
- Output = ObjWshShell.Environment(„PROCESS“)(„SystemDrive“) & „\RDir.txt“
- Help = „RDir Version 1.0-D by Pegasus. 20.1.2008“ & NL & NL & _
- „Dieses Programm zeigt die Grösse des gewählten Verzeichnisses“ & NL & _
- „samt aller Unterverzeichnisse an. Das Resultat wird in der Datei“ & NL & _
- „“„“ & Output & „““ gespeichert.“ & NL & NL & _
- „Andwendung: rdir.vbs“ & NL & _
- „Oder: rdir.vbs „„Name_des_Verzeichnisses“„“
- Set objArgs = WScript.Arguments
- If objArgs.Count > 0 Then
- If objArgs(0) = „/?“ Or objArgs(0) = „-?“ Or objArgs(0) = „?“ Then
- MsgBox (Help)
- WScript.quit
- End If
- End If
- temp = ObjWshShell.Environment(„PROCESS“)(„temp“)
- Tempname1 = temp & „\RDir1.tmp“
- TempName2 = temp & „\RDir2.tmp“
- Err.Clear
- On Error Resume Next
- Set objStream = objFSO.OpenTextFile(Tempname1, ForWriting, True)
- If Err.number <> 0 Then
- WScript.Echo („Cannot open „ & „“„“ & Tempname1 & „“„“)
- WScript.Echo (Err.Description)
- WScript.Quit
- End If
- On Error Goto 0
- Folder = ObjWshShell.CurrentDirectory
- If objArgs.Count > 0 _
- Then If UCase(Right(objArgs(0),4)) <> „.VBS“ _
- Then Folder = objArgs(0)
- WScript.echo „Das gewählte Verzeichnis wird untersucht . . .“
- WScript.echo Folder
- GetMainDirectory Folder
- GenerateOutput
- objFSO.DeleteFile(TempName1)
- objFSO.DeleteFile(TempName2)
- Set objStream = Nothing
- Set objFSO = Nothing
- ‚————————————————-
- ‚Schreib eine Liste aller Dateien in tempfile2.txt
- ‚————————————————-
- Sub GetMainDirectory(Folder)
- Dim objFSO, files, iSize, path
- Set objFSO = CreateObject(„Scripting.FileSystemObject“)
- ‚ Process main directory
- files = 0
- iSize = 0
- If Not objFSO.FolderExists(Folder) Then
- WScript.Echo NL & „Fehlermeldung: Verzeichnis „„“ & Folder & „““ nicht gefunden.“
- WScript.quit
- End If
- Set objFldr = objFSO.GetFolder(Folder)
- Err.clear
- On Error Resume Next
- For Each objFl In objFldr.Files
- If Err.number <> 0 Then
- WScript.Echo („Das Verzeichnis „„“ & Folder & „““ ist gesperrt.“)
- WScript.Echo Err.Description
- WScript.Quit
- End If
- files = files + 1
- iSize=iSize + objFl.Size
- Next
- On Error Goto 0
- objStream.writeline(Pad(iSize) & „?“ & files & „?“ & Folder)
- MaxSizeS = iSize
- MaxSizeF = files
- MaxSizeD = Folder
- MaxFilesS = files
- MaxFilesF = files
- MaxFilesD = Folder
- ‚ Process subdirectories
- For Each objSFldr In objFldr.SubFolders
- If Right(Folder,1) = „\“ Then
- path = Folder & objSFldr.name
- Else
- path = Folder & „\“ & objSFldr.Name
- End If
- files = 0
- iSize=0
- WScript.Echo path
- GetSubdirectory path, files, iSize
- objStream.writeline Pad(iSize) & „?“ & files & „?“ & path
- Next
- objStream.Close
- End Sub
- ‚————————————
- ‚Bearbeite jedes Verzeichnis rekursiv
- ‚————————————
- Sub GetSubdirectory(path, files, iSize)
- Dim objFSO, p, f, s, denied
- Set objFSO = CreateObject(„Scripting.FileSystemObject“)
- Set objFldr = objFSO.GetFolder(path)
- f = 0
- s = 0
- denied=False
- Err.Clear
- On Error Resume Next
- For Each objFl In objFldr.Files
- If Err.number <> 0 Then
- path = path & “ („ & Err.Description & „)“
- denied = True
- AccessDenied = True
- ProblemFolder = path
- Exit For
- End If
- f = f + 1
- s = s + objFl.Size
- Next
- On Error Goto 0
- files = files + f
- iSize = iSize + s
- If s > MaxSizeS Then
- MaxSizeS = s
- MaxSizeF = f
- MaxSizeD = path
- End If
- If f > MaxFilesF Then
- MaxFilesS = s
- MaxFilesF = f
- MaxFilesD = path
- End If
- If Not denied Then
- For Each objSFldr In objFldr.SubFolders
- p = path & „\“ & objSFldr.Name
- GetSubdirectory p, files, iSize
- Next
- End If
- End Sub
- ‚—————————————————-
- ‚Schreib das Resultat sortiert in die temporäre Datei
- ‚—————————————————-
- Sub GenerateOutput
- Const name=0, size=1, files=2
- Dim ObjExec, objFSO, ObjWshShell
- Dim file, InputFile, index
- Dim line, i, j, k, p
- Dim TotalF, TotalS, cmd
- Dim sName, sSize, iSize, iFiles, elements
- Set objFSO = CreateObject(„Scripting.FileSystemObject“)
- Set ObjWshShell = WScript.CreateObject(„WScript.Shell“)
- NoFileOutput = False
- index = 0
- TotalF = 0
- TotalS = 0
- ‚Die temporäre Datei sortieren
- cmd = „%comspec% /c type „„“ & Tempname1 & „““ | sort > „„“ & TempName2 & „“
- Set ObjExec = ObjWshShell.Exec(cmd)
- Do While ObjExec.Status = WshRunning
- WScript.Sleep 100
- Loop
- Err.Clear
- On Error Resume Next
- Set InputFile = objFSO.OpenTextFile(Tempname2)
- If Err.number <> 0 Then
- WScript.Echo („Cannot access „„“ & TempName2 & „“„.“)
- WScript.Echo Err.Description
- WScript.Quit
- End If
- Err.Clear
- Set OutputStream = objFSO.CreateTextFile(Output)
- If Err.number <> 0 Then
- ‚ WScript.Echo Err.Description & „(„““ & Output & „““)“
- NoFileOutput = True
- End If
- On Error Goto 0
- ‚Zusammenfassung auf den Bildschirm schreiben
- WScript.Echo
- Call Result(“ Zusammenfassung“)
- Call Result(“ ============================================“)
- ‚Zeilen aus der temporären Datei bearbeiten
- While Not InputFile.AtEndOfStream
- line = InputFile.ReadLine
- elements = Split(LTrim(line), „?“)
- sSize = Left(line, Col1)
- iSize = LTrim(sSize)
- iFiles = elements(1)
- sName = elements(2)
- TotalS = TotalS + iSize
- TotalF = TotalF + iFiles
- Call Result(Format(sSize,Col1) & Format(iFiles, Col2) & SFormat(sName, 54))
- Wend
- InputFile.Close
- Call Result(Format(TotalS, Col1) & Format(TotalF, Col2) & „(Total)“)
- Call Result(„“)
- Call Result(Format(MaxSizeS, Col1) & Format(MaxSizeF, Col2) & SFormat(MaxSizeD, Col3) & “ (am meisten Speicherplatz)“)
- Call Result(Format(MaxFilesS, Col1) & Format(MaxFilesF, Col2) & SFormat(MaxFilesD, Col3)& “ (am meisten Dateien)“)
- WScript.echo
- If NoFileOutput Then
- WScript.Echo „Kann das Resultat nicht in die Datei „„“ & Output & „““ schreiben.“
- Else
- WScript.Echo „Das Resultat ist auch in „ & Output & “ gespeichert.“
- End If
- If AccessDenied Then
- Call Result(„“)
- Call Result(„Warnung: Die Dateien im folgenden Verzeichnis waren nicht zugänglich:“)
- Call Result(ProblemFolder)
- End If
- if not NoFileOutput then OutputStream.Close
- End Sub
- ‚———————————————————-
- ‚Formattiere eine Zahl entsprechend den Landeseinstellungen
- ‚und füge zusätzliche Abstände nach Bedarf hinzu.
- ‚———————————————————-
- Function Format(number, pos)
- Const Decimals = 0 ‚No. of decimals to be shown
- Const GroupDigits= –1 ‚Group digits according to regional settings
- Dim formatted
- formatted = FormatNumber(number, Decimals, GroupDigits)
- If pos > Len(formatted) Then formatted = _
- Left(“ „, pos – Len(formatted)) & formatted & “ „
- Format = formatted
- End Function
- ‚—————————————————-
- ‚Entferne genügend Zeichen am Anfang eines Namens, so
- ‚dass die zulässige Länge nicht überschritten wird.
- ‚—————————————————-
- Function SFormat(name, length)
- If Len(name) > length Then
- name=„..“ & Right(name, length – 2)
- End If
- SFormat=name
- End Function
- ‚—————————————
- ‚Schreib ein Resultat auf den Bildschirm
- ‚und in die Ausgangsdatei.
- ‚—————————————
- Sub Result(line)
- WScript.Echo line
- if not NoFileOutput then OutputStream.WriteLine(line)
- End Sub
- ‚—————————————————————-
- ‚Füge links Abstände hinzu, bis die Länge „Col1“ Zeichen beträgt.
- ‚—————————————————————-
- Function Pad(number)
- Pad = Left(“ „, Col1 – Len(number)) & number
- End Function
http://faq-o-matic.net/?p=739