acjoker
Goto Top

Batch zum verschieben von Ordnern anhand des Erstellungsdatums

Hallo,

ich würde gerne mittels Batch Ordner verschieben, und zwar in neue Ordner die dem Monat der Erstellung der Ursprungsordner entsprechen.

Beispiel

Quelle
F:\Test\ABC1.RAW vom 01.05.2016
F:\Test\ABC2.RAW vom 10.06.2017
F:\Test\ABC3.RAW vom 15.07.2017

ABC*.RAW ist hier ein Ordner und keine Datei

Ziel

F:\Test2\2016\05\ABC1.RAW
F:\Test2\2017\06\ABC2.RAW
F:\Test2\2017\07\ABC3.RAW

Bisheriger Ansatz

echo off
FOR /f "skip=7 tokens=1,4" %%f IN ('dir /tc F:\Test') DO (  
echo %%f %%g

SET "Datum=%%f"  
SET "Ordner=%%g"  
echo %Datum% %Ordner%
FOR /f "tokens=1-3 delims=." %%a IN ("%Datum%") DO ECHO MOVE F:\Test\%Ordner%\*.* F:\Test2\%%c\%%b\%Ordner%  
)


%%f gibt mir das Datum (DD.MM.YYYY) aus
%%g gibt mir den Ordnernamen aus "ABC1.RAW"
01.05.2016 ABC1.RAW

Da ich das Datum selektiert nach Jahr und Monat brauche, muss ich dies noch auflösen.
Leider scheitert es dann aber schon am setzen der Variabeln.
echo %Datum% %Ordner% liefert
"3 Bytes"
was ich mir nicht erklären kann.

Ich bin was das Programmieren angeht Anfänger.
Habe zwar schon ein paar größere Excel Makros geschrieben, mit AHK einiges automatisiert und auch an einem Raspberry Pi mit Phyton eigenständig gearbeitet, aber ich bin leider immer wieder auf Hilfe angewiesen da ich eben noch große Lücken habe. Isdt halt doch nur Hobby und immer problembasiert.

Mein Script stammt zum Teil aus diesem Beitrag:
Batch zum verschieben von Dateien nach Datum und erstellung von Ordner
Was ich leider auch noch nicht umsetzen konnte ist das Filtern der Kopf- und Fußzeile der DIR Ausgabe. Vor allem die Fußzeilen machen wir probleme.
Auch dieser umfangreiche Artikel hat mir da leider nicht weiter geholfen.
https://www.axel-hahn.de/batch/helferlein-und-tabellen/alle-windows-komm ...

Es wäre schön wenn ihr mir unter die Arme greifen würdet. Danke.

Gruß
Joker

Content-ID: 343593

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

Ausgedruckt am: 24.11.2024 um 21:11 Uhr

rubberman
Lösung rubberman 16.07.2017 um 13:39:17 Uhr
Goto Top
Die Option /b für DIR zu verwenden könnte einfacher sein, ebenso die entsprechenden Modifiers der FOR Variablen zu nutzen, aber naja geht auch so.
Was nicht funktioniert, ist, eine normale Umgebungsvariable zu ihrem neuen Wert zu expandieren, wenn sie innerhalb desselben Klammerausdrucks verändert wurde. Dafür gibt es die verzögerte Variablenerweiterung. Aber das brauchst du hier alles nicht, weil du direkt mit den FOR Variablen arbeiten kannst.
@echo off &setlocal
for /f "tokens=1,3*" %%i in ('dir /ad /tc^|findstr /rc:"\<<DIR>\>"^|findstr /rvc:"\<\.\.*\>"') do for /f "tokens=2,3 delims=." %%l in ("%%i") do (  
  echo %%m %%l "%%k"  
)
pause
Grüße
rubberman
133417
133417 16.07.2017, aktualisiert am 18.07.2017 um 12:32:16 Uhr
Goto Top
Und mit Powershell löst man sowas heutzutage so
$source = 'F:\Test'   
$target = 'F:\Test2'  
gci $source | ?{$_.PSIsContainer} | group {$_.CreationTime.toString('yyyy\\MM')} | %{  
    $f = "$target\$($_.Name)"  
    if(!(Test-Path $f)){md $f -Force | out-null}
    $_.Group | move-item -Destination $f -recurse -force
}

Gruß
AcJoker
AcJoker 16.07.2017 um 22:21:33 Uhr
Goto Top
Danke für deine Hilfe.

Leider bin ich mir nicht sicher wo ich jetzt meinen Quellpfad eintragen muss.

Die Strings "\<<DIR>\>" und "\<\.\.*\>" sagen mir leider nichts.
Sind aber wohl zum filtern der Liste gedacht. Damit Kopf und Fußzeilen nicht stören.

https://technet.microsoft.com/de-de/library/cc732459(v=ws.10).aspx
rubberman
Lösung rubberman 16.07.2017 um 22:56:11 Uhr
Goto Top
Leider bin ich mir nicht sicher wo ich jetzt meinen Quellpfad eintragen muss.
Warum? Ist doch auch nicht anders als vorher. Ungetestet:
@echo off &setlocal
set "src=F:\Test"  
set "dst=F:\Test2"  

for /f "tokens=1,3*" %%i in ('dir /ad /tc "%src%"^|findstr /rc:"\<<DIR>\>"^|findstr /rvc:"\<\.\.*\>"') do for /f "tokens=2,3 delims=." %%l in ("%%i") do (  
  2>nul md "%dst%\%%m\%%l"  
  move "%src%\%%k\*.*" "%dst%\%%m\%%l\"  
)


Die Strings "\<<DIR>\>" und "\<\.\.*\>" sagen mir leider nichts.
Sind aber wohl zum filtern der Liste gedacht.
Du hast doch nun bereits auf die TechNet Seite mit der Referenz verlinkt face-sad Ja, ist zum Filtern. Auch wenn Option /ad des DIR Kommandos nur Verzeichnisse ausgibt, so könnten das aber auch Junctions sein. Der erste Filter ist also für Zeilen die die Zeichenfolge <DIR>enthalten (3.Spalte). Die Ausgabe enthält nun aber in der 4. Spalte noch .und ..für dasselbe bzw. das übergeordnete Verzeichnis, die mit Option /v aussortiert werden.

Grüße
rubberman
AcJoker
AcJoker 26.12.2017 um 23:06:54 Uhr
Goto Top
Hallo,

auch wenn inzwischen reichlich Zeit vergangen ist, möchte ich mich kurz zurückmelden.

Leider bin ich tatsächlich erst jetzt dazu gekommen an dem Problem weiter zu arbeiten. face-sad
Aber ich konnte es nun dank diesem Forum lösen. face-smile

Dennoch sorry für die nicht erfolgte Rückmeldung bis jetzt.

Mein finaler Code

@echo off &setlocal
set "src=E:\Test"  
set "dst=E:\Test2"  
set "dstBackup=E:\TestBackup"  
set "z=%date%"  
set "sortdate=%z:~6,4%%z:~3,2%%z:~0,2%"  

xcopy "%src%\*.*" "%dstBackup%\%sortdate%\" /E/I  

for /f "tokens=1,3*" %%i in ('dir /ad /tc "%src%"^|findstr /rc:"\<<DIR>\>"^|findstr /rvc:"\<\.\.*\>"') do for /f "tokens=2,3 delims=." %%l in ("%%i") do (  
  2>nul md "%dst%\%%m\%%l\%%k"  
  move "%src%\%%k\*.*" "%dst%\%%m\%%l\%%k"  
)

Ich habe noch eine kleine Backup Funktion vorgeschaltet damit die Daten nicht verloren gehen wenn beim verschieben etwas schief gehen sollte.

Der Code von Rubberman war passend.
Ich musste lediglich bei MOVE noch ein %%k beim Ziel ergänzen.


Auch die Powershell Variante von 133417 habe ich mal versucht, bin aber leider gescheitert.
Es werden zwar die passenden Ordner erstellt, aber leider nichts dorthin verschoben.
Da der Code für mich leider nicht ohne weitere zu interpretieren ist, selbst mit Google nicht, habe ich damit leider aufgeben müssen.
Auch wenn Powershell vermutlich moderne und langfristig besser wäre.

Beste Grüße
Joker