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.
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.
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 204421
Url: https://administrator.de/contentid/204421
Ausgedruckt am: 20.11.2024 um 18:11 Uhr
16 Kommentare
Neuester Kommentar
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.
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
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 ) jeden Unterordner und jede Datei im als Aufrufparameter (zum Testen zB auch per Drag & Drop) übergebenen Startordner:
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
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 ) 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
Grüße
bastla
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:
Ob Du das Verschieben dann per "
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
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!
)
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
Hallo cr0sscut!
- mehr zu "
"
Grüße
bastla
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%"
)
xcopy
" erfährst Du mit "xcopy /?
"."
robocopy
" würde sogar ein direktes Verschieben ("/move
") ermöglichen ...Grüße
bastla
Hallo cr0sscut!
Die Anforderung ist ja
Grüße
bastla
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
Hallo cr0sscut!
Mit leichter Verspätung eine hoffentlich funtionierende Version des Scripts:
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
Grüße
bastla
Mit leichter 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
'
setzen.Grüße
bastla
Hallo cr0sscut!
Welche Ordnerebene Du genau meinst, ist mir zwar nicht zweifelsfrei klar, aber mit einem Batch der Art
kannst Du alle Ordner unterhalb des Quellpfades einzeln behandeln ...
Grüße
bastla
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"
)
)
Grüße
bastla
Hallo cr0sscut!
Du kannst ja zwei Schleifen schachteln:
Grüße
bastla
P.S.: Wie "Code"-Formatierung geht, steht hier ...
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"
)
)
bastla
P.S.: Wie "Code"-Formatierung geht, steht hier ...