Top-Themen

Aktuelle Themen (A bis Z)

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

Mitglied: IchoTolot2

IchoTolot2 (Level 1) - Jetzt verbinden

21.07.2006, aktualisiert 15.11.2006, 10629 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?

mfg
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).

mfg
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 ..
Ähnliche Inhalte
Outlook & Mail
Outlook Schulung - Was sollte rein?
Frage von staybbOutlook & Mail5 Kommentare

Hallo, für eine interne Outlook 2007 /2010 Schulung wollte ich euch Experten mal fragen, was ihr in die Schulung ...

Linux
Server Dokumentation (Was sollte rein?)
Frage von TrialAndErrorLinux18 Kommentare

Hallo, nach dem ich im vergangenen Jahr zwei größere Ausfälle hatte, ist bei mir das Thema Dokumentation wieder weiter ...

Drucker und Scanner
Drucker - vorne rein, vorne raus
gelöst Frage von FA-jkaDrucker und Scanner13 Kommentare

Gesucht: - A3 Tintenstrahldrucker - Netzwerkschnittstelle - Die Schublade mit dem Papier wird von vorne in das Gerät eingeschoben ...

Debian

Autostart einer SH Datei unter AntiX Linux auf Basis von Debian

gelöst Frage von zeroblue2005Debian6 Kommentare

Hallo Zusammen, ich versuche seit stunden eine rdp.sh Datei die unter /etc/initd/ abgelegt habe und die ich als Ausführbar ...

Neue Wissensbeiträge
Internet
Copyright-Reform: Upload-Filter
Information von Frank vor 1 TagInternet

Hallo, viele Menschen reden aktuell von Upload-Filtern. Sie reden darüber, als wären es eine Selbstverständlichkeit, das Upload-Filter die Seitenbetreiber ...

Google Android

Blokada: Tracking und Werbung unter Android unterbinden

Information von AnkhMorpork vor 1 TagGoogle Android1 Kommentar

In Ergänzung zu meinem vorherigen Beitrag: Blokada efficiently blocks ads, tracking and malware. It saves your data plan, makes ...

Google Android
Facebooks unsichtbare Datensammlung
Information von AnkhMorpork vor 1 TagGoogle Android2 Kommentare

Rund 30 Prozent aller Apps im Play-Store nehmen Kontakt zu Facebook auf, sobald man sie startet. So erfährt der ...

Exchange Server

Exchange 2010 bis 2019 Sicherheitslücke durch CU RU schließen

Information von sabines vor 1 TagExchange Server

Für die hier: und hier: besprochene Sicherheitslücke ist ein Patch für Microsoft Exchange Server 2010 - 2019 verfügbar. RU ...

Heiß diskutierte Inhalte
LAN, WAN, Wireless
NETBEUI unter Windows 10
Frage von certifiedit.netLAN, WAN, Wireless26 Kommentare

Guten Abend, wir stehen gerade vor dem Rästel, warum man in einer Industriemaschine (wert gut 6-stellig, paar mal vorhanden) ...

Hardware
Was passiert wenn ein Server zu heiß wird?
Frage von LohrakHardware21 Kommentare

Hallo Sollte ein Server zu heiß werden, da z.B ein Lüfter ausfällt, was würde passieren? Wie meldet sich der ...

Linux Userverwaltung
LogIn Versuche beschränken auf EINEN Versuch
gelöst Frage von GarroshLinux Userverwaltung18 Kommentare

Folgendes Problem Ich habe einen dezidierten Server beim Hoster gemietet, installiert ist Ubuntu 18.04.2 LTS‬ und als Webinterface Plesk. ...

Internet
Aktuell HP-Support-Seite kaputt?
gelöst Frage von LochkartenstanzerInternet12 Kommentare

Hallo Kollegen, Weiß einer von euch, seit wann die HP-Support-Seite kaputt ist? ) Wollte heute morgen Druckertreiber runterladen und ...