http://dieseyer.de • all rights reserved • © 2011 v11.4

'v4.7*****************************************************
' File: DirAnalyze.vbs
' Autor: Mueller@tensor.de
' www.tensor.de
'
' Findet verdächtig lange Verzeichnisnamen im Dateisystem
' und speichert sie in einer Logdatei.
'
' Muss mit administrativen Rechten ausgeführt werden!!!
' Wenn der Administrator nicht überall zumindest Lesesrechte
' hat, meldet das Programm für das erste zutreffende Verzeichnis
' einen Fehler und bricht die Verarbeitung ab
'*********************************************************

Option Explicit

Dim WSHShell, fso, oArgs
Dim Pfad, j, MaxNameLen,k, i
Dim StartVerz, Limit
Dim FoundMinus1, Longest
Dim Fileout, fsolog
Dim Drives(30)

Set WSHShell = WScript.CreateObject("WScript.Shell")
Set fso = WScript.CreateObject("Scripting.FileSystemObject")
Set oArgs = Wscript.Arguments

If oArgs.Count <> 2 Then
Wscript.Echo "Aufruf: <Zu untersuchendes Laufwerk; alternativ 'ALL' oder LOCAL> <Limitlänge> (als Zahl>100)"
WScript.Echo "Beispiel: Diranalyze ALL 180"
WScript.Echo "--> Die gesamte Laufwerksliste wird auf Verzeichnisnamen länger als 180 Zeichen analysiert"
Wscript.Quit 1
End If

If not isnumeric(oArgs(1)) then
Wscript.Echo "Ihr zweiter Aufrufparameter ist nicht numerisch."
Wscript.Quit 1
end if

If oArgs(1) < 100 then
Wscript.Echo "Der Parameter 'Maximale Länge' ist zu klein gewählt."
Wscript.Quit 1
end if
limit = cint(oArgs(1))

ClearLogDatei
FoundMinus1=" "
j=0
MaxNameLen=0
For i=0 To 30
Drives(i)= " "
Next
EvaluateLWs

IF NOT fso.FolderExists(Drives(0) & "\") Then
'hier verlassen wir uns drauf, das EvaluateLWs exakt arbeitet
WScript.Echo Drives(0) & " ist kein gültiges Laufwerk."
WScript.Quit 1
End If

i=0
Do While Drives(i) <> " "
Set Startverz = fso.GetFolder(Drives(i) & "\" )
DirsRecursive Startverz
i= i + 1
Loop

Logdatei(vbCrLf & "Maximal gefundene Namenslänge: " & MaxNameLen & " und zwar in:")
Logdatei(Longest)
CloseLogDatei
wscript.echo "Fertig, " & j & " Verzeichnisnamen mit mehr als " & limit & " Zeichen Länge gefunden."
If MaxNameLen > 220 Then wscript.Echo "Es gibt kritisch lange Dateinamen mit mehr als 220 Zeichen - sichten Sie die Logdatei!"


Sub DirsRecursive (Startpfad)
Dim MySubFolders
Dim MyFolder
Dim NameLen

If UCase(Startpfad)=Drives(i) & "\SYSTEM VOLUME INFORMATION" Then Exit sub
Set MySubFolders = Startpfad.SubFolders
'Vorbereitung Rekursiver Aufruf, Unterverzeichnisse zuerst.
On Error Resume Next
k = MySubFolders.Count
If Not err.number = 0 Then
Select Case err.number
Case 70
logdatei("Berechtigungsproblem im Ordner " & Startpfad)
wscript.Echo "Kann die Datenmenge nicht verarbeiten, solange Sie nicht über die notwendigen Berechtigungen verfügen."
wscript.Echo "Fehler trat im Pfad " & Startpfad & " auf. Übernehmen Sie ggf. Besitz über das Laufwerk und erteilen Sie sich dann zumindest Leserechte!"
Case 76
logdatei("Ordnername zu lang und zwar in " & Startpfad)
wscript.Echo "Kann die Datenmenge nicht verarbeiten, solange kritisch lange Ordnernamen auftreten."
wscript.Echo "Fehler trat im Pfad " & Startpfad & " auf. Kürzen Sie die Namen, indem Sie die Struktur nach oben VERSCHIEBEN!"
End Select
Logdatei(vbCrLf & "Bis hierher gefundene maximale Namenslänge: " & MaxNameLen & " und zwar in:")
Logdatei(Longest)
CloseLogDatei
wscript.Quit
End If
On Error GoTo 0
If k <> 0 Then
For each MyFolder in MySubFolders
DirsRecursive MyFolder
namelen=len (MyFolder.path)
if NameLen>MaxNameLen then
MaxNameLen=NameLen
Longest = MyFolder.path
end if
if namelen > limit then
'Pfadnamen, die länger als limit Zeichen sind, werden sofort in die Logdatei geschrieben -->
'der erste Pfadname, der das Kriterium erfüllt ist, bedingt durch den rekursiven Aufruf, der innerste auflösbare
'der nächste Pfadname könnte immer noch länger als limit Zeichen sein, obwohl er übergeordnete des vorhergehenden ist -->
'der interessiert aber nicht mehr --> daher dieser instr- Vergleich. Und besonders schön: Durch Rekursion
'tauchen übergeordnete zu lange immer als Nachfolger des schon gefundenen auf. NUR DESHALB ist Vergleich statthaft.
if instr (1, FoundMinus1 , MyFolder.path,1) = 0 then
FoundMinus1=MyFolder.path
'Letzten gefundenen speichern
If namelen>220 Then LogDatei("KRITISCH: "& MyFolder.path) Else LogDatei(MyFolder.path)
j=j+1
if j>=1000 then
LogDatei("Zu viele Treffer - zu unscharfe Parameter oder sehr viele Probleme mit zu langen Namen.")
Wscript.echo("Programm beendet - zu viele Treffer")
wscript.quit
end if
end if
end if
Next
End If
End Sub
'------------------------------------------------------------------------------------------
'End of DirsRecursive
'------------------------------------------------------------------------------------------

Sub LogDatei (LogTxt)
fileOut.WriteLine (LogTxt)
End Sub ' LogDatei
' **************************************************************

' **************************************************************
Sub ClearLogDatei
' **************************************************************
Set fsolog = WScript.CreateObject("Scripting.FileSystemObject")
Set FileOut = fso.OpenTextFile( fsolog.GetBaseName( WScript.ScriptName ) & ".log", 2, true)
End Sub ' ClearLogDatei
' **************************************************************

' **************************************************************
Sub CloseLogDatei
' **************************************************************
Fileout.Close
Set FileOut = Nothing
End Sub ' CloseLogDatei
' **************************************************************

sub EvaluateLWs
Dim fso, d, dc, i
Set fso = CreateObject("Scripting.FileSystemObject")
Set dc = fso.Drives
i=0
If InStr(1,oArgs(0),":",1) Then
Drives(0) = oArgs(0)
Exit Sub
End if
For Each d in dc
' Case 0: t = "Unbekannt"
' Case 1: t = "Austauschbar"
' Case 2: t = "Fest"
' Case 3: t = "Netzwerk"
' Case 4: t = "CD-ROM"
' Case 5: t = "RAM-Laufwerk"
If d.Drivetype=2 Then
Drives(i)=D.Driveletter & ":"
i = i + 1
End If
If d.Drivetype=3 Then
If ucase(oArgs(0)) = "ALL" Then
Drives(i)=D.Driveletter & ":"
i = i + 1
End If
End If
Next
End Sub


http://dieseyer.de • all rights reserved • © 2011 v11.4