' ****************************************************************************
' *                                                                          *
' *   VBSTREE.VBS speichert den Verzeichnisbaum des übergegebenen Ordners in *
' *   einer Textdatei.                                                       *
' *   Für Unterordner ruft sich das Programm rekursiv selbst auf.            *
' *                                                                          *
' *   Version:    1.0a final  (c) Tobias Jacobi 2000                         *
' *                                                                          *
' *   Stand:      04.06.2000                                                 *
' *                                                                          *
' ****************************************************************************


' ********************************* ALLGEMEINES ******************************

' ***** Variablendeklaration erzwingen *****

Option Explicit

' ***** Bei Fehlern fortfahren, benötigt für Ordner ohne Leserechte *****

On Error Resume Next

' ***** Konstanten und globale Variablen deklarieren bzw. vorbelegen *****

Const FensterTitel = """VBSTREE.VBS"" 1.0a final (c) Tobias Jacobi 2000", _
      ForAppending = 8

Dim WSHShell, FSO, Argumente, TempOrdner, AusgabeDateiName, AusgabeDatei, _
    Dummy, AktuellerOrdner, Zeile, LetzterOrdnerName

Set WSHShell     = WScript.CreateObject("WScript.Shell")
Set FSO          = CreateObject("Scripting.FileSystemObject")
Set Argumente    = WScript.Arguments
TempOrdner       = WSHShell.ExpandEnvironmentStrings("%TEMP%")
AusgabeDateiName = TempOrdner & "\VBStree.txt"


' ******************************** HAUPTPROGRAMM *****************************

' ***** Programm im Kontextmenü von Ordnern registrieren *****

WSHShell.RegWrite "HKCR\Folder\Shell\VBStree\Command\", _
                  "WScript.exe """ & WScript.ScriptFullname & """ ""%1"""
WSHShell.RegWrite "HKCR\Folder\Shell\VBStree\", "VBStree"

' ***** Wenn Anzahl Argumente nicht 1 oder 3, dann Hilfetext anzeigen *****

If Argumente.Count <> 3 AND Argumente.Count <> 1 Then
  Hilfetext
End If

' ***** Prüfen, ob das 1. Argument ein Ordner ist; wenn *****
' ***** ja, Variable AktuellerOrdner damit belegen      *****

If Not FSO.FolderExists(FSO.GetAbsolutePathname(Argumente(0))) Then
  MsgBox "FEHLER: Der angebebene Parameter ist kein Ordner." & vbCrLf & _
         "Das Programm wird beendet.", 48, FensterTitel
  WScript.Quit
Else
  Set AktuellerOrdner = FSO.GetFolder(Argumente(0))
End If

' ***** Wenn Anzahl Argumente gleich 3 ist, dann muss das   *****
' ***** 3. Argument "##INTERN##" sein; wurde nur 1 Argument *****
' ***** übergeben, muss die Ausgabedatei angelegt werdern   *****

If Argumente.Count = 3 Then
  If Argumente(2) <> "##INTERN##" Then
    MsgBox "FEHLER: Sie dürfen nur einen Parameter übergeben." & _
           vbCrLf & "Das Programm wird beendet.", 48, FensterTitel
    WScript.Quit
  End If
  Zeile = Argumente(1) & "  "
  Set AusgabeDatei = FSO.OpenTextFile(AusgabeDateiName, ForAppending)
Else
  Zeile = "  "
  WSHShell.PopUp "Die Daten werden zusammengestellt...", 2, _
                 FensterTitel, 4160
  ' ***** Problem mit langen Ordnernamen umgehen, Pfad schreiben *****
  Dummy = FSO.GetAbsolutePathName(AktuellerOrdner.Name)
  Dummy = FSO.GetParentFolderName(Dummy)
  If Dummy = "" Then Dummy = "\"
  Set AusgabeDatei = FSO.CreateTextFile(AusgabeDateiName, True)
  AusgabeDatei.WriteLine "[" & Dummy & "]"
End If

' ***** Dateinamen des übergebenen Ordners in Ausgabedatei *****

For Each Dummy in AktuellerOrdner.Files
  AusgabeDatei.WriteLine Zeile & "|- '" & Dummy.Name & "'"
Next

' ***** Namen des letzten Unterordners suchen und merken *****

For Each Dummy in AktuellerOrdner.SubFolders
  LetzterOrdnerName = Dummy.Name
Next

' ***** Namen der Unterordner in Ausgabedatei schreiben und   *****
' ***** dieses Programm mit dem jew. Unterordner als Argument *****
' ***** rekursiv aufrufen (3. Argument = "##INTERN##")        *****

For Each Dummy in AktuellerOrdner.SubFolders
  AusgabeDatei.WriteLine Zeile & "|  "
  AusgabeDatei.WriteLine Zeile & "|- [" & Dummy.Name & "]"
  AusgabeDatei.Close
  If Dummy.Name <> LetzterOrdnerName Then
    WSHShell.Run """" & WScript.ScriptFullname & """ """ & _
                 Argumente(0) & "\" & Dummy.Name & """ """ & _
                 Zeile & "|  "" ""##INTERN##""", , True
  Else
    WSHShell.Run """" & WScript.ScriptFullname & """ """ & _
                 Argumente(0) & "\" & Dummy.Name & """ """ & _
                 Zeile & "   "" ""##INTERN##""", , True
  End If
  Set AusgabeDatei = FSO.OpenTextFile(AusgabeDateiName, ForAppending)
Next
AusgabeDatei.Close

' ***** Falls nur 1 Argument übergeben wurde, war es kein rekursiver *****
' ***** Aufruf; dann Anzeige von Ausgabedatei anbieten               *****

If Argumente.Count = 1 Then
  If MsgBox("Der Verzeichnisbaum wurde in """ & AusgabeDateiName & """ " & _
            "gespeichert. Soll er zur Anzeige geöffnet werden?", 36, _
            FensterTitel) = 6 Then
    WSHShell.Run AusgabeDateiName
  End If
End If


' ******************************* UNTERPROGRAMME *****************************

Sub Hilfetext()
' ***** Hilfetext anzeigen und Programm beenden *****
  MsgBox "VBStree speichert den Verzeichnisbaum, der sich unterhalb des " & _
         "angegebenen Ordners befindet, in einer Textdatei im " & _
         "temporären Ordner (" & AusgabeDateiName & ") Ihres PCs ab." & _ 
         vbCrLf & "Bitte übergeben Sie dem Programm den Ordnernamen als " & _
         "Parameter beim Aufruf." & vbCrLf & vbCrLf & _
         "BEISPIEL:   VBStree.vbs ""C:\Eigene Dateien""" & vbCrLf & vbCrLf & _
         "Tip: Sie können VBStree auch über das Kontextmenü des " & _
         "betreffenden Ordners direkt aufrufen.", 64, FensterTitel
  WScript.Quit
End Sub
