chrizz-at
Goto Top

Ordnerstruktur Script mit Logfile!

Hallo, ich bin neu hier und brauche unbedingt eure Hilfe!
Ich habe ein Script erstellt welches von einem angegeben Ordner die Unterordner und Dateien (Name und Größe) in eine Logdatei schreibt.
Nur die Dateinamen in den Unterordnern werden nicht geschrieben, ich weis nicht wie ich das einbinden kann.

Ich hoffe Ihr könnt mir helfen!

lg chris

Dim Ordnername, oFile

Ordnername = "C:\AddOn2"

Set fso = CreateObject("Scripting.FileSystemObject")

' Log Datei erstellen
Set oFile = fso.OpenTextFile("C:\" & Date() & ".log",8,true)

' Referenz auf ein Verzeichnis holen
Set Verzeichnis = FSO.GetFolder(Ordnername)

' Ausgabe in Protokoll
oFile.WriteLine "Kopierte Daten vom " & Now()
oFile.WriteLine "-- Dateien:"

' Alle Dateien
For Each Datei In Verzeichnis.Files
Next
oFile.WriteLine " "
oFile.WriteLine "-- Ordner:"

' Alle Unterverzeichnisse
For Each UnterVerzeichnis In Verzeichnis.SubFolders
Next
For Each Datei in Unterordner.Files
Next
oFile.WriteLine " "
oFile.WriteLine " "
oFile.WriteLine " "
oFile.Close

Content-ID: 96349

Url: https://administrator.de/contentid/96349

Ausgedruckt am: 26.11.2024 um 10:11 Uhr

Iwan
Iwan 08.09.2008 um 14:23:45 Uhr
Goto Top
hallo,

ich hab mich mal dran probiert und nach langem hin und her ein (nicht ganz saubere) Lösung gefunden:
Function GetSubFolders(Pfad) 
  Set Verzeichnis = FSO.GetFolder(Pfad) 
  Set UnterVerzeichnis = Verzeichnis.SubFolders
  'On Error Resume Next   
  For Each Ordner In UnterVerzeichnis 
     WriteLog2 Ordner
     GetSubFolders Ordner.Path
  Next 
End Function

Function WriteLog1(Pfadangabe)
  Dim Ordnername, oFile
  Set oFile = FSO.OpenTextFile("C:\" & Date() & ".log",8,true)  
  Set Ordner = FSO.GetFolder(Pfadangabe)

  oFile.WriteLine "Kopierte Daten vom " & Now()  
  oFile.WriteLine " "  

  oFile.WriteLine "-> " & Ordner.Name & " || Größe: " & Round(Ordner.Size/1024,2) & " Kilobytes"  
  For Each Datei In Ordner.Files
    oFile.WriteLine "|-> " & Datei.Name & " || Größe: " & Round(Datei.Size/1024,2) & " Kilobytes"  
  Next
  oFile.WriteLine " "  
  oFile.Close
End Function

Function WriteLog2(Ordner)
  Dim Ordnername, oFile
  Set oFile = FSO.OpenTextFile("C:\" & Date() & ".log",8,true)  
  Set Ordner = FSO.GetFolder(Ordner)

  oFile.WriteLine "-> " & Ordner.Name & " || Größe: " & Round(Ordner.Size/1024,2) & " Kilobytes"  
  For Each Datei In Ordner.Files
    oFile.WriteLine "|-> " & Datei.Name & " || Größe: " & Round(Datei.Size/1024,2) & " Kilobytes"  
  Next
  oFile.WriteLine " "  
  oFile.Close
End Function

Set FSO = CreateObject("Scripting.FileSystemObject")   
' HIER DEN ORDNER ANGEBEN !!  
Pfadangabe = "C:\Windows\Temp"  
' HIER DEN ORDNER ANGEBEN !!  
WriteLog1 Pfadangabe
GetSubFolders Pfadangabe
bastla
bastla 08.09.2008 um 14:28:18 Uhr
Goto Top
Hallo chrizz-at und willkommen im Forum!

Abgesehen davon, dass Du Dich zwischen den Variablennamen "UnterVerzeichnis" (Zeile 25) und "UnterOrdner" (Zeile 28) entscheiden solltest, kann das nur klappen, wenn die Behandlung der "UnterOrdner.Files" ebenfalls in einer Schleife stattfindet - dazu das "Next" aus Zeile 27 unter das "Next" aus Zeile 30 verschieben.

Grüße
bastla

P.S.: Wenn Du Dein Script beim Posten zwischen < code>< /code>-Tags platzierst (natürlich ohne die Leerzeichen), lassen sich die genannten Zeilennummern viel leichter zuordnen ...

P.P.S.: Falls Du nicht nur die erste Unterverzeichnis-Ebene dokumentieren willst, benötigst Du eine Rekursion - siehe dazu die oben geposteten Scripts.
bastla
bastla 08.09.2008 um 14:41:45 Uhr
Goto Top
@Iwan

Mein Ansatz sähe ähnlich aus:
Ordnername = "C:\AddOn2"  

Set fso = CreateObject("Scripting.FileSystemObject")  

' Log Datei erstellen  
Set oFile = fso.OpenTextFile("C:\" & Date & ".log",8,true)  

' Referenz auf ein Verzeichnis holen  
Set Verzeichnis = fso.GetFolder(Ordnername)

' Ausgabe in Protokoll  
oFile.WriteLine "Kopierte Daten vom " & Now  

'Rekursion starten  
DoFolders Verzeichnis

'Log abschließen  
oFile.WriteBlankLines 3
oFile.Close

Sub DoFolders(V)
oFile.WriteLine "-- Ordner: " & V.Path  
oFile.WriteLine "--> " & V.Name & " || Größe: " & Round(V.Size/1024,2) & " Kilobytes"  

' Alle Dateien  
For Each Datei In V.Files
	oFile.WriteLine "--> " & Datei.Name & " || Größe: " & Round(Datei.Size/1024,2) & " Kilobytes"  
Next
oFile.WriteLine

' Alle Unterverzeichnisse  
For Each UnterVerzeichnis In V.SubFolders
	DoFolders UnterVerzeichnis
Next
End Sub
Grüße
bastla

[Edit] Ausgabe der Ordnergröße ergänzt [/Edit]
Iwan
Iwan 08.09.2008 um 14:57:23 Uhr
Goto Top
Dein Ansatz sieht natürlich wesentlich "eleganter" aus, aber beide führen zum Ziel face-wink
bastla
bastla 08.09.2008 um 16:51:49 Uhr
Goto Top
@Iwan

"Sparsamer" trifft's vielleicht eher (ich habe einfach die Extraschleife für die Dateien im Ausgangsordner eingespart); letztlich sehe ich es aber eigentlich so wie Du: nicht der Weg ist hier das Ziel ...

Grüße
bastla
Iwan
Iwan 09.09.2008 um 07:50:45 Uhr
Goto Top
kurze Frage noch dazu:
kriegt man da irgendwie noch tausender Punkte mit rein?
bastla
bastla 09.09.2008 um 08:29:59 Uhr
Goto Top
Hallo Iwan!

kriegt man da irgendwie noch tausender Punkte mit rein?
Wenn ohnehin nicht mehr mit den Ergebnissen gerechnet wird, kann auch gleich noch das Runden mit "FormatNumber()" erledigt werden:
FormatNumber(Datei.Size/1024,2)
Die Darstellung mit Tausenderpunkten ist in der obigen Schreibweise von den Einstellungen der Systemsteuerung übernommen - um die Tausendertrennzeichen zu erzwingen:
FormatNumber(Datei.Size/1024,2,,,True)
Grüße
bastla
Iwan
Iwan 09.09.2008 um 09:52:00 Uhr
Goto Top
super, klappt einwandfrei und sieht besser aus, danke face-wink
chrizz-at
chrizz-at 10.09.2008 um 09:47:17 Uhr
Goto Top
Ich danke euch recht herzlich! funktioniert einwandfrei!