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-Key: 96349

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

Printed on: April 19, 2024 at 23:04 o'clock

Member: Iwan
Iwan Sep 08, 2008 at 12:23:45 (UTC)
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
Member: bastla
bastla Sep 08, 2008 at 12:28:18 (UTC)
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.
Member: bastla
bastla Sep 08, 2008 at 12:41:45 (UTC)
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]
Member: Iwan
Iwan Sep 08, 2008 at 12:57:23 (UTC)
Goto Top
Dein Ansatz sieht natürlich wesentlich "eleganter" aus, aber beide führen zum Ziel face-wink
Member: bastla
bastla Sep 08, 2008 at 14:51:49 (UTC)
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
Member: Iwan
Iwan Sep 09, 2008 at 05:50:45 (UTC)
Goto Top
kurze Frage noch dazu:
kriegt man da irgendwie noch tausender Punkte mit rein?
Member: bastla
bastla Sep 09, 2008 at 06:29:59 (UTC)
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
Member: Iwan
Iwan Sep 09, 2008 at 07:52:00 (UTC)
Goto Top
super, klappt einwandfrei und sieht besser aus, danke face-wink
Member: chrizz-at
chrizz-at Sep 10, 2008 at 07:47:17 (UTC)
Goto Top
Ich danke euch recht herzlich! funktioniert einwandfrei!