ad-mike
Goto Top

Dateien nach Erstellungsdatum in ein Unterordner verschieben

Hallo,

gerne möchte ich Dateien in Unterordner verschieben.
Dazu habe ich einmal eine Batch geschrieben. Als Hilfe habe ich einen Beitrag aus diesem Forum genommen in dem nur ein bestimmtes Datum genutzt wurde. Ich möchte aber alle Dateien aus dem Quellordner nehmen und diese in den entsprechenden Unterordnern verschieben. Diese Unterordner sollen vorher erzeugt werden.
Das habe ich so gelöst:
rem @echo off
setlocal


set "Quelle=J:\Export"  
set "Ziel=J:\Export"  
set "Typ=.pdf"  

pushd "%Quelle%"  

for /F "tokens=1-3*" %%a in ('dir /a-d /tc *%Typ%^|findstr /i /e "\%Typ%"') do (    
for /F "tokens=1-3 delims=." %%e in (%%a) do (  
md %Ziel%\%%g
md %Ziel%\%%g\%%g-%%f
move %Quelle%\%%d %Ziel%\%%g\%%g-%%f\%%d
)

)
popd
Im ersten Test hat der Code prima funktioniert. Ich habe PDF- Dateien erzeugt und er hat diese wegsortiert.
Aber als ich dann ältere Dateien zusammen gesucht habe, wurden die alle in den Unterordner für den aktuellen Monat geschoben.

Mir wurde also in %%a nicht das Erzeugungsdatum der Datei geliefert, sondern nur das aktuelle Tagesdatum. Aber in %%d habe ich schon den korrekten Namen gefunden. Nun weiß ich nicht, warum das %%a und das %%d nicht von der selben Datei ist? hat jemand eine Idee?

[Edit Biber] Codeformatierung. [/Edit]

Content-Key: 182115

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

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

Member: bastla
bastla Mar 16, 2012 at 14:39:11 (UTC)
Goto Top
Hallo AD-Mike!

Das ließe sich auch mit nur einer Schleife der Art
for /f "tokens=1-5* delims=. " %%a in ('dir /a-d /-c /tc *%Typ%^|findstr /i /e "\%Typ%"') do (
abhandeln - dann würden auch die fehlenden Anführungszeichen um %%a herum sich nicht auswirken ... face-wink

Das erste "md" ist unnötig - im Pfad benötigte Ordner (in Deinem Fall %%g) werden automatisch erzeugt ...

Ach ja - bei "move" genügt es, als Ziel den Ordnernamen anzugeben, und wenn Du vorher ohnehin schon den Quellordner zum aktuellen Ordner gemacht hast, kannst Du bei der Quelle die Ordnerangabe gleich weglassen.

Grüße
bastla

P.S.: Wenn Du "" verwendet hättest (lässt sich aber ja noch nachholen), wäre das Ganze leichter lesbar ...
Member: AD-Mike
AD-Mike Mar 21, 2012 at 09:36:38 (UTC)
Goto Top
Hallo Bastia,
vielen Dank für diese heißen Tips.

Leider haut es trotsdem nicht hin.
Ob es mein Code ist mit den korrigierten Anführungszeichen oder Deine Schleife. Dort habe ich auch die Buchstaben entsprechend angepasst.
Er sortiert immer alles in das heuitige Datum.
Vielleicht sollte man den Code nicht verkürzen, sondern aufsplitten und ein paar Kontrollausgaben tätigen...
Member: bastla
bastla Mar 21, 2012 at 10:04:39 (UTC)
Goto Top
Hallo AD-Mike!
ein paar Kontrollausgaben tätigen...
Du hast doch ohnehin kein "echo off" aktiv - damit solltest Du ja den Ablauf nachvollziehen können. Noch besser geht das, wenn Du den Batch (unter der Annahme, dass er "Verschieben.cmd" hieße) etwa so startest:
Verschieben.cmd >Verschieben.txt 2>&1
- dadurch werden alle Bilschirmausgaben (auch Fehlermeldungen) in die Datei "Verschieben.txt" geschrieben ...

Grüße
bastla
Member: AD-Mike
AD-Mike Mar 27, 2012 at 13:26:33 (UTC)
Goto Top
Hallo bastla,

vielen Dank für die Info, das wußte ich zwar schon, aber in einer Textdatei liest es sich wirklich besser. Hast recht.

Den Fehler habe ich jetzt auch gefunden.
Es ist der Parameter "/tc" hinter dem Befehl dir.
Von der Frage hier im Vorum, wo ich Teile der Schleife her habe, hattest du diese einmal so erklärt:

"Hier sollen zunächst die passenden "dir"-Zeilen ermittelt werden (durch "/a-d" werden sicherheitshalber Ordner von der Anzeige ausgeschlossen, "/tc" legt fest, dass Datum und Uhrzeit der Erstellung verwendet werden sollen)."

Nur leider bewirkt das an meinem PC (Server), dass alle Dateien das heutige Datum bekommen und nicht mehr ihr Erstellungsdatum behalten.

Interessant ist auch noch, dass nur Dateien verschoben werden, die keine Leerzeichen im Namen haben. Aber das habe ich mit einigen Anführungszeichen hinbekommen.

Was allerdings FÜR die Geschachtelte Variante spricht, ist dass er die Dateien, die größer sind als 999.999 sonst nicht mit kopiert.

Also bleibe ich doch lieber bei meiner Variante und
- lösche das "tc" hinter dir
- setze das "%%d" im move- Befehl in Anführungszeichen.
Member: bastla
bastla Mar 27, 2012 at 14:21:16 (UTC)
Goto Top
Hallo AD-Mike!
Interessant ist auch noch, dass nur Dateien verschoben werden, die keine Leerzeichen im Namen haben. Aber das habe ich mit einigen Anführungszeichen hinbekommen.
2 sollten schon gereicht haben (in meinem Ansatz für "%%f") ...
Das geschilderte Verhalten hinsichtlich "/tc" klingt abenteuerlich ... face-wink
Bezüglich
Dateien, die größer sind als 999.999 sonst nicht mit kopiert.
ist Dir vermutlich der Schalter "/-c" entgangen - dadurch werden nämlich bei der Angabe der Größe in Bytes keine Tausendertrennzeichen (also Punkte, und die dienen ja als Delimiter) angezeigt ...
Also bleibe ich doch lieber bei meiner Variante
Mach nur ...

Grüße
bastla