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.
Gruß waldgnarf
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
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 94524
Url: https://administrator.de/contentid/94524
Ausgedruckt am: 20.11.2024 um 11:11 Uhr
5 Kommentare
Neuester Kommentar
Hallo waldgnarf!
Zwei Schleifen sind hier zuviel des Guten (Du würdest damit ja jede Datei mit jedem Ordner kombinieren), daher:
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
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
Grüße
bastla
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
Die saubere Methode, und dann braucht's doch wieder die zweite Schleife, sähe so aus:
Zum Testen empfiehlt es sich, mit
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]
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
cscript //nologo "C:\Scriptpfad\Scriptname.vbs"
Grüße
bastla
[Edit] Alternative Variante nachgetragen [/Edit]