sysx220
Goto Top

Batch Datei mit for Hilfe zum Ändern

Hallo Admins,

ich bräuchte eure Hilfe beim abändern von einer Batchdatei die ich geschrieben habe. Habe leider keinen richtigen Ansatz und google hab ich fast alle links durch.

Das Skript verschiebt die Daten vom Quellordner zum Zielordner und erstellt Unterordner nach Kalenderjahr (Änderungsdatum) und sortiert diese dann dahin.
Das funktioniert auch soweit, nur möchte ich gerne noch einbauen, dass nur Dateien die älter als 30 Tage alt sind verschoben werden, wie mach ich das am Besten?
Ich denke mit einer IF Bedingung aber weiß leider nicht wie ich das mit for bzw. if NOT nochmal kombinieren kann.

@Echo off & setlocal
set "Quelle=C:\Temp\Test_Copy\"  
set "Ziel=C:\Temp\copied\"  


for %%a in ("%Quelle%*") do (  
    if NOT "%%~nxa"=="%~nx0" (  
        Echo Verarbeite Datei "%%a"  
        set "fdate=%%~ta"  
        setlocal enabledelayedexpansion
        set "fday=!fdate:~0,2!"  
        set "fmonth=!fdate:~3,2!"  
        set "fyear=!fdate:~6,4!"  
        set "folname=!fyear!"  
        md "%Ziel%!folname!" 2>nul  
        Echo Verschiebe Datei "%%a" nach "!folname!"  
        move "%%a" "%Ziel%!folname!\"  
        endlocal
    )
)

Danke schonmal!

Content-ID: 347210

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

Ausgedruckt am: 22.11.2024 um 10:11 Uhr

MrCount
MrCount 24.08.2017 um 15:28:49 Uhr
Goto Top
Servus,


da solltest du dir FORFILES mal anschauen.
Besonders den Parameter /d
sysx220
sysx220 24.08.2017 um 15:56:33 Uhr
Goto Top
forfiles kenne ich bereits aber ich wüsste nicht wie ich die automatische Erzeugung von den Jahresordnern damit hinkriege.

Hast du mir da was? Generiert aus dem Änderungsdatum?

Merci
MrCount
MrCount 24.08.2017 um 16:17:23 Uhr
Goto Top
nur möchte ich gerne noch einbauen, dass nur Dateien die älter als 30 Tage alt sind verschoben werden, wie mach ich das am Besten?

Indem du einfach anstatt für alle Dateien
for %%a in ("%Quelle%*")  

den Code eben nur für die Dateien laufen lässt, die älter als 30 Tage sind...
z.B.:
forfiles /p %Quelle% /m *.* /d -30 .......

Hierzu noch @File ...
sysx220
sysx220 24.08.2017 um 16:32:34 Uhr
Goto Top
Naja schön und gut das wäre nur die halbe Miete.
Ich brauche die Funktion dass die verschobenen Dateien in automatisch erstellte Ordner verschoben werden

bsp. Datei hat Änderungsdatum xx.xx.2017 --> wird in c:\x\2017 verschoben.

Und das scheint wie ich gesehen habe mit forfiles nicht zu funktionieren. Sondern lediglich alle von Quelle x zu Ziel x.

Trotzdem danke.
133883
Lösung 133883 24.08.2017, aktualisiert am 25.08.2017 um 15:58:08 Uhr
Goto Top
Zitat von @sysx220:

Naja schön und gut das wäre nur die halbe Miete.
Ich brauche die Funktion dass die verschobenen Dateien in automatisch erstellte Ordner verschoben werden

bsp. Datei hat Änderungsdatum xx.xx.2017 --> wird in c:\x\2017 verschoben.

Und das scheint wie ich gesehen habe mit forfiles nicht zu funktionieren. Sondern lediglich alle von Quelle x zu Ziel x.
Doch du musst du nur forfiles als Quelle der FOR-Schleife benutzen
@echo off & setlocal ENABLEDELAYEDEXPANSION
set "quelle=C:\Temp\Test_Copy"  
set "ziel=C:\Temp\copied"  
for /f "delims=" %%a in ('forfiles /P "%quelle%" /d -30 /c "cmd /c echo @path"') do (  
	set "d=%%~ta"  
	set "targetfolder=%ziel%\!d:~6,4!"  
	if not exist "!targetfolder!" md "!targetfolder!" >nul  
	move "%%~a" "!targetfolder!\"  
)
, aber naja sowas macht man ja heutzutage sowieso mit Powershell, anstatt mit dem "antiquierten" Batch:
$quelle = "C:\Quelle"  
$ziel = "C:\ziel"  
gci $quelle -Filter *.* | ?{$_.LastWriteTime -lt (get-date).AddDays(-30)} | group {$_.LastWriteTime.Year} | %{
    # Zielordner der Gruppe festlegen
    $targetfolder = "$ziel\$($_.Name)"  
    # wenn Zielordner noch nicht existiert erstelle ihn
    if(!(Test-path $targetfolder)){md $targetfolder}
    # Alle Dateien der Gruppe in den Zielordner verschieben
   $_.Group | move-item -Destination $targetfolder -Force
}
Fettich, Affe tot ...

Gruß
sysx220
sysx220 25.08.2017 um 09:41:35 Uhr
Goto Top
Top! Vielen Dank du bist mein Held face-smile hätte es auch lieber mit Powershell gemacht aber hab da leider 0 know how, ich warte auf meine versprochene Schulung oder Zeit mir das aneignen zu können.