dragonrb
Goto Top

Batch Befehl zum Sortieren von Dateien nach ihrem erstellungsdatum gesucht

Hallo Leute,

Ich bräucht eure Hilfe.

Und zwar suche ich einen Batch Befehl (.bat Datei) der bestimmte Dateien aus einem Sammelordner nach ihrem Datum sortiert, also genaugenommen nach ihrem Monat (Erstellungsdatum).
Diese Dateien sollen dann in einen Ordner kopiert werden, welcher Unterordner mit allen Monaten enthält.
Also z.b. eine Datei die am 04.02.2007 erstellt wurde soll dann erkannt werden und in den Ordner C:\2007\02 verschoben werden, eine Datei die am 04.05.2007 erstellt wurde wird dann in den Ordner C:\2007\05 kopiert.

Ich habe leider bisher null Erfahrung was solche batch Dateien anbetrifft, also es wäre sehr nett, wenn ihr es so unkompliziert wie möglich formulieren könntet ^^

Ich habe das Forum schon vor erstellen des Beitrages durchsucht nur leider habe ich keinen Beitrag gefunden, den ich verstanden habe und konnte daher auch nicht sicher sein ob es sich um das gleiche Problem wie meines handelt.

Vielen Dank im Vorraus...

MfG Dragon

Content-Key: 52650

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

Printed on: April 24, 2024 at 01:04 o'clock

Member: Dani
Dani Feb 26, 2007 at 09:39:28 (UTC)
Goto Top
Moin,
so müsst es gehen. Vielleicht kann man das einfacher machen, aber so müsst es gehen:
@echo off

for /f "tokens=1,4* delims= " %%a in ('dir /od "D:\Musik"') do (  
	for /f "tokens=1,2,3 delims=." %%i in ('echo %%a') do (  
		move "D:\Musik\%%b%%c" "C:\%%k-%%j" /y  
	)
)
Ich habe es nicht mit verschieben probiert, sondern nur mit eine ECHO Ausgabe.


Grüße
Dani
Member: Biber
Biber Feb 26, 2007 at 09:45:29 (UTC)
Goto Top
Moin Dragonrb,

willkommen im Forum.

Für Deinen Plan brauchst Du eigentlich nur einen neuen Zielordner und zwei Anweisungen vom CMD-Prompt.
Da es erstmal eine einmalige (und keine wiederkehrende) Aufgabe ist, würde ich keinen Batch dafür zusammentrümmern, sondern mich langsam und interaktiv daran herantrauen.

Den ersten Befehl brauchst Du, um alle nötigen Unterverzeichnisse anzulegen, den zweiten zum Verschieben der Dateien.

Annahmen:
- du kennst das Quell-Verzeichnis, aus dem Du die Daten verschieben/wegsortieren willst
- einen sinnvollen Namen für das Zielverzeichnis kennst Du auch.

Dann am CMD-Prompt (Beispiel:Quelle ist "f:\temp"; Ziel ist "X:\SortiertesGeraffel"):
----zuerst die Ordner anlegen----
(=10:37:32  D:\temp=)
>for %i in (f:\temp\*.*) do @for /f "tokens=2-3 delims=. " %a in ("%~ti") do @if not exist x:\SortiertesGeraffel\%b\%a <b>@ECHO</b> md x:\SortiertesGeraffel\%b\%a  
md x:\SortiertesGeraffel\2006\08
md x:\SortiertesGeraffel\2006\09
md x:\SortiertesGeraffel\2006\10
md x:\SortiertesGeraffel\2006\12
.....
--- dann die Dateien MOVEn...
for %i in (f:\temp\*.*) do @for /f "tokens=2-3 delims=. " %a in ("%~ti") do <b>@ECHO</b> move "%~fi" x:\SortiertesGeraffel\%b\%a\*.*  
move "f:\temp\Q0rdner.txt" x:\SortiertesGeraffel\2006\08\*.*  
move "f:\temp\Sourcepath.txt" x:\SortiertesGeraffel\2006\10\*.*  
move "f:\temp\hbci201a.doc" x:\SortiertesGeraffel\2006\12\*.*  
....

Beide Beispielzeilen enthalten ein @echo, welches das gefahrlose Testen/Simulieren ermöglicht.
Dieses "@Echo" muss weggelassen werden, wenn die Anweisung das gewünschte Ergebnis anzeigt und die Anweisung wirklich ausgeführt werden soll.

HTH
Biber
Member: Dragonrb
Dragonrb Feb 26, 2007 at 12:12:53 (UTC)
Goto Top
WOW!

Vielen Dank für die schnellen Antworten und thx @ Biber für die einfach Formulierung.

Ich werd das gleich mal probieren sieht aber schon sehr gut aus...

Also ich meld mich gleich wieder...

MfG Dragon

Edit:

So
ich habe das mal ausprobiert, nur leider bekomme ich schon direkt beim ersten befehl eine Fehlermeldung bei der Syntax

for %i in (f:\temp\*.*) do @for /f "tokens=2-3 delims=. " %a in ("%~ti") do @if not exist x:\SortiertesGeraffel\%b\%a @echo md x:\SortiertesGeraffel\%b\%a

Sagt er mir: Der Befehl "%i" ist entweder falsch geschrieben oder konnte nicht gefunden werden. ???
fehlt mir da vielleicht irgendein zusätzliches pluggin mit batch befehlen oder so?

Ich arbeite an einer win2000 Pro Maschine...

Und meine zweite frage wäre zu deinerm zweiten Befehl:

for %i in (f:\temp\*.*) do @for /f "tokens=2-3 delims=. " %a in ("%~ti") do @echo move "%~fi" x:\SortiertesGeraffel\%b\%a\*.*
move "f:\temp\Q0rdner.txt" x:\SortiertesGeraffel\2006\08\*.*
move "f:\temp\Sourcepath.txt" x:\SortiertesGeraffel\2006\10\*.*
move "f:\temp\hbci201a.doc" x:\SortiertesGeraffel\2006\12\*.*

Die 3 Beispiele die du drunter stehn hast, werden diese Dateien (z.b. QOrdner.txt) von der oberen Zeile selbst erkannt, oder hast du die manuell eingefügt? Weil ich bräuchte ein Programm, dass halt aus einem Quellordner einfach alle dateien einliest und diese dann sortiert nach datum auf (wie du schon so schön geschrieben hast) die Unterordner in \SortiertesGeraffel verteilt...

Nochmals Danke für die Hilfe^^

MfG Dragon
Member: Dragonrb
Dragonrb Feb 26, 2007 at 13:48:11 (UTC)
Goto Top
Edit ;) Sry 4 Doppelpost

So hab nach ein bisschen grübeln und der hilfe eines netten Kollegen endlich mein denkfehler gefunden

Du hast ja nur die Befehle kopiert und zusätzlich haste mir die Echo ausgabe mitkopiert das hat mich erstmal ins grübeln gebracht ;)

Und glaube du hast auch beim ersten Befehl das > mitkopiert das hat mich auch am anfang bissl gewundert habs aber dann einfach weggemacht und die Laufwerksbuchstaben angepasst und siehe da es klappt perfekt ;)



Also zumindest, wenn ich die beiden Befehle in die kommandozeile hintereinander einfüge und seperat ausführe

Gibts denn auch ne möglich die beiden Befehle jetzt noch in eine Ausführbare datei zu importieren, die ich dann z.b. in den autostrat schieben könnte? Sodass er die routine bei jedem start einmal abfährt?

Nochmals Danke für die Hilfe...

MfG Dragon
Member: Biber
Biber Feb 26, 2007 at 15:06:27 (UTC)
Goto Top
Sorry, Dragonrb,

das hätte ich natürlich auch deutlicher machen können...

Ja, das Größer-(">")-Zeichen sollte den CMD-Prompt andeuten und nicht mit eingegeben werden.
Ja, die Zeilen darunter sind die Outputzeilen, die in meiner Testumgebung rausfallen würden.


Ja, die beiden Zeilen könntest Du natürlich auch, statt die so per Copy & Paste am CMD-Prompt einzufügen, in eine Bat-Datei schreiben, wenn die beiden Einzelzeilen im Test denn das machen, was Du willst.

Einzige wesentliche Änderung: im Batch sind vor den Zählvariablen %i, %j usw zwei Prozentzeichen statt einem am CMD-Prompt.

Als Batch könnte das Ganze sinngemäß (das heißt: Deine Pfade und Laufwerke sind natürlich nicht drin, die kennst nur Du) so aussehen:

::---------snipp SortierMirInMonatsOrdner.bat ----
@echo off & setlocal
::---ab hier anpassen
Set "QuellDirFiles=F:\Temp\*.*"  
Set "ZielDirRoot=X:\SortiertesGeraffel"  
::---bis hier anpassen
:: Monatsordner anlegen, wenn nötig
for %%i in (%QuellDirFiles%) do  (
      for /f "tokens=2-3 delims=. " %%a in ("%%~ti") do @if not exist "%ZielDirRoot%\%%b\%%a"  md "%ZielDirRoot%\%%b\%%a"  
)
:: --- dann die Dateien MOVEn...
for %%i in (%QuellDirFiles%) do @for /f "tokens=2-3 delims=. " %%a in ("%%~ti") do move "%%~fi" "%ZielDirRoot%\%b\%a\*.*"  
::---------snapp SortierMirInMonatsOrdner.bat ----

-oder etwas kürzer:
::---------snipp SortierMirInMonatsOrdner.bat ----
@echo off & setlocal
::---ab hier anpassen
Set "QuellDirFiles=F:\Temp\*.*"  
Set "ZielDirRoot=X:\SortiertesGeraffel"  
::---bis hier anpassen
:: Monatsordner anlegen, wenn nötig und dann die Dateien MOVEn...
for %%i in (%QuellDirFiles%) do  for /f "tokens=2-3 delims=. " %%a in ("%%~ti") do (  
         if not exist "%ZielDirRoot%\%%b\%%a"  md "%ZielDirRoot%\%%b\%%a"  
         move "%%~fi" "%ZielDirRoot%\%b\%a\*.*"  
)
::---------snipp SortierMirInMonatsOrdner.bat ----
[Ungetestete Skizze]

Kannst Du Dir in den Autostart legen oder auf den Desktop... aber halt erst, wenn es getestet ist und fliegt.

Gruss
Biber
Member: Dragonrb
Dragonrb Feb 26, 2007 at 15:23:04 (UTC)
Goto Top
Wow ^^ Das ist perfekt Biber ;)

So in etwa habe ich es auch noch ein wenig verfeinert habs eben mal mit den Variablen und den 2x %% Versucht klappt einwandfrei, auf dem wege nochmals danke für die tipps ;)

Bin jetzt grad dabei die datei mit en paar rems zu versehn damit sie en bissl durchsichtiger wird...

aber bisher schon super arbeit...

Also dann wünsch ich noch en schönen feierabend....

Viele liebe Grüße

Dragonrb

Edit:

Bestünde eigentlich auch die Möglichkeit Die Variablen so zu ändern, dass im Zielordner dann später z.b. 2007\Januar oder 2007\Februar drinnesteht?
Irgendwie blick ich durch die Variablensetzung noch nich so ganz durch ;)
Member: Biber
Biber Feb 26, 2007 at 16:33:29 (UTC)
Goto Top
Moin Dragonrb,

Bestünde eigentlich auch die Möglichkeit...
Och, Batchskripte bieten eigentlich fast unbegrenzte Möglichkeiten. Meiner Erfahrung nach...
Und zu dieser Übersetzung von eher tristen Datumswerten in etwas flüssig Lesbares könnte ich stundenlang erzählen.

Hab ich sogar schon getan hier im Forum - einiges davon davon steht z.B. in dem Tutorial ,
dem zweiten Link unten in "Beiträge im gleichen Bereich".

Wenn Du Dir das mal gemütlich mit einer Tüte Erdnussflips und einem Glas nicht zu fruchtigen Dornfelder reinziehst, solltest Du danach in der Lage sein,
- FOR-Anweisungen mit mehreren Zählvariablen mit spielerischer Leichtigkeit ineinander zu schrauben,
- die Monatswerte "01" bis "12" durch die Monatsnamen "Jänner" bis "Dezember" zu ersetzen,
- Deine Musterlösung hier zu veröffentlichen und
- einen grünen Haken an diesen Thread zu heften.

Würde mir eine größere Freude bereiten, als Dir hier eine maßgeschneiderte Fertiglösung unterzujubeln, die Du dann nur teilweise nachvollziehen kannst.

Vorschlag: Versuch es einmal anhand dieses Tutorials zu lösen... sollte es dann klemmen, findest Du natürlich hier weitere Hilfe (zur Selbsthilfe).

Gruss
Biber
Member: Dragonrb
Dragonrb Feb 27, 2007 at 09:24:26 (UTC)
Goto Top
Hallo Biber

Schonmal Danke für den Tipp und die vorige Hilfe.

Das Programm funktioniert an sich so auch schon einwandfrei und erfüllt auch seinen Zweck. Ich poste das grad mal hier rein so wies jetzt endgültig aussieht:

:: Dies ist eine .bat Datei zum Scannen eines Quellordners nach Dateien mit unterschiedlichem Erstellungsdatum um Sie einheitlich zu sortieren. 
:: Diese Dateien werden dann geordnet nach dem Monat Ihrer Erstellung und dem dazugehörigen Jahr in einen seperaten Ordner namens "Akalf" verschoben.   

@Echo off & Setlocal

:: Festlegen der Variablen für  Quell und Zielverzeichniss...

Set "QuellDirFiles=C:\Temp\*.*"  
Set "ZielDirRoot=C:\Akalf"  

:: Erstellen der Ordner Anhand des Erstellungsdatums aller Dateien...

for %%i in (%QuellDirFiles%) do  (
      	for /f "tokens=2-3 delims=. " %%a in ("%%~ti") do @if not exist "%ZielDirRoot%\20%%b\%%a"  md "%ZielDirRoot%\20%%b\%%a"  
)

:: Verschieben dieser Dateien...

for %%i in (%QuellDirFiles%) do @for /f "tokens=2-3 delims=. " %%a in ("%%~ti") do move "%%~fi" "%ZielDirRoot%\20%%b\%%a"  

Soweit ein top progrämmchen ;)

Hab mir auch jetzt deinen Guide durchgelesen und auch weiter unten in den Kommentaren die Erläuterung zur Auflösung der Monatsdaten in Schriftform gefunden.
Habs jetzt versucht in meinen Code zu implementieren, nur habe ich ihn leider danach nicht mehr zum laufen gebracht. Ich weiss leider nicht genau welche variablen ich in deinem Beispiel ändern muss um sie in meinen Code zu implementieren, vielleicht kannste mir da nochmal en kleinen Schubs in die richtige Richtung geben ;)

So far

MfG Dragonrb
Member: Biber
Biber Feb 27, 2007 at 10:31:01 (UTC)
Goto Top
Moin Dragonrb,

eine Skizze wäre so:
:: Dies ist eine .bat Datei zum Scannen eines Quellordners nach Dateien mit unterschiedlichem Erstellungsdatum um Sie einheitlich zu sortieren. 
:: Diese Dateien werden dann geordnet nach dem Monat Ihrer Erstellung und dem dazugehörigen Jahr in einen seperaten Ordner namens "Akalf" verschoben.  

@Echo off & Setlocal

:: Festlegen der Variablen für  Quell und Zielverzeichniss...

Set "QuellDirFiles=C:\Temp\*.*"  
Set "ZielDirRoot=C:\Akalf"  

:: Erstellen der Ordner Anhand des Erstellungsdatums aller Dateien...

for %%i in (%QuellDirFiles%) do  (
    for /f "tokens=2-3 delims=. " %%a in ("%%~ti") do Call :Move2XLatedMonthFolder "%%~fi" %%b %%a   
)
goto :eof

:Move2XLatedMonthFolder 
REM Parameter %1="FQ-Quelldateiname"   
REM Parameter %2: JJ-Jahr; Parameter3:MM-Monat
    
If [%3]==[01] set "cMonat=Januar"  
If [%3]==[02] set "cMonat=Februar"  
If [%3]==[03] set "cMonat=Märzen"  
If [%3]==[04] set "cMonat=April"  
If [%3]==[05] set "cMonat=Meiomei"  
If [%3]==[06] set "cMonat=Juno"  
If [%3]==[07] set "cMonat=Juli"  
If [%3]==[08] set "cMonat=August"  
If [%3]==[09] set "cMonat=September"  
If [%3]==[10] set "cMonat=Oktober"  
If [%3]==[11] set "cMonat=November"  
If [%3]==[12] set "cMonat=Dezember"  


if not exist "%ZielDirRoot%\20%2\%cMonat%"  md "%ZielDirRoot%\20%2\%cMonat%"  

:: Verschieben dieser Dateien...

move %1 "%ZielDirRoot%\20%2\%cMonat%"  
goto :eof
[ungetestete Skizze]

Gruss Biber
Member: Dragonrb
Dragonrb Feb 27, 2007 at 11:28:41 (UTC)
Goto Top
Hallo Biber,


OmeiOmei... Da wär ich ja echt nich drauf gekommen. Ich danke dir auf jeden Fall für deine Zeit.

Ich habs mal so getestet und es funktioniert einwandfrei...

Werd jetzt auf jeden Fall weiterhin en bisschen mit Batch rumspielen is echt intressant aber bis ich wirklich alles verstanden hab geht bestimmt noch einige Zeit ins Land ;)

*Häckchen mach*

MfG Dragonrb

Edit: Öhm? Biber vielleicht noch eine kleine Sache, wie kann ich meinen Beitrag als gelöst abhaken ?^^
Member: Biber
Biber Feb 27, 2007 at 12:11:19 (UTC)
Goto Top
*lacht*

@Dragonrb
Beitrag als gelöst markieren/Grünes Häkchen setzen

- Anmelden
- unterhalb der Frage, mit der Du diesen Beitrag begonnen hast, den Button "Editieren" drücken
- Im aufgehenden Fensterchen unterhalb des Beitragstext-Editors das Kontrollkästchen "Dieser Beitrag gillt als gelöst" aktivieren/ankreuzen.

[Und wenn es der Beitragsersteller auf "Gelöst" gesetzt hat, kommt irgendwann der Mod/die Modöse/das Model und setzt den Beitrag nach dem selben Muster auf "Geschlossen".]

Schönen Tag auch Dir
Biber