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

Dateien nach Erstellungsdatum in ein Unterordner verschieben

Frage Entwicklung Batch & Shell

Mitglied: AD-Mike

AD-Mike (Level 1) - Jetzt verbinden

16.03.2012, aktualisiert 21.03.2012, 2702 Aufrufe, 5 Kommentare

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:
01.
rem @echo off 
02.
setlocal 
03.
 
04.
 
05.
set "Quelle=J:\Export" 
06.
set "Ziel=J:\Export" 
07.
set "Typ=.pdf" 
08.
 
09.
pushd "%Quelle%" 
10.
 
11.
for /F "tokens=1-3*" %%a in ('dir /a-d /tc *%Typ%^|findstr /i /e "\%Typ%"') do (   
12.
for /F "tokens=1-3 delims=." %%e in (%%a) do ( 
13.
md %Ziel%\%%g 
14.
md %Ziel%\%%g\%%g-%%f 
15.
move %Quelle%\%%d %Ziel%\%%g\%%g-%%f\%%d 
16.
17.
 
18.
19.
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]
Mitglied: bastla
16.03.2012 um 15:39 Uhr
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 ...

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 "Code-Formatierung" verwendet hättest (lässt sich aber ja noch nachholen), wäre das Ganze leichter lesbar ...
Bitte warten ..
Mitglied: AD-Mike
21.03.2012 um 10:36 Uhr
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...
Bitte warten ..
Mitglied: bastla
21.03.2012 um 11:04 Uhr
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
Bitte warten ..
Mitglied: AD-Mike
27.03.2012 um 15:26 Uhr
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.
Bitte warten ..
Mitglied: bastla
27.03.2012 um 16:21 Uhr
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 ...
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
Bitte warten ..
Neuester Wissensbeitrag
CPU, RAM, Mainboards

Angetestet: PC Engines APU 3a2 im Rack-Gehäuse

Erfahrungsbericht von ashnod zum Thema CPU, RAM, Mainboards ...

Heiß diskutierte Inhalte
Grafikkarten & Monitore
Win 10 Grafikkarte Crash von Software? (13)

Frage von Marabunta zum Thema Grafikkarten & Monitore ...

DSL, VDSL
DSL-Signal bewerten (10)

Frage von SarekHL zum Thema DSL, VDSL ...

Windows Server
Mailserver auf Windows Server 2012 (8)

Frage von StefanT81 zum Thema Windows Server ...

Backup
Clients als Server missbrauchen? (8)

Frage von 1410640014 zum Thema Backup ...