waldgnarf
Goto Top

VBScript Dateien nach Ordner sortieren

Hallo, ich habe einen Script geschrieben der wenn der Dateinamen ohne Endung=Ordnername ist, die Dateien in den Ordner verschiebt.
Aber er verschiebt die zutreffenden Dateien nur wenn die den Name des ersten Ordners in der Liste haben.

Set FSO=CreateObject("Scripting.FileSystemObject")  
Set DATEIEN=FSO.GetFolder("C:\")  

For Each ORDNER In FSO.GetFolder("C:\New").Subfolders  
For Each DATEI in DATEIEN.Files
FSO.MoveFile "C:\" & ORDNER.Name & ".txt", ORDNER.Path & "\"  
Next
Next

Gruß waldgnarf

Content-Key: 94524

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

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

Member: bastla
bastla Aug 15, 2008 at 12:36:29 (UTC)
Goto Top
Hallo waldgnarf!

Zwei Schleifen sind hier zuviel des Guten (Du würdest damit ja jede Datei mit jedem Ordner kombinieren), daher:
Set FSO = CreateObject("Scripting.FileSystemObject")  
For Each ORDNER In fso.GetFolder("C:\New").Subfolders  
    DATEI = "C:\" & ORDNER.Name & ".txt"  
    If FSO.FileExists(DATEI) Then FSO.MoveFile DATEI, ORDNER.Path & "\"  
Next
Allerdings solltest Du noch berücksichtigen, dass "MoveFile" bestehende Dateien (oder auch Ordner mit dem gleichen Namen) nicht überschreiben kann, und daher vorweg eine Überprüfung mit "FileExists" und "FolderExists" für das Ziel sinnvoll wäre.

Grüße
bastla
Member: waldgnarf
waldgnarf Aug 15, 2008 at 16:19:57 (UTC)
Goto Top
Danke für deine Antwort.

Ich habe es so versucht aber er packt immernoch nur die im Alphabet erste Datei in ihren Ordner.

zum Beispiel so:

abc.txt -> verschieben in Ordner abc
abc.exe -> verschieben in Ordner abc

xyz.txt -> verschieben in Ordner xyz
xyz.exe -> verschieben in Ordner xyz
Member: bastla
bastla Aug 15, 2008 at 16:27:53 (UTC)
Goto Top
Hallo waldgnarf!

Dass keine .exe-Datei verschoben wird, ist klar, da (aufgrund Deines Beispiels) der Dateityp in Zeile 3 mit ".txt" vorgegeben ist - lässt sich aber leicht auf ".*" ändern; damit sollten dann aber alle Dateien erfasst werden, für die es entsprechende Ordner gibt.

Allerdings musst Du dann auf die Überprüfung, ob es eine passende Quelldatei gibt, verzichten und das Fehlen einer solchen durch ein "On Error" abfangen, also
On Error Resume Next
Set FSO = CreateObject("Scripting.FileSystemObject")  
For Each ORDNER In fso.GetFolder("C:\New").Subfolders  
    DATEI = "C:\" & ORDNER.Name & ".*"  
    FSO.MoveFile DATEI, ORDNER.Path & "\"  
Next

Die saubere Methode, und dann braucht's doch wieder die zweite Schleife, sähe so aus:
Set FSO = CreateObject("Scripting.FileSystemObject")  
For Each ORDNER In fso.GetFolder("C:\New").Subfolders  
    OrdnerName = LCase(Ordner.Name)
    For Each DATEI In fso.GetFolder("C:\").Files  
        If LCase(fso.GetBaseName(Datei)) = OrdnerName Then
            If FSO.FileExists(ORDNER.Path & "\" & DATEI.Name) Or _  
            FSO.FolderExists(ORDNER.Path & "\" & DATEI.Name) Then  
                WScript.Echo DATEI & " kann nicht verschoben werden!"  
            Else
                FSO.MoveFile DATEI, ORDNER.Path & "\"  
            End If
        End If
    Next
Next
Zum Testen empfiehlt es sich, mit
cscript //nologo "C:\Scriptpfad\Scriptname.vbs" 
zu starten - zumindest, wenn es bereits mehrere gleichnamige Dateien in den Zielordnern geben könnte (da bei Verwendung von "wscript" anstelle von "cscript" jede "WScript.Echo"-Anweisung als MsgBox ausgegeben wird) ...

Grüße
bastla

[Edit] Alternative Variante nachgetragen [/Edit]
Member: waldgnarf
waldgnarf Aug 15, 2008 at 23:44:46 (UTC)
Goto Top
Super, es funktioniert Danke sehr.

Gruß waldgnarf
Member: waldgnarf
waldgnarf Aug 17, 2008 at 12:03:38 (UTC)
Goto Top