phatair
Goto Top

Script gesucht zum Auflösen und Wiederherstellen von Ordner-Hierachien

Hallo zusammen,

ich suche ein script bzw. tool welches aus meheren Unterordnern die Dateien auf eine "Ebene" kopiert zum leichteren bearbeiten. Nach dem bearbeiten sollte es möglich sein die Daten wieder in die vorhandene Ordnerstruktur zurück zu kopieren.

Eine gute Beschreibung der Funktion ist dies:


Die Funktion "extrahiert" Dateien in Unterordnern bis zu einer definierbaren Ebene und leitet diese an einen nächsten Ordner flach für die Verarbeitung weiter. Diese Option eignet sich insbesondere für einen Workflow, bei dem in einem Überwachten Ordner mehrere Unterordner z.B. für bestimmte Mitarbeiter oder Kunden angelegt werden. Die Daten sollen aber "flach" durch den nächsten Arbeitsschritt laufen. Über die Funktion kann man die Daten nach der Bearbeitung wieder in die ursprüngliche Struktur ablegen lassen.

Leider ist das Programm wo die Beschreibung dazu gehört viel zu teuer und ich wäre euch super dankbar wenn ihr mir helfen könntet ein vergleichbares script oder tool zu finden.

Danke un dGruß

Content-ID: 61408

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

Ausgedruckt am: 24.11.2024 um 16:11 Uhr

bastla
bastla 15.06.2007 um 21:13:29 Uhr
Goto Top
Hallo phatair!

Eine 1:1-Umsetzung der gewünschten Funktionalität habe ich zwar nicht anzubieten, aber was das "flattening" anlangt, könnte vielleicht der folgende VB-Script-Entwurf eine Alternative darstellen:
'FlattenToWorkDir.vbs  
Const Arbeit = "Arbeit"  

Set WshShell = WScript.CreateObject("WScript.Shell")  
Set fso = CreateObject("Scripting.FileSystemObject")  
If WScript.Arguments.Count > 0 Then
    If fso.FolderExists(WScript.Arguments(0)) Then BasisPfad = WScript.Arguments(0)
End If
If BasisPfad = "" Then  
    Set Verzeichnis = CreateObject("Shell.Application") _  
        .BrowseForFolder(0, "Basisordner wählen", 16, 17)  
    If TypeName(Verzeichnis) = "Nothing" Then WScript.Quit(1)  
    Set Basis = Verzeichnis.Self
    BasisPfad = Basis.Path
End If
BasisPfad = fso.GetFolder(BasisPfad).Path
If Right(BasisPfad, 1) = "\" Then BasisPfad = Left(BasisPfad, Len(BasisPfad) - 1)  
ArbeitsPfad = BasisPfad & "\" & Arbeit  
If fso.FolderExists(ArbeitsPfad) Then
	On Error Resume Next
	fso.DeleteFile(ArbeitsPfad & "\*.lnk")  
	On Error Goto 0
Else
	fso.CreateFolder(ArbeitsPfad)
End If

DoSubFolders(fso.GetFolder(BasisPfad))
WScript.Echo "Verknüpfungen in Ordner " & Arbeitspfad & " erstellt."  
WScript.Quit

Sub DoSubFolders(Ordner)
For Each Unterordner In Ordner.Subfolders
	If LCase(Unterordner.Path) <> LCase(ArbeitsPfad) Then
		RelPath = Replace(Unterordner.Path, BasisPfad, "")  
		If Left(RelPath, 1) = "\" Then RelPath = Mid(RelPath, 2)  
		RelName = Replace(RelPath, "\", "-")  
		For Each Datei In Unterordner.Files
			Set objShellLink = WshShell.CreateShortcut(ArbeitsPfad & "\" & _  
      			 RelName & "_" & Datei.Name & ".lnk")  
			objShellLink.TargetPath = Datei.Path
			objShellLink.Save
		Next
		DoSubFolders(Unterordner)
	End If
Next
End Sub
Funktion:
Erstelle vom angegebenen Basis-Ordner ausgehend einen neuen Ordner "Arbeit" (Name definiert in "Const"-Zeile) und in diesem Arbeitsordner Links zu allen Dateien der Ordner unterhalb des Basisordners (noch ohne Einschränkung der Ordnertiefe).

Der Basisordner kann beim Aufruf des Scripts als Argument (um zB eine Verknüpfung für oft benötigte Basisordner zu erstellen) übergeben werden. Weiters ist es möglich, den Basisordner per Drag and Drop auf das Script zu ziehen. Wird das Script einfach per Doppelklick gestartet, kann der Basisordner in einem Dialog gewählt werden.

Ist der Arbeitsordner noch nicht vorhanden, wird dieser erstellt, anderenfalls werden alle darin enthaltenen Links gelöscht und neu eingefügt.

Den Links wird zur besseren Übersicht (und um Namenskollisionen vorzubeugen) der relative Ordnerpfad vorangestellt.

Im Unterschied zu der von Dir beschriebenen Funktionalität werden keine Kopien von Dateien erstellt, sondern es können immer die Originaldateien bearbeitet werden. Dadurch entfällt auch das abschließende "Zurückkopieren"/Synchronisieren.

Grüße
bastla
Biber
Biber 15.06.2007 um 22:49:01 Uhr
Goto Top
Moin Bastla,

mit dieser Strategie habe ich auch geliebäugelt (natürlich hätte ich das mit simplem Batch gemacht statt mit VBSkript).
Einziger nennenswerter Unterschied: Ich hätte mich für das "@" oder das "§"-Zeichen als Ersatz für den Backslash entschieden. Wegen der möglichen Probleme/Mehrdeutigkeiten beim Rückübersetzen.

Aber dann dachte ich - ähnlich wie Du es ja auch berücksichtigst - dass es nicht sinnvoll sein darf, auf/mit einer Kopie zu arbeiten. ("Es kann nur einen geben.., wie es so schön heißt.).

Meine Strategie wäre dann letzten Endes (im Batch), diese "neuen" Dateinamen, also z.B. "§Test§Sub§Ordner45§Datei.xyz" als Alias-Name für "\Test\Sub\Ordner45\Datei.xyz"
nur mit LinkD.exe (oder Konsorten) als verlinkte Datei in einem neuen Ordner bereitzustellen.

Also ein "echter" Dateilink statt eine Verknüpfung.
Somit würde definitiv immer auf dem Original gearbeitet werden.

Genau genommen habe ich mich nur zurückgehalten, weil ich Dir bei den exzellenten Erklärungen gerne den Vortritt lasse.

Grüße
Biber
bastla
bastla 15.06.2007 um 23:17:11 Uhr
Goto Top
@Biber
... den Vortritt lasse.
Woher wusstest Du, dass ich an dem Thema nicht vorbeikomme? face-wink

An Hardlinks hatte ich auch gedacht, da allerdings meines Wissens VBS keine native Unterstützung dafür bietet, zunächst der Versuch mit Softlinks - sollten eigentlich genügen (und sind vielleicht etwas leichter kommunizierbar face-wink), oder was meinst Du?

Auch "-" oder "_" als Trennzeichen dürften für Durchschnittsbenutzer etwas weniger irritierend sein (und eine Rückwandlung ist ohnehin nicht erforderlich).

Grüße
bastla
Biber
Biber 16.06.2007 um 00:27:52 Uhr
Goto Top
@bastla
Hast durchaus recht... Deine Lösung reicht vollkommen aus...

Mit diesen "echten" verlinkten Dateien, die bei M$ immer noch nicht vernüftig unterstützt werden, hatte ich ja gewisse Hoffnungen in Vi$ta gesetzt...
...na ja... so viele Hoffnungen ja auch nicht. *seufz*
Wieso sollte auch ein Betriebssystem nach kaum 20 Jahren Entwicklungsarbeit so etwas jetzt schon können...

Also - keine Einwände gegen Deine Strategie.
Nachvollziehbar, wartbar, gratis, sofort einsetzbar und effizient - wer sollte da noch verbessern wollen?

Grüße
Biber
bastla
bastla 16.06.2007 um 00:41:24 Uhr
Goto Top
@Biber

Merci. face-smile

Zu Deinen/meinen obigen Überlegungen hinzu käme vielleicht auch, dass Softlinks einen eher "temporären" Charakter haben sowie weniger Disziplin vom Anwender (Stichwort "löschen") verlangen.

Grüße
bastla