Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Unterordner auf Basis eines Teils des Dateinamens erstellen - Dateien da rein verschieben

Frage Entwicklung Batch & Shell

Mitglied: IchoTolot2

IchoTolot2 (Level 1) - Jetzt verbinden

21.07.2006, aktualisiert 15.11.2006, 10375 Aufrufe, 33 Kommentare

Hilfsfunktion zum Dateien sortieren

Hallo Leute,

ich habe folgendes Problem:
einen (na gut mehrere) Ordner mit (je) mehr als 10.000 Dateien drin.

Ich möchte eigentlich per Script (oder wenn es das gibt per Programm mit DAU-tauglicher-GUI für kleine Icho's) anhand der Dateinamen Ordner erstellen und die Dateien in diese Ordner verschieben.
Wichtig dabei wäre, dass die Anzahl der zu berücksichtigenden Zeichen festzulegen ist. im Beispiel X
Wünschenswert wäre noch eine Variable für die Anzahl der mindest vorhandenen Dateien (allerdings fürchte ich, das dadurch das Script für mich endgültig zu hoch werden würde) im Beispiel y

ein Beispiel
folgende Dateien:
000.jpg
abcs.jpg
gate1111.avi
gate1112.avi
gate1113.avi
pic000.jpg
pic1.jpg
pic237.jpg
picturegrabb.jpg
einfache Variante:
wenn ich eine Befehl mit der Variablen X=3 absetze sollte die Kiste mir folgende Ordner erstellen:
000
abc
gat
pic

und jeweils die Dateien in den Ordner verschieben.
geniale Variante:
wenn ich eine Befehl mit der Variablen X=3 und y=3 absetze sollte die Kiste mir folgende Ordner erstellen:

gat
pic

und jeweils die Dateien gat* und pic* in den Ordner verschieben.

Ich hoffe ich habe meine Wunschtraum einigermaßen verständlich rüber gebracht. Wäre Super wenn ich ein paar Tips für Lösungsansätze bekomme.

System ist übrigens Windows XP.

So jetzt gehe ich mal schlafen
Nice Day

Icho Tolot
33 Antworten
Mitglied: Biber
21.07.2006 um 11:00 Uhr
Moin Langschläfer,

kurze Skizze:
01.
::--------Snipp SortintoSubdDirs.bat 
02.
@echo off & setlocal EnableDelayedExpansion 
03.
If [%1]==[] %0 *.* 
04.
If [%2]==[] %0 %1 254 
05.
Echo %0:...gesetzte Parameter sind Dateifilter: [%1] Länge: [%2] 
06.
For /f %%i in ('dir /A:-d /b %1') do ( 
07.
       set "tmpv=%%i" 
08.
       echo Datei [%%i] soll in Verzeichnis [!tmpv:~0,%2!] 
09.
       If not exist "!tmpv:~0,%2!" ECHO ..existiert nicht... md !tmpv:~0,%2! 
10.
       If     exist "!tmpv:~0,%2!" ECHO ..verschiebe..     move "%%i" !tmpv:~0,%2!\*.* 
11.
)        
12.
::--------Snapp SortintoSubdDirs.bat 
13.
goto :eof 
14.
 
15.
Output beim Test (Die ganzen Simulations-Echos müssen natürlich rausgenommen werden...  
16.
>f:\sortintoSubdirs.bat w*.* 4 
17.
f:\sortintoSubdirs.bat:...gesetzte Parameter sind Dateifilter: [w*.*] Länge: [4] 
18.
Datei [w2rksupp.chm] soll in Verzeichnis [w2rk] 
19.
..existiert nicht... md w2rk 
20.
..verschiebe..     move "w2rksupp.chm" w2rk\*.* 
21.
Datei [Week.vbs] soll in Verzeichnis [Week] 
22.
..existiert nicht... md Week 
23.
..verschiebe..     move "Week.vbs" Week\*.* 
24.
Datei [werte.txt] soll in Verzeichnis [wert] 
25.
..existiert nicht... md wert 
26.
..verschiebe..     move "werte.txt" wert\*.* 
27.
Datei [WindowsXP-KB912919-x86-DEU.exe] soll in Verzeichnis [Wind] 
28.
..existiert nicht... md Wind 
29.
..verschiebe..     move "WindowsXP-KB912919-x86-DEU.exe" Wind\*.* 
30.
Datei [winguides_com_registryguide2003.exe] soll in Verzeichnis [wing] 
31.
..existiert nicht... md wing 
32.
..verschiebe..     move "winguides_com_registryguide2003.exe" wing\*.*
HTH Biber
Bitte warten ..
Mitglied: IchoTolot2
21.07.2006 um 12:06 Uhr
Hi Biber,

erstmal vielen Dank für die Super schnelle und gute Antwort.
Bin echt erstaunt was mit Batch alles geht, wenn man weiß was man tut.

So habe ich das Teil zum Laufen gebracht
01.
::--------Snipp SortDir.bat 
02.
@echo off & setlocal EnableDelayedExpansion 
03.
If [%1]==[] %0 *.* 
04.
If [%2]==[] %0 %1 254 
05.
Echo %0:...gesetzte Parameter sind Dateifilter: [%1] Länge: [%2] 
06.
For /f %%i in ('dir /A:-d /b %1 %2') do ( 
07.
       set "tmpv=%%i" 
08.
       echo Datei [%%i] soll in Verzeichnis [!tmpv:~0,%2!] 
09.
       If not exist "!tmpv:~0,%2!" ECHO ..existiert nicht... md !tmpv:~0,%2! 
10.
       If     exist "!tmpv:~0,%2!" ECHO ..verschiebe..        move !tmpv:~0,%2!%1 !tmpv:~0,%2! 
11.
)        
12.
::--------Snapp SortDir.bat 
13.
goto :eof
Schmeißt zwar massen an Fehlermeldungen aber es geht.
Deine Variante wollte irgendwie nicht mit Dateien die Leerzeichen enthalten zusammenarbeiten.

Für die geniale Variante werde ich vermutlich nicht an einem WSH-Script o.ä. vorbei kommen.

Liebe Grüße und Nice Day
Icho Tolot
Bitte warten ..
Mitglied: Biber
21.07.2006 um 12:39 Uhr
Moin Icho Tolot,

Schmeißt zwar massen an Fehlermeldungen aber es geht.
Ja und? Erwartete Fehler lassen sich doch abfangen. Egal ob Batch oder WSH oder C#.

Deine Variante wollte irgendwie nicht mit Dateien die Leerzeichen enthalten zusammenarbeiten.
Das halte ich für ein lösbares Problem.
Bei mir bekomme ich das weg ..
01.
>f:\sortintoSubdirs.bat 
02.
f:\sortintoSubdirs.bat:...gesetzte Parameter sind Dateifilter: [*langername1.*] Länge: [4] 
03.
Datei [test langername1.txt] soll in Verzeichnis [test] 
04.
..existiert nicht... md test 
05.
..verschiebe..     move "test langername1.txt" test\*.*
...durch die Änderung der For-Schleifen-Parameter in:
...
For /f "tokens=1* delims=" %%i in ('dir /A:-d /b "%1"') do (
...
Und die Meldung "Datei nicht gefunden" beim DIR-Befehle lässt sich mit "2>nul" entsorgen.

Du wolltest doch nur einen Denkanstoss, kein schlüsselfertiges Produktiv-Programm.


Für die geniale Variante werde ich vermutlich nicht an einem WSH-Script o.ä. vorbei kommen.
Na, dann lese ich mal gespannt weiter mit.
Bitte warten ..
Mitglied: IchoTolot2
22.07.2006 um 01:01 Uhr
so, ich habe jetzt mal die einfache Variante einigermaßen als VBScript hin bekommen.

hier das Ergebnis:

01.
'Sortiert Dateien in Unterverzeichnisse 
02.
 
03.
Set WSHShell = WScript.CreateObject("WScript.Shell") 
04.
Set fso      = WScript.CreateObject("Scripting.FileSystemObject") 
05.
set oArgs    = Wscript.Arguments  
06.
 
07.
If oArgs.Count > 0 Then                      ' gibt es Argumente?  
08.
  Pfad = oArgs.item(0)                       ' erstes Argument  
09.
 
10.
  if fso.FileExists( Pfad ) then Pfad = fso.GetParentFolderName( Pfad )  
11.
     ' obige Zeile wird nur ausgeführt, wenn "Pfad" eine Datei ist 
12.
 
13.
Else                                         ' es gibt keine Argumente! 
14.
  Pfad = fso.GetFolder( "." )                ' Verzeichnis, in dem sich das Skript befindet 
15.
End If  
16.
  
17.
if not fso.FolderExists( Pfad ) then 
18.
  MsgBox UCase(Pfad) & "   existiert nicht!" & vbCRLF & vbCRLF & " . . . das ist das Ende.", , WScript.ScriptName 
19.
  WScript.Quit 
20.
End If 
21.
 
22.
'	DFilte = "*.*"	bisher ungenutzt 
23.
	Laenge = 4		'später über InputBox oder Argument 
24.
'	Anzahl = 5		bisher ungenutzt 
25.
 
26.
 
27.
' Dateiliste an Array übergeben 
28.
' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
29.
i = 0 
30.
Set oFolders = fso.GetFolder( Pfad )   
31.
Set oFiles   = oFolders.Files 
32.
  For Each DateiX In oFiles 
33.
    ReDim Preserve Datei(i) 
34.
                   Datei(i) = DateiX.Name  
35.
    i = i + 1 
36.
  Next 
37.
Set oFiles   = nothing 
38.
Set oFolders = nothing 
39.
 
40.
'Verarbeitung 
41.
If i > 0 then                                ' wenn es Datei(en) gibt  
42.
  For i = 0 to UBound( Datei ) 
43.
	NPfad = Left(Datei(i),Laenge) 
44.
	If (fso.FolderExists(NPfad)) Then 
45.
		fso.MoveFile Datei(i), Pfad & "\" & NPfad & "\" 
46.
	else 
47.
		fso.CreateFolder Pfad & "\" & NPfad 
48.
		fso.MoveFile Datei(i), Pfad & "\" & NPfad & "\" 
49.
	end if 
50.
  Next 
51.
End If
An der genialen Variante grübel ich derzeit noch ohne große Ideen

Gute Nacht

Icho Tolot
Bitte warten ..
Mitglied: IchoTolot2
23.07.2006 um 12:39 Uhr
Guten Morgen,

die geniale Variante habe ich jetzt auch zum Laufen gebracht.

Falls es jemand nachbauen will:

1. Schritt: Aus dem Dateilistenarray ein Array mit den Pfadnamen generieren

01.
  For i = 0 to UBound( Datei ) 
02.
	NPfad = Trim(Left(Datei(i),Laenge)) 
03.
	ReDim Preserve UPfad(i) 
04.
	               UPfad(i) = NPfad 
05.
  Next

2. Schritt: Die Anzahl der gleichen Pfade zählen

01.
  FZaehler = 0 
02.
  y = 0 
03.
  XPfad = LCase(UPfad(y)) 
04.
  For i = 0 to UBound( UPfad ) 
05.
	if LCase(UPfad(i)) = XPfad then 
06.
		FZaehler = FZaehler + 1 
07.
	else 
08.
		ReDim Preserve YPfad(y)	 
09.
		               YPfad(y) = XPfad 
10.
		ReDim Preserve YZaehl(y) 
11.
		               YZaehl(y) = FZaehler 
12.
		XPfad = LCase(UPfad(i)) 
13.
		FZaehler = 1 
14.
		y = y + 1 
15.
	end if 
16.
  Next 
17.
'fuers letzte Verzeichnis 
18.
  If FZaehler > 1 then 
19.
		ReDim Preserve YPfad(y)	 
20.
		               YPfad(y) = XPfad 
21.
		ReDim Preserve YZaehl(y) 
22.
		               YZaehl(y) = FZaehler 
23.
		y = y + 1 
24.
  end if

3. Schritt: Wenn die Anzahl der Dateien >= der Mindestanzahl sind ein Verzeichnis anlegen

01.
For y = 0 to UBound( YPfad ) 
02.
	if YZaehl(y) >= Anzahl then 
03.
		If (fso.FolderExists(Pfad & "\" & YPfad(y))) = false Then 
04.
			fso.CreateFolder Pfad & "\" & YPfad(y) 
05.
		end if 
06.
	end if 
07.
Next

4. Schritt: Dateien verschieben wenn das zugehörige Unterverzeichnis existiert

01.
For i = 0 to UBound( Datei ) 
02.
	If (fso.FolderExists(UPfad(i))) Then 
03.
		if (fso.FileExists(Pfad & "\" & UPfad(i) & "\" & Datei(i))) = false then 
04.
			fso.MoveFile Pfad & "\" & Datei(i), Pfad & "\" & UPfad(i) & "\" 
05.
		end if 
06.
	end if 
07.
Next

Problem: Keine Dateifilter


Das Einzige wofür ich noch keine Lösung gefunden habe ist eine Möglichkeit der Dateifilterung wie *.avi, p*.jpg oder ähnliches.
Gibt es da Möglichkeiten und wenn ja wie schauen die aus?



Vielen Dank für die Hilfe
Icho Tolot
Bitte warten ..
Mitglied: Biber
20.08.2006 um 16:17 Uhr
Moin Icho Talot,

vielen Dank für das Posten der genialen Varianten.
Hast Du denn das letzte Teilproblem inzwischen auch gefixt?
Oder wartest Du noch auf Antworten?

If so, dann poste doch mal bitte Deinen Code-Schnipsel ein bloc ...ist sonst etwas mühsam, sich das zusammenzustoppeln.
(jedenfalls für ältere Biber wie mich )

Wenn Frage erledigt sein sollte, dann setze bitte den Beitrag auf gelöst.

Oder, noch eine "geniale Variante" mehr - wir fixen den Rest auch noch und stufen es um als Tutorial.

Gruß
Biber
Bitte warten ..
Mitglied: IchoTolot2
28.08.2006 um 17:22 Uhr
Hallo Biber und Rest der Welt,
hier erstmal der Code in Block inkl. dem HTML-Logfile:

01.
'Sortiert Dateien in Unterverzeichnisse 
02.
Dim Log  
03.
 
04.
 
05.
Set WSHShell = WScript.CreateObject("WScript.Shell") 
06.
Set fso      = WScript.CreateObject("Scripting.FileSystemObject") 
07.
Set oArgs    = Wscript.Arguments  
08.
 
09.
 
10.
 
11.
If oArgs.Count > 0 Then  
12.
  Pfad = oArgs.item(0)                       ' erstes Argument  
13.
 
14.
  if fso.FileExists( Pfad ) then Pfad = fso.GetParentFolderName( Pfad )  
15.
     ' obige Zeile wird nur ausgeführt, wenn "Pfad" eine Datei ist 
16.
 
17.
else  
18.
	Pfad = OrdnerWahl() 
19.
end if 
20.
 
21.
if not fso.FolderExists( Pfad ) then 
22.
  MsgBox UCase(Pfad) & "   existiert nicht!" & vbCRLF & vbCRLF & " . . . das ist das Ende.", , WScript.ScriptName 
23.
  WScript.Quit 
24.
End If 
25.
 
26.
'	DFilte = InputBox("Bitte geben Sie einen Dateifilter an!","Dateifilter","*.*") 
27.
'Bis jetzt keine mit vernünftigem Aufwand realisierbare Variante gefunden 
28.
 
29.
	Laenge = InputBox("Bitte geben Sie die Anzahl der zu berücksichtigenden Zeichen des Dateinamens an!","Dateifilter",8) 
30.
	If Laenge = "" Then 
31.
	 	WScript.Quit 
32.
	ElseIf IsNumeric(Laenge) = False then 
33.
		WScript.Quit 
34.
	ElseIf Laenge > 256 then 
35.
		WScript.Quit 
36.
	Else 
37.
		Laenge = CByte(Laenge) 
38.
	End If 
39.
	Anzahl = InputBox("Bitte geben Sie die Mindestanzahl an Dateien an!","Dateifilter",11) 
40.
	If Anzahl = "" Then 
41.
	 	WScript.Quit 
42.
	ElseIf IsNumeric(Anzahl) = False then 
43.
		WScript.Quit 
44.
	ElseIf Anzahl > 256 then 
45.
		WScript.Quit 
46.
	Else 
47.
		Anzahl = CByte(Anzahl) 
48.
	End If 
49.
	Log    = MsgBox("Logdatei erstellen?", vbYesNo, "Logging") 
50.
  
51.
' Dateiliste an Array übergeben 
52.
' ----------------------------- 
53.
i = 0 
54.
Set oFolders = fso.GetFolder( Pfad )   
55.
Set oFiles   = oFolders.Files 
56.
  For Each DateiX In oFiles 
57.
    ReDim Preserve Datei(i) 
58.
                   Datei(i) = DateiX.Name  
59.
    i = i + 1 
60.
  Next 
61.
Set oFiles   = nothing 
62.
Set oFolders = nothing 
63.
If i = 0 then 
64.
  MsgBox "Keine Dateien in " & UCase(Pfad) & vbCRLF & vbCRLF & " . . . das ist das Ende.", , WScript.ScriptName 
65.
  WScript.Quit 
66.
End If 
67.
 
68.
'Log HTML starten 
69.
'--------------- 
70.
if Log = 6 then 
71.
	if month(now)<10 then Monat = "0" & month(now) else Monat = month(now) 
72.
	if day(now)<10 then Tag = "0" & day(now) else Tag = day(now) 
73.
	if hour(now)<10 then Stunde = "0" & hour(now) else Stunde = hour(now) 
74.
	if minute(now)<10 then Minuten = "0" & minute(now) else Minuten = minute(now) 
75.
	Dateiname = "SortDir " & year(now) & "-" & Monat & "-" & Tag & "h" & Stunde & "m" & Minuten 
76.
	LogDatei = HTMLKopf(Pfad, Dateiname, Laenge, Anzahl, i) 
77.
end if 
78.
 
79.
'Muster : if Log = 6 then HTMLLog LogDatei, "Ordner", "mag ich nicht sagen", "erstellt" 
80.
 
81.
 
82.
 
83.
'Array mit dem zukünftigen Pfad bilden 
84.
'------------------------------------- 
85.
' hier könnte man noch eine Syntaxkontrolle einbauen 
86.
 
87.
  For i = 0 to UBound( Datei ) 
88.
	NPfad = Trim(Left(Datei(i),Laenge)) 
89.
	ReDim Preserve UPfad(i) 
90.
	               UPfad(i) = NPfad 
91.
  Next 
92.
 
93.
'Neues Array mit dem Pfad und eines Mit der Anzahl der Dateien bilden 
94.
'-------------------------------------------------------------------- 
95.
  FZaehler = 0 
96.
  y = 0 
97.
  XPfad = UPfad(y) 
98.
  For i = 0 to UBound( UPfad ) 
99.
	if StrComp(UPfad(i), XPfad , 1) = 0 then 
100.
		FZaehler = FZaehler + 1 
101.
	else 
102.
		ReDim Preserve YPfad(y)	 
103.
		               YPfad(y) = XPfad 
104.
		ReDim Preserve YZaehl(y) 
105.
		               YZaehl(y) = FZaehler 
106.
		XPfad = UPfad(i) 
107.
		FZaehler = 1 
108.
		y = y + 1 
109.
	end if 
110.
  Next 
111.
'fuers letzte Verzeichnis 
112.
  If FZaehler > 1 then 
113.
		ReDim Preserve YPfad(y)	 
114.
		               YPfad(y) = XPfad 
115.
		ReDim Preserve YZaehl(y) 
116.
		               YZaehl(y) = FZaehler 
117.
		y = y + 1 
118.
  end if 
119.
 
120.
'Ordner erstellen wenn die Mindestanzahl an Dateien erfüllt ist 
121.
'-------------------------------------------------------------- 
122.
For y = 0 to UBound( YPfad ) 
123.
	if YZaehl(y) >= Anzahl then 
124.
		If (fso.FolderExists(Pfad & "\" & YPfad(y))) = false Then 
125.
			fso.CreateFolder Pfad & "\" & YPfad(y) 
126.
			if Log = 6 then HTMLLog LogDatei, "Ordner", YPfad(y), "<font color=green>Verzeichnis erstellt</font>" 
127.
		else 
128.
			if Log = 6 then HTMLLog LogDatei, "Ordner", YPfad(y), "<font color=red>nicht erstellt: Verzeichnis bereits vorhanden</font>" 
129.
		end if 
130.
	else 
131.
'		if Log = 6 then HTMLLog LogDatei, "Ordner", YPfad(y), "nicht erstellt: nur " & YZaehl(y) & " Dateien" 
132.
	end if 
133.
Next 
134.
 
135.
'Verschieben der Dateien falls ein Ordner existiert 
136.
'-------------------------------------------------- 
137.
'Ich nehme absichtlich das alte Dateilisting, damit eine evtl. Logdatei oder zwischenzeitlich hinzu gekommene Dateien nicht angefasst werden 
138.
'UPfad wird deswegen an Stelle von Len(Datei(i),Laenge) verwendet damit evtl. syntaxkorrekturen berücksichtigt werden 
139.
For i = 0 to UBound( Datei ) 
140.
	If (fso.FolderExists(Pfad & "\" & UPfad(i))) Then 
141.
		if (fso.FileExists(Pfad & "\" & UPfad(i) & "\" & Datei(i))) = false then 
142.
			fso.MoveFile Pfad & "\" & Datei(i), Pfad & "\" & UPfad(i) & "\" 
143.
			if Log = 6 then HTMLLog LogDatei, "Datei", Datei(i), "<font color=green>verschoben nach: " & UPfad(i) & "</font>" 
144.
		else 
145.
			if Log = 6 then HTMLLog LogDatei, "Datei", Datei(i), "<font color=red>bereits im Unterordner <b>" & UPfad(i) & "</b> vorhanden</font>" 
146.
		end if 
147.
	else 
148.
'		if Log = 6 then HTMLLog LogDatei, "Datei", Datei(i), "nicht verschoben" 
149.
	end if 
150.
Next 
151.
 
152.
'Log HTML beenden 
153.
'--------------- 
154.
if Log = 6 then 
155.
	HTMLFuss LogDatei 
156.
end if 
157.
 
158.
Set WSHShell = nothing 
159.
Set fso      = nothing 
160.
Set oArgs    = nothing 
161.
 
162.
WScript.Quit 
163.
 
164.
function OrdnerWahl() 
165.
'Zeigt den Select Folder Dialog an 
166.
	set shell = CreateObject("Shell.Application") 
167.
	AuswahlTitel = "Geben Sie das Verzeichnis an in dem Sortiert werden soll" 
168.
	StartOrdner = 17 
169.
	Set retVal = shell.BrowseForFolder(0,AuswahlTitel, &H200,StartOrdner) 
170.
	set parent = retVal.ParentFolder 
171.
	set Rpath = parent.items 
172.
	for each item in Rpath 
173.
		if item.Name = retVal.Title then PfadName = item.Path 
174.
	next 
175.
	OrdnerWahl = PfadName 
176.
	set shell = nothing 
177.
	set retVal = nothing 
178.
	set parent = nothing 
179.
	set RPath = nothing 
180.
end function 
181.
 
182.
function HTMLKopf(Pfad, Dateiname, Laenge, Anzahl, Dateianzahl) 
183.
'erstellt die Logdatei und erfasst die Kopfdaten der HTML-Datei. 
184.
'Gibt die Datei zurück falls Änderungen auftreten sowie für die übrigen HTML-Funktionen 
185.
	Endung = ".htm" 
186.
	sPath = Pfad & "\" & Dateiname & Endung 
187.
	d = 1 
188.
	do while fso.FileExists( sPath ) 
189.
		Dateiname = Dateiname & "-" & d 
190.
		sPath = Pfad & "\" & Dateiname & Endung	 
191.
		d = d + 1 
192.
	loop 
193.
	Set LogFile = fso.OpenTextFile(sPath, 8, true, -2) 
194.
	LogFile.Write("<html>" & vbCrLf & "<head>" & vbCrLf & "<title>LogFile SortDir-Skript</title>" & vbCrLf & "</head>" & vbCrLf & _ 
195.
			"<body>" & vbCrLf & "<h3>&Uuml;bergebene Parameter:</h3>" & vbCrLf & "<table bolder=0>" & vbCrLf & _ 
196.
			"<tr><td align=right><b>Pfad:&nbsp;</b></td><td>" & Pfad & "</td></tr>" & vbCrLf & _ 
197.
			"<tr><td align=right><b>Filter:&nbsp;</b></td><td>" & "*.* (derzeit nicht anders M&ouml;glich)" & "</td></tr>" & vbCrLf & _ 
198.
			"<tr><td align=right><b>Zeichen des Dateinamens:&nbsp;</b></td><td>" & Laenge & "</td></tr>" & vbCrLf & _ 
199.
			"<tr><td align=right><b>Mindestanzahl der Dateien:&nbsp;</b></td><td>" & Anzahl & "</td></tr>" & vbCrLf & _ 
200.
			"<tr><td align=right><b>Anzahl zu pr&uuml;fender Dateien:&nbsp;</b></td><td>" & Dateianzahl & "</td></tr>" & vbCrLf & _ 
201.
			"</table>" & vbCrLf & "<p>Folgende &Auml;nderungen wurden vorgenommen:</p>" & vbCrLf & "<table border=1 width=90% align=center>" & vbCrLf & _ 
202.
			"<tr><th>Zeit</th><th>Typ</th><th>Name</th><th>Ereignis</th></tr>" & vbCrLf & _ 
203.
			"<tr><td align=center>" & now & "</td><td colspan=2 align=center>&nbsp;</td><td>Lauf-Beginn</td></tr>" & vbCrLf) 
204.
	LogFile.close 
205.
	set LogFile = nothing 
206.
	HTMLKopf = sPath 
207.
end function 
208.
 
209.
function HTMLLog(LogDatei, Typ, Name, Ereignis) 
210.
'erfasst einen Tabelleneintrag der HTML-Datei. 
211.
	Set LogFile = fso.OpenTextFile(LogDatei, 8, true, -2) 
212.
	LogFile.Write("<tr><td align=center>" & now & "</td><td align=center>" & Typ & "</td><td>" & Name & "</td><td>" & Ereignis & "</td></tr>" & vbCrLf) 
213.
	LogFile.close 
214.
	set LogFile = nothing 
215.
end function 
216.
 
217.
function HTMLFuss(LogDatei) 
218.
'erfasst die Fußdaten der HTML-Datei. 
219.
	Set LogFile = fso.OpenTextFile(LogDatei, 8, true, -2) 
220.
	LogFile.Write("<tr><td align=center>" & now & "</td><td colspan=2 align=center>&nbsp;</td><td>Lauf-Ende</td></tr>" & vbCrLf & _ 
221.
			"</table></body></html>") 
222.
	LogFile.close 
223.
	set LogFile = nothing 
224.
end function
Das Problem mit dem Dateifilter ist noch nicht gelöst.

Am Code wären noch einige Schönheitsoperationen (ein statt mehrere Arrays u.ä.) notwendig, aber setze ich mich auseinander wenn es mal Komplett läuft.

So genug Text für heute (ich habe ja den ganzen Code abgetippt ).

Nice Day
IchoTolot
Bitte warten ..
Mitglied: n4426
10.09.2006 um 17:46 Uhr
Hi Biber,

ist es möglich das script von Dir so zu ändern, das es die Länge des Namens des Ordners nicht aus einer festen Zeichenzahl (z.B. 5) sondern aus einem Trennzeichen (z.B. "-" )?

oder geht das mit dem Script nicht so einfach?

Mit freundlichen Grüßen
andi
Bitte warten ..
Mitglied: Biber
11.09.2006 um 00:07 Uhr
Moin n4426,

ließe sich natürlich auch machen... wenn es für so etwas Anforderungen gibt?

Angenommen ich hätte meine Datei z.B. jahrweise nach dem Muster 2005-bla.* und 2006-blubb.* benannt, dann könnte ich die in Unterverzeichnisse 2005 und 2006 sortieren wollen.

Skizze:
01.
::--------Snipp SortintoSubDirs2.bat 
02.
@echo off & setlocal EnableDelayedExpansion 
03.
If [%1]==[] %0 *.* 
04.
Set /a maxlen=8  
05.
Echo %0:...gesetzt Dateifilter: [%1]; Trennzeichen: [%2] 
06.
For /f %%i in ('dir /A:-d /b "%1" ^2^>nul') do call :moveIt %%i %2 
07.
goto :eof 
08.
~~~~~~~ 
09.
:moveIt parameter1: Dateiname para2: Trennzeichen 
10.
set "tmpv=%1" & set /a pos=0 
11.
For /L %%a in (1,1,%maxlen%) do if !pos!== 0 call :getpos %1 %%a %2 
12.
If %Pos%==0 goto :eof 
13.
set tmpv=!tmpv:~0,%pos%! 
14.
echo Datei [%1] soll in Verzeichnis [%tmpv%] 
15.
If not exist "%tmpv%" ECHO ..existiert nicht... md %tmpv% ...move "%1" %tmpv%\*.* 
16.
If     exist "%tmpv%" ECHO ..verschiebe..     move "%1" %tmpv%\*.* 
17.
goto :eof 
18.
~~~~~~~ 
19.
:getpos Para1: textstring; Para2: aktuelle Pos; Para3: gesuchtes Zeichen 
20.
 set str=%1 
21.
 If "!str:~%2,1!"=="%3" Set Pos=%2 
22.
::--------Snapp SortintoSubDirs2.bat
Test am CMD-Prompt:
01.
$cmd$l:\SortIntoSubDirs2 d:\temp\*-*.* - 
02.
l:\SortIntoSubDirs2:...gesetzt Dateifilter: [d:\temp\*-*.*]; Trennzeichen: [-] 
03.
Datei [2005-08-17Outlook.rwz] soll in Verzeichnis [2005] 
04.
..existiert nicht... md 2005 ...move "2005-08-17Outlook.rwz" 2005\*.* 
05.
Datei [2005-12-11SpywareDoc.htm] soll in Verzeichnis [2005] 
06.
..existiert nicht... md 2005 ...move "2005-12-11SpywareDoc.htm" 2005\*.*
...falls ich Dich richtig verstanden habe.
Sonst musst Du mal ein genaueres Beispiel posten.

Gruß
Biber
[Edit]
P.S. Ich habe das jetzt nicht getestet bzw. angepasst für "Dateinamen mit Leerzeichen.xyz". Würde sicher noch nicht funktionieren.
P.P.S. Und auch die Anweisung For /L %%a in (1,1,%maxlen%) do könnte noch angepasst werden, weil es ja vielleicht nicht sinnvoll ist, ab Zeichen 1 zu suchen nach dem Trennzeichen. Falls ich meine Dateien mit "YYYY-MM-TTdateiname.xyz" sortieren will in Monats-Ordner z.B "2005-07" etc., dann würde ich die Anweisung ändern auf For /L %%a in (5,1,%maxlen%) do... oder die "AbStartPos" auch als Parameter übergeben.
[/Edit]
Bitte warten ..
Mitglied: n4426
12.09.2006 um 16:06 Uhr
Hi Biber,

erstmal Danke, ich habs aber leider nich zum laufen bekommen.

Also, ich möchte folgendes machen.

Ich hab ein Verzeichniss, wo mp3-Datein abgelegt sind. Diese liegen zurzeit alle in einem Ordner.

Interpret - Titel.mp3
Interpret - Titel2.mp3
Interpret2 - Titel3.mp3
Interpret3 - Titel4.mp3
Interpret3 - Titel5.mp3
...

um jetzt schneller die Titel zu finden, möchte ich die Dateien je nach Interpreten in unterverzeichnisse verschieben.

Interpret
.. Interpret - Titel.mp3
.. Interpret - Titel2.mp3
Interpret2
.. Interpret2 - Titel3.mp3
Interpret3
.. Interpret3 - Titel4.mp3
.. Interpret3 - Titel5.mp3

kannst du mir dabei helfen (alle Ordner per Hand erstellen und die Dateinen verschieben ist ja ein ewigkeitswerk).

Mit freundlichen Grüßen
andi
Bitte warten ..
Mitglied: Biber
12.09.2006 um 16:47 Uhr
Moin andi,

dafür brauchst Du keinen Batch, das ist nur eine Zeile.
Wenn das so stimmt:
Ich hab ein Verzeichniss, wo mp3-Datein abgelegt sind. Diese liegen zurzeit alle in einem Ordner.

Und wenn alle Dateien vor dem ersten Bindestrich den Interpreten stehen haben.

Beispiel (habe mir ein Spielverzeichnis "F:\mpgs" angelegt)
01.
(=16:35:43  F:\=) 
02.
>dir /b f:\mpgs\*.mp3 
03.
Interpret5 - Titel2.mp3 
04.
Interpret5 - Titel5.mp3 
05.
Interpret4 - Titel1.mp3 
06.
Interpret1 - Titel22.mp3 
07.
Interpret1 - Titel11.mp3 
08.
 
09.
(=16:40:16  F:\=) 
10.
>for %i in (f:\mpgs\*-*.mp3) do @for /f "delims=- " %a in ("%~ni") do @echo xcopy /Y "%i" "f:\newRoot\%a\" 
11.
xcopy /Y "f:\mpgs\Interpret5 - Titel2.mp3" "f:\newRoot\Interpret5\" 
12.
xcopy /Y "f:\mpgs\Interpret5 - Titel5.mp3" "f:\newRoot\Interpret5\" 
13.
xcopy /Y "f:\mpgs\Interpret4 - Titel1.mp3" "f:\newRoot\Interpret4\" 
14.
xcopy /Y "f:\mpgs\Interpret1 - Titel22.mp3" "f:\newRoot\Interpret1\" 
15.
xcopy /Y "f:\mpgs\Interpret1 - Titel11.mp3" "f:\newRoot\Interpret1\" 
16.
(=16:40:26  F:\=)
Streiche das @echo vor dem XCopy-Befehl und ändere Quellverzeichnis (="f:\mpgs") und Ziel ("f:\NewRoot") und schieß die Zeile ab.
Und falls Du die Dateien nicht kopieren, sondern de facto verschieben willst, dann häng noch ein [ && del "%i"] dran.
01.
for %i in (f:\mpgs\*-*.mp3) do @for /f "delims=- " %a in ("%~ni") do @(echo xcopy /Y "%i" "f:\newRoot\%a\") && @echo del "%i" 
02.
xcopy /Y "f:\mpgs\Interpret5 - Titel2.mp3" "f:\newRoot\Interpret5\" 
03.
del "f:\mpgs\Interpret5 - Titel2.mp3" 
04.
xcopy /Y "f:\mpgs\Interpret5 - Titel5.mp3" "f:\newRoot\Interpret5\" 
05.
del "f:\mpgs\Interpret5 - Titel5.mp3" 
06.
xcopy /Y "f:\mpgs\Interpret4 - Titel1.mp3" "f:\newRoot\Interpret4\" 
07.
del "f:\mpgs\Interpret4 - Titel1.mp3" 
08.
xcopy /Y "f:\mpgs\Interpret1 - Titel22.mp3" "f:\newRoot\Interpret1\" 
09.
del "f:\mpgs\Interpret1 - Titel22.mp3" 
10.
xcopy /Y "f:\mpgs\Interpret1 - Titel11.mp3" "f:\newRoot\Interpret1\" 
11.
del "f:\mpgs\Interpret1 - Titel11.mp3"
[Natürlich auch hier beide "@echo"s rauslöschen, wenn es getestet ist.

Gruß
Biber
erstmal Danke, ich habs aber leider nich zum laufen bekommen.
Das liegt sicherlich an der "set maxlen=8" in meinem Batch oben und vor allem an den Leerzeichen in Deinen *.mp3s.
Aber wäre dafür sowieso die falsche Strategie gewesen.
Bitte warten ..
Mitglied: n4426
12.09.2006 um 19:29 Uhr
Danke Biber,

funktioniert prima.

Hat zwar ein bisschen gedauchert, bis ich draufgekommen bin, das man das ganze in Eingebeauforderung eingeben muss und nicht als CMD-Datei laufen lassen kann.
Bitte warten ..
Mitglied: Biber
12.09.2006 um 20:43 Uhr
@n4426
...na, ich hab doch gesagt, dass es nicht nicht lohnt, für eine Zeile einen Batch zu schreiben...

Aber sicherheitshalber nochmal beiden Varianten:
Zum Testen am CMD-Prompt eintippen:
01.
for %i in (f:\mpgs\*-*.mp3) do @for /f "delims=- " %a in ("%~ni") do @(echo xcopy /Y "%i" "f:\newRoot\%a\") && @echo del "%i"
wobei f:\mpgs das Verzeichnis mit den Quelldateien ist----------> von denen werden nur die mit den Namen "*-*.mp3" angefasst!
und f:\NewRoot das Verzeichnis ist, unterhalb dem diese neue Struktur mit "InterpretX" aufgebaut werden soll.

Auch wenn ich mich wiederholen sollte: in Deinem konkreten Fall reicht das einmalige Abfeuern vom Prompt aus

Falls jemand meint, es wäre als Batch erhaltenswert, weil man/frau es ja öfters brauchen könnte, dann
als Batch-Version mit zwei Parametern Quellverzeichnis und Zielverzeichnis-Root...
01.
for %%i in (%1\*-*.mp3) do @for /f "delims=- " %%a in ("%%~ni") do @(echo xcopy /Y "%%i" "%2\%%a\") && @echo del "%%i"
Beide Varianten machen nur ein "echo" von dem, was eigentlich abgehen soll.
Wer es verstanden und "trocken" zum Laufen gebracht hat in der eigenen Umgebung, der muss jeweils das Wort "echo" bzw. "@echo" löschen.

So, nach diesem kurzen Exkurs möchte ich aber noch auf das auch noch offene Problem von Icho Tolot hinweisen... siehe etwas tiefer im Thread.
Kurzgefasst: wie kann ich unaufwändig FileMasks und Patterns in einer VBS-Datei-Auswahl implementieren?
Gab es da nicht auch ein RegExp-Object bei M$? Das riecht doch nach Regular Expressions.. keiner hier, der programmieren kann?

Gruß
Biber
Bitte warten ..
Mitglied: Herby-z
25.09.2006 um 11:53 Uhr
Hallo,

ich hoffe Ihr könnt mir weiterhelfen.
Habe mir das alles bereits durchgelesen aber komme trotzdem nicht weiter.

Ich benötige eine bat- bzw. cmd-Datei welche folgendes Problem löst:

Habe einen Ordner Rechnungen mit ca. 25000 Dateien diese sind durchnummeriert (00000-25000).
Einige Nummern sind nicht vorhanden andere mehrfach (z.B. 00009.tif 00009.xls 00009.doc .....)
Einige Ordner wurden auch bereits manuell angelegt und enthalten auch bereits Dateien.

Jetzt soll das Programm den Ordner Rechnungen nach Dateien durchsuchen
und falls Ordner noch nicht vorhanden diesen erstellen und Dateien in Ordner verschieben.
Falls Ordner bereits vorhanden entsprechend nur Dateien verschieben.

Gruss
Herby

Noch ein Nachtrag damit Ihr ungefähr seht wieviel Ahnung ich habe

Mein bisheriger Versuch:

REM @echo off
set zaehler=0
set stellen=1
:sprungmarke
if "%stellen%"=="1" md C:\Rechnungen\0000%zaehler%
if "%stellen%"=="2" md C:\Rechnungen\000%zaehler%
if "%stellen%"=="3" md C:\Rechnungen\00%zaehler%
set /A zaehler = %zaehler% + 1
if "%zaehler%"=="10" set /A stellen = %stellen%+1
if "%zaehler%"=="100" set /A stellen = %stellen%+1
if not "%zaehler%"=="1000" goto sprungmarke
if "%zaehler%"=="1000" goto ende
:ende

Ziemlich armselig (((((((((
Bitte warten ..
Mitglied: Biber
25.09.2006 um 21:03 Uhr
Moin, herby_z,

Habe einen Ordner Rechnungen mit ca. 25000 Dateien diese sind durchnummeriert (00000-25000).
Einige Nummern sind nicht vorhanden andere mehrfach (z.B. 00009.tif 00009.xls 00009.doc .....)

Also, wenn ich da einen Vorschlag machen darf.. *kopfschüttel*
Wenn Du diese Dateien schon "strukturiert" verschieben willst (was ich durchaus für angebracht halte),
dann würde ich nicht statt der bisherigen 25000 Dateien in einem Ordner jetzt anstreben, einen Orner mit 20000 Unterverzeichnissen anzulegen.

Wenn schon, dann würde ich;
- alle Rechnungsdateien von 00000 bis 00999 in einen Unterordner 00xxx packen
- darunter dann noch eine Ebene für jeweils 100 Rechnungsnummern
...so dass die Struktur am Ende so aussieht:
[\Rechnungen\]
[\Rechnungen\00xxx]
[\Rechnungen\01xxx]
[\Rechnungen\02xxx]
[\Rechnungen\03xxx]
[\Rechnungen\03xxx\030yy]
[\Rechnungen\03xxx\031yy]
[\Rechnungen\03xxx\032yy] ---> und in so einem Ordner wären alle Dateien 03200.doc bis 03299.tif
....
.................
....
[\Rechnungen\25xxx]

Diese Art von stupider Arbeit würde der folgende Zweizeiler gerne für Dich erledigen:
[ACHTUNG: Source-Ordner %src% angenommen als "x:\Archiv" und Zielordner %target% als F:\rechnungen. ANPASSEN!!]
01.
::-snipp MoveIntoRechNo.bat 
02.
@echo off & setlocal enableDelayedExpansion & set "target=F:\rechnungen" & set "src=x:\Archiv" 
03.
For /l %%i in (100000,1,125000) do set "fn=%%i" && if exist "%src%\!Fn:~-5!.*" ( 
04.
      if not exist "%target%\!Fn:~1,2!xxx\!Fn:~1,3!yy" md %target%\!Fn:~1,2!xxx\!Fn:~1,3!yy 
05.
      move "%src%\!Fn:~-5!.* %target%\!Fn:~1,2!xxx\!Fn:~1,3!yy\ >nul && echo Moved: %target%\!Fn:~1,2!xxx\!Fn:~1,3!yy\!Fn:~-5!.* 
06.
      )      
Output wäre..
01.
   
02.
 (=21:02:16  F:\=) 
03.
 >MoveIntoRechno.bat 
04.
 Moved: F:\rechnungen\00xxx\000yy\00003.* 
05.
 Moved: F:\rechnungen\04xxx\043yy\04333.* 
06.
 ....
Wenn Du es lieber in 20000 Einzelverzeichnisse haben willst->auch kein Thema, aber nur auf ausdrücklichen Wunsch und widerwillig.

Gruß
Biber
Bitte warten ..
Mitglied: Herby-z
26.09.2006 um 08:12 Uhr
Morgen Biber,

leider brauche ich es in Einzelordner, das hat folgenden Grund:
Diese Rechnungen werden über ein anderes Programm (ERP-System) aufgerufen.

Früher war es nur möglich zu einer Rechnungsnummer eine Datei abzulegen welche im Ordner Rechnungen lag bzw. liegt.

Jetzt kann ich auf Ordner umstellen und in diesen Ordnern mehrere Dateien ablegen welche auch nicht unbedingt die Rechnungsnummer haben müssen.

Ein bischen verwirrend, aber es ist nun mal so.

Auf alle Fälle vielen Dank für die Hilfe werde ich gleich mal testen.

Gruss
Herby
Bitte warten ..
Mitglied: Biber
26.09.2006 um 08:18 Uhr
Na, Herby,
wenn es denn in diese flache Struktur muss, dann wäre es (ungetestet) sinngemäß noch kürzer:
01.
::----snipp MoveIntoRechNo.bat 
02.
@echo off & setlocal enableDelayedExpansion & set "target=F:\rechnungen" & set "src=x:\Archiv" 
03.
For /l %%i in (100000,1,125000) do set "fn=%%i" && if exist "%src%\!Fn:~-5!.*" ( 
04.
      if not exist "%target%\!Fn:~1,5!" md %target%\!Fn:~1,5! 
05.
      move "%src%\!Fn:~-5!.*" %target%\!Fn:~1,5!\ >nul && echo Moved: %target%\!Fn:~1,5!\!Fn:~-5!.* 
06.
)
Gruß
Biber
Bitte warten ..
Mitglied: Herby-z
26.09.2006 um 09:02 Uhr
::----snipp MoveIntoRechNo.bat
@echo off & setlocal enableDelayedExpansion & set "target=C:\rechnungen" & set "src=C:\Archiv"
For /l %%i in (100000,1,125000) do set "fn=%%i" && if exist "%src\!Fn:~-5!.*" (
if not exist "%target%\!Fn:~1,5!" md %target%\!Fn:~1,5!
move "%src%\!Fn:~-5!.* %target%\!Fn:~1,5!\ >nul && echo Gemoved: %target%\!Fn:~1,5!\!Fn:~-5!.*
)


habe das Programme jetzt so abgewandelt das target und source auf C:\ liegen.
Im Ordner C:\rechnungen habe ich eine Datei 13000.txt angelegt.
Leider macht das Programme überhaupt nichts.

Ich verstehe die Batchdatei auch nicht.
Vermute die erste Zeile ist Kommentar, echo off kenn ich auch noch, aber dann siehts ziemlich düster aus.

P.S. Habe WinXP prof. und oben angegebenen Code als Biber.bat gespeichert.
Bitte warten ..
Mitglied: Biber
26.09.2006 um 09:26 Uhr
Im Ordner C:\rechnungen habe ich eine Datei 13000.txt angelegt.
Und wenn Du die mal in den Source-Ordner (da, wo für den Batch die Dateien JETZT liegen sollen) verschiebst?

Wenn Du nachvollziehen willst, was der Batch tut, dann
- ändere die 2. Zeile
ECHO if not exist "%target%\!Fn:~1,5!" md %target%\!Fn:~1,5!
und setze "REM " vor die dritte Zeile.
Dann wird es klarer (denke ich).

Gruß
Biber
Bitte warten ..
Mitglied: Herby-z
26.09.2006 um 09:54 Uhr
Könntest Du mir noch die Funktion von !FN:~1,5! und !Fn:~-5! erklären,
ich meine was macht das ! oder ~ ?
Das wandelt doch irgendwie die letzten 5Zeichen um oder so.

Ich glaube das genau hier mein Fehler begraben ist.
Es funktioniert bis do set "Fn=%%i" das wird mir auch angezeigt,
Ordner anlegen und verschieben funktioniert nicht.

Nerv ich schon ((
Bitte warten ..
Mitglied: Biber
26.09.2006 um 13:27 Uhr
Du mir noch die Funktion von !FN:~1,5! und !Fn:~-5! erklären

ja, klar.
in der Variablen %Fn% (für %filename% sollte ja , dur die FOR/L..IN..DO-Anweisung stehen:
100000
100001
100002
....
125000

Von dieser in der gleichen Zeile gefüllten Variablen will ich sofort/vom aktualisierten Wert, die letzten 5 Zeichen.
Das würde man/frau im Batch eigentlich so schreiben
%fn:~-5% (die letzten 5 Zeichen von %fn% --->die letzten 5 Zeichen von "100000" -->"00000"
%fn:~-5% (die letzten 5 Zeichen von %fn% --->die letzten 5 Zeichen von "100001" -->"00001"
%fn:~-5% (die letzten 5 Zeichen von %fn% --->die letzten 5 Zeichen von "100002" -->"00002"
.. etc.
Da ich aber den Wert der aktualisierten Variablen %fn% brauche, muss ich schreiben:
!fn:~-5! (die letzten 5 Zeichen von der in der selben Zeile geänderten %fn%
-bzw.
!fn:~-1,5! (die Zeichen ab Pos 1 in Länge 5 von der in derselben Zeile geänderten %fn%
[wobei Pos 0 das erste zeichen ist, Pos 1 das zweite Zeichen usw.

Wenn es bei Dir nicht klappt:
->dumme Frage: Du hast aber schon ein halbwegs aktuelles Windows? Win2k, WinXP oder so?
Bei Win98 gibt es die Syntax noch nicht.
-> oder gehörst Du zu den 2% der Windows-User, die aus Versehen "Extensions Enabled" haben?

Dann probier mal zusätzlich (oder als neue 1. Zeile im Bätschelchen)
Setlocal EnableExtensions

Gruß
Biber
Bitte warten ..
Mitglied: Herby-z
26.09.2006 um 13:58 Uhr
Hey Biber,

habe den Fehler endlich gefunden !!!!!

::----snipp MoveIntoRechNo.bat
@echo off & setlocal enableDelayedExpansion & set "target=C:\rechnungen" & set "src=C:\Archiv"
For /l %%i in (100000,1,125000) do set "fn=%%i" && if exist "%src\!Fn:~-5!.*" (
if not exist "%target%\!Fn:~1,5!" md %target%\!Fn:~1,5!
move "%src%\!Fn:~-5!.* %target%\!Fn:~1,5!\ >nul && echo Gemoved: %target%\!Fn:~1,5!\!Fn:~-5!.*
)


if exist "%src%\!Fn:~-5!.*" ( hier fehlte zweites %-Zeichen !!!

move "%src%\!Fn:~-5!.* % hier ist das "-Zeichen zu löschen !!!

Aber trotzdem wie mein bei uns in Bayern sagen würde "Host a Maß guat"
Bitte warten ..
Mitglied: Biber
26.09.2006 um 14:15 Uhr
Na, auf das Maß komm ich auch auch Becks-Trinker gern mal wieder zurück

Sorry für die Flüchtigkeitsfehler - die Variable %src% habe ich auch tatsächlich erst stehend freihändig hier beim Kommentarschreiben mit drangeflanscht (halt ungetestet).

Na ja, wenn ich so miterlebe, wie lange es braucht, bis wir so einen kleinen Zweizeiler zum Fliegen bringen, dann hab ich auch Verständnis für M$'s Vista-Terminprobleme..

Gruß
Biber
[Edit]
Habe die Tippfehler oben im geposteten Beispiel korrigiert und außerdem noch die Bildschirmmeldung "Echo Gemoved..." in "Echo Moved ..." geändert.

So schlechtes Deutsch wäre mir bestimmt doch irgendwann peinlich..
[/Edit]
Bitte warten ..
Mitglied: Herby-z
27.09.2006 um 09:00 Uhr
Guten Morgen Allerseits:

Wie kann ich genau den umgekehrten Effekt erzielen:

::----snipp MoveIntoRechNo.bat
@echo on & setlocal enableDelayedExpansion & set "target=C:\Ziel" & set "src=C:\Start"
For /l %%i in (1000015000,1,1000030000) do set "fn=%%i" && if exist "%src%\!Fn:~-9!.*" (
if not exist "%target%\!Fn:~1,9!" md %target%\!Fn:~1,9!
move /-y %src%\!Fn:~-9!.* %target%\!Fn:~1,9!\ >nul && echo Gemoved: %target%\!Fn:~1,9!\!Fn:~-9!.*
)

Ich möchte gerne eine Batch welche alles wieder in den Urzustand bringt,
d.H. Alle Dateien wieder in einen Ordner und die leeren Ordner löschen.
Nur die leeren Ordner, da ich nur einen bestimmten Bereich zurück moven möchte zwecks Export alter Rechnungen

Gruss
Herby
Bitte warten ..
Mitglied: Herby-z
27.09.2006 um 10:07 Uhr
Habe ich tatsächlich selbst geschafft

01.
::----snipp MoveIntoRechNorueckgaengig.bat 
02.
 
03.
@echo on & setlocal enableDelayedExpansion & set "target=C:\Start" & set "src=C:\Ziel" 
04.
 
05.
For /l %%i in (1000044000,1,1000045000) do set "fn=%%i" && if exist "%src%\!Fn:~1,9!" ( 
06.
     move /-y %src%\!Fn:~1,9!\*.* %target% >nul && rd %src%\!Fn:~1,9! 
07.
 )
Bitte warten ..
Mitglied: Biber
27.09.2006 um 10:45 Uhr
Habe ich tatsächlich selbst geschafft
.. war ich auch fest von ausgegangen...

Das sieht auch so stabil aus, dass Du getrost aus dem "echo on" wieder ein "echo off" machen kannst.

Zumindest Deine Anforderungs-Variante könnten wir jetzt virtuell auf "Gelöst" setzen...

Grüße
Biber
Bitte warten ..
Mitglied: DragonKM
14.11.2006 um 08:04 Uhr
öhm ich brauche sowas ähnliches, aber nicht so aufwendig.

Ich hoffe ich bin hier richtig. Es geht sich eigentlich um ein Onlinespiel, für welches man diverse Karten runterladen kann.

Diese Karten sind aufgeteilt in diese Dateitypen:

*.u
*.umx
*.unr
*.uax
*.utx

Diese Dateien sollen aus verschiedenen Ordnern gesucht werden und dann in diese Ordner kopiert werden (nicht verschoben)

unr -> Maps
umx -> Music
uax -> Sounds
u -> System
utx -> Textures

Beispiel:

Auf meiner F-Partition hab ich einen Ordner namens "Maps-Download"
Darin sind ca 2500 Ordner, die alle unterschiedlich benannt sind (z.B. "-=[TMTL]=-SniPeZ")

Das Script soll nun aus diesen Ordnern die betreffenden Dateien suchen, die neuen Ordner anlegen und die Dateien dort rein kopieren.

Soll später so aussehen

F:
-- Maps-Download
Sortiert
Maps
Sounds
Textures
System
Music
Unbekannt


Kann mir da jemand helfen? Ich bin zulange aus den Batch Sachen raus
Bitte warten ..
Mitglied: Biber
14.11.2006 um 21:35 Uhr
Moin DragonKM,

na ja... Dein Anliegen passt schon unter diese Überschrift...
..aber langsam wird es hier unübersichtlich.
Bitte nächstes Mal einen neuen Thread aufmachen.

Aber lass uns mal zusehen, dass wir Deine Frage diesmal eben noch hier mit abfackeln.

3 Rückfragen vorab:

a) Habe ich das richtig verstanden, dass Du 2500 Ordner mit Namen wie "(z.B.-=[TMTL]=-SniPeZ")
parallel zum vorgesehenen neuen Verzeichnis "Sortiert" unterhalb von "F:\Map-Downloads" haben möchtest?
IMHO wäre es sinnvoller, alles aus den Unterverzeichnissen Krusch, KrimsKrams und Gedöns
unterhalb F:\Map-Downloads herauszukopieren in ein Verzeichnis "F:\Sortiert" eine Ebene höher.

b) Da die Wahrscheinlich relativ hoch ist, das "Kollisionen" auftreten, also eine zu kopierende Datei schon auf eine vorhandene gleichnamige trifft: Was soll passieren?
Letzte gewinnt? Erste bleibt? BSOD aufrufen?

c) How the f*ck spricht man/frau "-=[TMTL]=-SniPeZ" aus???

Wenn Du zumindest die ersten beiden Rückfragen noch beantworten könntest...

Grüße
Biber
Bitte warten ..
Mitglied: DragonKM
15.11.2006 um 05:41 Uhr
Ah Biber Du hast mir schonmal geholfen (erinnerst du Dich?)

Zu 1:

Das ist natürlich auch möglich und sinnvoller

Zu 2:

Die Datei die größer ist soll gewinnen

Zu 3:

Erklärung

-=[TMTL]=- Ist entweder der Ersteller der Map oder der Clan (Online-Spieler-Gemeinschaft)

SniPeZ = Snaips (Soll wohl sowas wie moderne Sprache sein und lässt auf eine Scharfschützen Map schliessen)


Liebe Grüße

Dragon
Bitte warten ..
Mitglied: Biber
15.11.2006 um 15:22 Uhr
Moin Dragon,

das Schreiben des Schnipsels ist kein Problem...
...nur das Beschreiben dauert.
01.
::--- snipp DragonCopy.bat 
02.
@echo off & setlocal 
03.
Goto start 
04.
~~~~~~~~~~~~~ 
05.
Eigentlich wieder nur ein Oneliner... 
06.
Nur durch diese Bedingung "größere Datei gewinnt" ist dieser Winz-CALL-Block <b>:CopyIfGTR </b> entstanden. 
07.
a) Das Mapping der Extensions auf Ordner wird in den äußeren beiden FOR-Anweisungen abgefackelt. 
08.
######## Mapping der Extensions auf Ordner: 
09.
unr -> Maps 
10.
umx -> Music 
11.
uax -> Sounds 
12.
u -> System 
13.
utx -> Textures 
14.
b) das Kopieren läuft in der inneren FOR /R -Anweisung rekursiv unterhalb F:\Maps-Download. 
15.
Quellordner (Root) : F:\Maps-Download 
16.
Zielordner(root): F:\Sortiert 
17.
c) im Moment zeigt der Schnipsel nur, was er tum würde.. 
18.
Die GROSS geschriebenen ECHO's müssen raus zum Scharfmachen. 
19.
 
20.
Here we go... 
21.
 
22.
:CopyIfGTR now2Copy alreadyThere 
23.
If %~z1 GTR %~z2 <b>ECHO</b> copy /y %1 %2 
24.
Goto :eof 
25.
 
26.
:start 
27.
Set "QRoot=F:\Maps-Download" && set "ZRoot=F:\Sortiert" 
28.
For %%a in (unr:Maps umx:Music uax:Sounds u:System utx:Textures) do ( 
29.
  for /f "tokens=1-2 delims=:" %%j in ("%%a") do ( 
30.
    for /r "%QRoot%" %%f in (*.%%j) do ( 
31.
      If exist "%ZRoot%\%%k\%%~nxf" ( 
32.
       Call :CopyIfGtr "%%~ff" "%ZRoot%\%%k\%%~nxf"  
33.
       ) else ( 
34.
        <b>ECHO</b> copy "%%f" "%Zroot%\%%k\%%~nxf" 
35.
)))) 
36.
::::--- snapp DragonCopy.bat
Ich habe es versucht, die eventuell zu ändernden Stellen wartbar in Variablen zu halten.
An die krytischen Verarbeitungszeilen musst Du nur zum Entfernen der ECHO's nach dem Testen ran.

Greetz and have fun.
Biber
P.S. Ach ja... bitte gib zügig Rückmeldung... ich möchte diesen Thread hier jetzt endlich schließen.
Bitte warten ..
Mitglied: DragonKM
15.11.2006 um 17:42 Uhr
Ok das klappt, ich habe noch folgendes hinzugefügt

:start
if not exist "F:\Sortiert" md F:\Sortiert
if not exist "F:\Sortiert\Maps" md F:\Sortiert\Maps
if not exist "F:\Sortiert\Music" md F:\Sortiert\Music
if not exist "F:\Sortiert\Sounds" md F:\Sortiert\Sounds
if not exist "F:\Sortiert\System" md F:\Sortiert\System
if not exist "F:\Sortiert\Textures" md F:\Sortiert\Textures



Aber was ist mit den Dateien, die nicht in das Suchraster passen? zum Beispiel txt Dateien oder so? Die sollten ja dann direkt in den Sortiert Ordner....
Bitte warten ..
Mitglied: Biber
15.11.2006 um 18:11 Uhr
Moin DragonKM,

na ja, das wird uns nicht so vor massive Probleme stellen, denke ich...
01.
::--- snipp DragonCopy.bat 
02.
@echo off & setlocal 
03.
Goto start 
04.
~~~~~~~~~~~~~ 
05.
Version 0.02:  
06.
++ Verzeichnisse überprüfen; ggf. anlegen 
07.
++ Dateien mit "anderer Endung" als *.u;*.uax.... in den Ordner "%ZRoot%"=F:\Sortiert: 
08.
 
09.
Eigentlich wieder nur ein Oneliner... 
10.
Nur durch diese Bedingung "größere Datei gewinnt" ist dieser Winz-CALL-Block :CopyIfGTR  entstanden. 
11.
a) Das Mapping der Extensions auf Ordner wird in den äußeren beiden FOR-Anweisungen abgefackelt. 
12.
######## Mapping der Extensions auf Ordner: 
13.
unr -> Maps 
14.
umx -> Music 
15.
uax -> Sounds 
16.
u -> System 
17.
utx -> Textures 
18.
b) das Kopieren läuft in der inneren FOR /R -Anweisung rekursiv unterhalb F:\Maps-Download. 
19.
Quellordner (Root) : F:\Maps-Download 
20.
Zielordner(root): F:\Sortiert 
21.
c) im Moment zeigt der Schnipsel nur, was er tum würde.. 
22.
Die GROSS geschriebenen ECHO's müssen raus zum Scharfmachen. 
23.
 
24.
Here we go... 
25.
 
26.
:CopyIfGTR now2Copy alreadyThere 
27.
If %~z1 GTR %~z2 ECHO copy /y %1 %2 
28.
Goto :eof 
29.
 
30.
:start 
31.
Set "QRoot=F:\Maps-Download" && set "ZRoot=F:\Sortiert" 
32.
For %%a in (unr:Maps umx:Music uax:Sounds u:System utx:Textures ) do ( 
33.
  for /f "tokens=1-2 delims=:" %%j in ("%%a") do ( 
34.
    for /r "%QRoot%" %%f in (*.%%j) do ( 
35.
      <b>If not exist  "%ZRoot%\%%k" md "%ZRoot%\%%k"</b> 
36.
      If exist "%ZRoot%\%%k\%%~nxf" ( 
37.
       Call :CopyIfGtr "%%~ff" "%ZRoot%\%%k\%%~nxf"  
38.
       ) else ( 
39.
        ECHO copy "%%f" "%Zroot%\%%k\%%~nxf" 
40.
)))) 
41.
Rem für den Rest abgespeckte FOR /R -Anweisung:[mit "größere gewinnt"] 
42.
    for /r "%QRoot%" %%f in (*.*) do ( 
43.
      If exist "%ZRoot%\%%~nxf" ( 
44.
       Call :CopyIfGtr "%%~ff" "%ZRoot%\%%~nxf"  
45.
       ) else ( 
46.
        ECHO copy "%%f" "%Zroot%\%%~nxf" 
47.
))
Darf ich den Beitrag jetzt schließen? *gg

Grüße
Biber
[Edit]
Eigentlich, da die Dateien ja kopiert werden und nicht verschoben, werden mit dem obigen Schnipsel
auch wieder die Dateien mit den Endungen "*.unr *.umx *.uax *.u *.utx" ein zweites Mal kopiert... in den Ziel-Root-Ordner "F:\Sortiert"
Wenn das nicht sein soll, dann noch mal die untere FOR /R -Anweisung ergänzen:
01.
... 
02.
    for /r "%QRoot%" %%f in (*.*) do ( 
03.
     <b> If Not [%%xf]==[.unr] If Not [%%xf]==[.umx] If Not [%%xf]==[.uax] If Not [%%xf]==[.u] If Not [%%xf]==[.utx] ( </b>  
04.
      If exist "%ZRoot%\%%~nxf" ( 
05.
       Call :CopyIfGtr "%%~ff" "%ZRoot%\%%~nxf"  
06.
       ) else ( 
07.
        ECHO copy "%%f" "%Zroot%\%%~nxf" 
08.
)) ) 
09.
REM Unten eine weitere Klammer-Zu nicht vergessen!
[/Edit]
Bitte warten ..
Mitglied: DragonKM
15.11.2006 um 20:52 Uhr
Ja kannst dicht machen, geht einwandfrei Vielen Dank
Bitte warten ..
Neuester Wissensbeitrag
Humor (lol)

Linkliste für Adventskalender

(3)

Information von nikoatit zum Thema Humor (lol) ...

Heiß diskutierte Inhalte
Windows Server
DHCP Server switchen (25)

Frage von M.Marz zum Thema Windows Server ...

SAN, NAS, DAS
gelöst HP-Proliant Microserver Betriebssystem (14)

Frage von Yannosch zum Thema SAN, NAS, DAS ...

Grafikkarten & Monitore
Win 10 Grafikkarte Crash von Software? (13)

Frage von Marabunta zum Thema Grafikkarten & Monitore ...

Windows 7
Verteillösung für IT-Raum benötigt (12)

Frage von TheM-Man zum Thema Windows 7 ...