cr0sscut
Goto Top

Kompletten Ordner ,dessen Inhalt länger als X Tage nicht modifiziert wurde, verschieben!

Hallo zusammen,

leider komm ich mit Hilfe meiner Batch Kenntnisse wieder nicht bis ans Ziel und würde mich über Eure Hilfe sehr freuen. Folgendes Problem gilt es zu bewältigen:

Ich möchte mit Hilfe einer Batch Datei Ordner + Inhalt (Unterordner, Dateien, ...) verschieben und anschließend im Quellverzeichnis löschen. Jedoch darf der "Oberordner" + Inhalt nur verschoben werden, wenn dessen Inhalt länger als 90 Tage (3 Monate) nicht mehr modifiziert worden ist. Sprich wenn auch nur eine Datei im Ordner vor weniger als 90 Tagen modifiziert wurde, soll der Ordner und auch der Inhalt nicht verschoben werden.

Über einen hilfreichen Tip oder sogar eine Lösung wäre ich Euch sehr dankbar.

Danke im Voraus.

Content-Key: 204421

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

Ausgedruckt am: 28.03.2024 um 16:03 Uhr

Mitglied: datoda
datoda 04.04.2013 um 14:34:35 Uhr
Goto Top
Versuch es doch über PowerShell:

Get-ChildItem | ? { ($_.LastModifiedTime -gt (Get-Date).AddDays(90)) }

Musst hald noch ein bisschen ausbauen das Ganze...
Mitglied: miniversum
miniversum 04.04.2013 um 15:09:10 Uhr
Goto Top
Hallo,

hier mal ein Tip wie du an das Datum des letzten Schreibzugriffs einer Datei kommst. Hie rals beispiel für xls dateien auf einem deutschen Windows. Bei anderssprachigen Versionen oder veränderten Ländereinstellungen kann es sein das die delims angepasst werden müssen.
set /a t=now-300 ist eine kurze Version um 3 Monatte zurück zu gehen (von heute an). Das funktioniert natürlich nicht bei überschreiben einer Jahresgrenze. Hier müsste alles in Tage umgerechnet werden.

@echo off
FOR /F "delims=" %%f in ('dir *.xls /B') do FOR /F "tokens=1,2,3 delims=.: " %%i in ('dir "%%f" /TW^|find "%%f"') do echo File: %%f Time: %%k%%j%%i  
FOR /F "tokens=1,2,3 delims=.: " %%i in ('echo %date%') do set now=%%k%%j%%i  
set /a t=now-300
echo %t%
pause
Mitglied: bastla
bastla 04.04.2013, aktualisiert am 28.05.2013 um 16:12:31 Uhr
Goto Top
Hallo cr0sscut und willkommen im Forum!

Das folgende VBScript (Batch ist, wie miniversum schon angeführt hat, für Datumsberechnungen nur bedingt geeignet) untersucht wie gewünscht (aber dadurch auch eher gemächlich face-wink) jeden Unterordner und jede Datei im als Aufrufparameter (zum Testen zB auch per Drag & Drop) übergebenen Startordner:
Alter = 90 'Tage  

If WScript.Arguments.Count < 1 Then
    WScript.Echo "Bitte mit Übergabe eines Ordners aufrufen!"  
    WScript.Quit 1
End If
Pfad = WSCript.Arguments(0)

Set fso = CreateObject("Scripting.FileSystemObject")  
If Not fso.FolderExists(Pfad) Then
    WScript.Echo "Ordner """ & Pfad & """ nicht gefunden!"  
    WScript.Quit 2
End If

Timestamp = Date() - Alter
Old = True
CheckAge fso.GetFolder(Pfad)
If Old Then
    WScript.Echo """" & Pfad & """ verschieben!"  
Else
    WScript.Echo """" & Pfad & """ nicht verschieben!"  
    WScript.Quit 3
End If

Sub CheckAge(Ordner)
For Each Datei In Ordner.Files
    If Datei.DateLastModified >= Timestamp Then
        Old = False
        Exit Sub
    End If
    For Each Unter In Ordner.SubFolders
        If Unter.DateLastModified >= Timestamp Then
            Old = False
            Exit Sub
        End If
        CheckAge(Unter)
    Next
Next
End Sub
Zum Testen erfolgt zunächst nur eine Ausgabe - auch, da Du über die näheren Umstände (zB Zielordner für das Verschieben) noch nicht viel gesagt hast ...

Grüße
bastla
Mitglied: cr0sscut
cr0sscut 05.04.2013 um 07:26:02 Uhr
Goto Top
Hallo zusammen,

danke vorab für die schnellen Antworten. Leider verfüge ich nicht (mehr) wirklich über VB Kentnisse umd auf die Antwort / den Quellcode von bastla zu kommen. Die Grundkenntnisse waren wohl mal vorhanden, aber das ist leider zulange her. Wie auch immer. Mit der Lösung kann ich mich denke ich dennoch am ehesten anfreunden.

Bezgl. den näheren Umständen. Zielverzeichnis ist bei mir D:\LD GD\Archiv Allgemein\

Werden sonst noch Infos benötigt?

Ich hab schon ein schlechtes Gewissen wenn ich da nicht wirklich selbst einschreiten kann. Sorry! face-confused
Mitglied: bastla
bastla 05.04.2013 um 12:18:42 Uhr
Goto Top
Hallo cr0sscut!

Das Script ist so geschrieben, dass Du es auch aus einem Batch verwenden könntest - da es einen Errorlevel 0 nur für den Fall "Ordner verschieben" liefert, könnte das Verschieben auch per Batch erfolgen:
cscript //nologo C:\Scripts\CheckAge.vbs "D:\Der\zu\prüfende\Ordner" && ( 
    echo Verschieben!
)
Ob Du das Verschieben dann per "move", mit "robocopy" oder tatsächlich durch Kopieren und nachträgliches Löschen umsetzt, kannst Du ja noch überlegen / testen - den/die Befehl/e dafür einfach zwischen den Klammern eintragen ...

Ansonsten wäre noch zu überlegen, zB den Namen des Zielordner mit einem Datum zu ergänzen - damit könntest Du dann auch mehrere Versionen archivieren.

Grüße
bastla
Mitglied: cr0sscut
cr0sscut 28.05.2013 um 10:07:57 Uhr
Goto Top
Hallo bastla,

wie genau ist es dann mit z.B. xcopy zu lösen?

XCOPY und dann direkt das Zielverzeichnis angeben? Oder muss ich XCOPY noch zuweisen was es zu kopieren hat, bzw. wie muss ich das hier in diesem Fall anstellen?

Danke im Voraus für deine Antwort.
Mitglied: bastla
bastla 28.05.2013 um 17:27:30 Uhr
Goto Top
Hallo cr0sscut!
Oder muss ich XCOPY noch zuweisen was es zu kopieren hat, bzw. wie muss ich das hier in diesem Fall anstellen?
Den Quellordner musst Du ja ohnehin schon kennen (sonst kann ihn ja das VBScript nicht prüfen) - daher passend zu meinem obigen Beispiel zB:
set "Quellpfad=D:\Der\zu\prüfende"  
set "Ordner=Ordner"  
set "Ziel=D:\LD GD\Archiv Allgemein"  
cscript //nologo C:\Scripts\CheckAge.vbs "%Quellpfad%\%Ordner%" && (  
    xcopy /ehkr "%Quellpfad%\%Ordner%%" "%Ziel%\%Ordner%\" && rd /s /q "%Quellpfad%\%Ordner%"  
)
- mehr zu "xcopy" erfährst Du mit "xcopy /?".

"robocopy" würde sogar ein direktes Verschieben ("/move") ermöglichen ...

Grüße
bastla
Mitglied: cr0sscut
cr0sscut 29.05.2013 um 08:58:03 Uhr
Goto Top
Hallo bastla,

danke für deine Hilfe! face-smile Habe den Quelltext nun mal in eine .bat gepackt und angepasst.

Leider macht das Ganze nun ein Vollbackup von ALLEN Ordnern, sprich die .vbs (Prüfen >90 Tage) wird ignoriert. Eventuell eine Idee woran das liegen kann?

Danke im Voraus! face-smile
Mitglied: bastla
bastla 29.05.2013 um 12:39:32 Uhr
Goto Top
Hallo cr0sscut!

Die Anforderung ist ja
Ordner + Inhalt (Unterordner, Dateien, ...) verschieben und anschließend im Quellverzeichnis löschen. Jedoch darf der "Oberordner" + Inhalt nur verschoben werden, wenn dessen Inhalt länger als 90 Tage (3 Monate) nicht mehr modifiziert worden ist. Sprich wenn auch nur eine Datei im Ordner vor weniger als 90 Tagen modifiziert wurde, soll der Ordner und auch der Inhalt nicht verschoben werden.
- daher wird ab dem angegebenen Oberordner geprüft und dieser ggf samt Inhalt (eben mit allen Unterordnern und Dateien) verschoben ...

Grüße
bastla
Mitglied: cr0sscut
cr0sscut 29.05.2013 um 13:51:59 Uhr
Goto Top
Hallo bastla,

richtig, nur werden auch Ordner kopiert/verschoben wo zum Beispiel auch noch Dateien drin liegen, welche am (z.B.) 13.05.2013 das letzte mal geändert worden sind ... face-sad

Danke & Grüße
Mitglied: bastla
bastla 07.06.2013 aktualisiert um 19:52:56 Uhr
Goto Top
Hallo cr0sscut!

Mit leichter face-wink Verspätung eine hoffentlich funtionierende Version des Scripts:
Alter = 90 'Tage  

If WScript.Arguments.Count < 1 Then
    WScript.Echo "Bitte mit Übergabe eines Ordners aufrufen!"  
    WScript.Quit 1
End If
Pfad = WSCript.Arguments(0)

Set fso = CreateObject("Scripting.FileSystemObject")  
If Not fso.FolderExists(Pfad) Then
    WScript.Echo "Ordner """ & Pfad & """ nicht gefunden!"  
    WScript.Quit 2
End If

Timestamp = Date() - Alter
Old = True
CheckAge fso.GetFolder(Pfad)
If Old Then
    WScript.Echo """" & Pfad & """ verschieben!"  
Else
    WScript.Echo """" & Pfad & """ nicht verschieben!"  
    WScript.Quit 3
End If

Sub CheckAge(Ordner)
For Each Datei In Ordner.Files
    If Datei.DateLastModified >= Timestamp Then
        Old = False
        Exit Sub
    End If
Next
For Each Unter In Ordner.SubFolders
    If Unter.DateLastModified >= Timestamp Then
        Old = False
        Exit Sub
    End If
    CheckAge(Unter)
Next
End Sub
Wenn Du übrigens die Ausgabe des Scripts nicht benötigst, kannst Du an den Anfang der Zeilen 19 und 21 (aber nicht 22) jeweils einen Apostroph ' setzen.

Grüße
bastla
Mitglied: cr0sscut
cr0sscut 10.06.2013 um 11:23:26 Uhr
Goto Top
Hallo bastla, funktioniert super. Vielen Dank schonmal dafür! face-smile Jetzt habe ich noch ein Anliegen ...

Dazu einmal die Struktur wie das Ganze hier ausschaut.

C:\Ordner\Unterordner\Zu verschiebender Ordner\Unterordner + Dateien

Bisher muss ich ja den "Zu verschiebender Ordner" in der .vbs zuweisen. Jetzt würde ich aber gerne schon zwei Ordnereben höher gehen, also ab dort prüfen. Ist das möglich? Also zwei Ebenen unter der obersten anfangen zu prüfen? Grund dafür ist, dass die "Zu verschiebender Ordner" in sehr hoher Anzahl vorhanden sind und ich nicht jeden immer wieder eingeben möchte. face-wink Ich hoffe man versteht das, was ich hier jetzt geschrieben habe. ;)

Viele Dank im Voraus. face-smile
Mitglied: bastla
bastla 10.06.2013 um 13:41:30 Uhr
Goto Top
Hallo cr0sscut!

Welche Ordnerebene Du genau meinst, ist mir zwar nicht zweifelsfrei klar, aber mit einem Batch der Art
set "Quellpfad=C:\Ordner\Unterordner"  
set "Ordner=Ordner"  
set "Ziel=D:\LD GD\Archiv Allgemein"  

for /d %%i in ("%Quellpfad%\*") do (  
    cscript //nologo C:\Scripts\CheckAge.vbs "%%i" && (  
        xcopy /ehkr "%%i" "%Ziel%\%%~nxi\" && rd /s /q "%%i"  
    )
)
kannst Du alle Ordner unterhalb des Quellpfades einzeln behandeln ...

Grüße
bastla
Mitglied: cr0sscut
cr0sscut 10.06.2013 um 14:51:53 Uhr
Goto Top
Hallo bastla,

for /d %%i in ("%Quellpfad%\*") do (
cscript //nologo C:\Scripts\CheckAge.vbs "%%i" && (
xcopy /ehkr "%%i" "%Ziel%\%%~nxi\" && rd /s /q "%%i"
)
)

("%Quellpfad%\*") schließt nur eine Ebene ein unter dem Quellpfad ein, brauche hier aber auch die zweite Ebene. Ist das auch möglich?

Sorry, mir ist das hier schon fast peinlich. face-sad

Danke im Voraus.
Mitglied: bastla
bastla 10.06.2013 um 15:12:13 Uhr
Goto Top
Hallo cr0sscut!

Du kannst ja zwei Schleifen schachteln:
for /d %%i in ("%Quellpfad%\*") do for /d %%j in ("%%i\*") do (  
    cscript //nologo C:\Scripts\CheckAge.vbs "%%j" && (  
        xcopy /ehkr "%%j" "%Ziel%\%%~nxi\%%~nxj\" && rd /s /q "%%j"  
    )
)
Grüße
bastla

P.S.: Wie "Code"-Formatierung geht, steht hier ...
Mitglied: cr0sscut
cr0sscut 17.07.2013 um 14:12:14 Uhr
Goto Top
Sorry für die späte Antwort, bin leider erst jetzt wieder im Lande. Hab es nun nochmal probiert und es klappt auf jeden Fall super. 100%ig.

Ich danke dir für die Mühe bastla!