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
GELÖST

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

Frage Entwicklung Batch & Shell

Mitglied: cr0sscut

cr0sscut (Level 1) - Jetzt verbinden

04.04.2013, aktualisiert 14:31 Uhr, 1919 Aufrufe, 16 Kommentare, 3 Danke

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.
Mitglied: tobdad
04.04.2013 um 14:34 Uhr
Versuch es doch über PowerShell:

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

Musst hald noch ein bisschen ausbauen das Ganze...
Bitte warten ..
Mitglied: miniversum
04.04.2013 um 15:09 Uhr
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.

01.
@echo off 
02.
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 
03.
FOR /F "tokens=1,2,3 delims=.: " %%i in ('echo %date%') do set now=%%k%%j%%i 
04.
set /a t=now-300 
05.
echo %t% 
06.
pause
Bitte warten ..
Mitglied: bastla
04.04.2013, aktualisiert 28.05.2013
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:
01.
Alter = 90 'Tage 
02.
 
03.
If WScript.Arguments.Count < 1 Then 
04.
    WScript.Echo "Bitte mit Übergabe eines Ordners aufrufen!" 
05.
    WScript.Quit 1 
06.
End If 
07.
Pfad = WSCript.Arguments(0) 
08.
 
09.
Set fso = CreateObject("Scripting.FileSystemObject") 
10.
If Not fso.FolderExists(Pfad) Then 
11.
    WScript.Echo "Ordner """ & Pfad & """ nicht gefunden!" 
12.
    WScript.Quit 2 
13.
End If 
14.
 
15.
Timestamp = Date() - Alter 
16.
Old = True 
17.
CheckAge fso.GetFolder(Pfad) 
18.
If Old Then 
19.
    WScript.Echo """" & Pfad & """ verschieben!" 
20.
Else 
21.
    WScript.Echo """" & Pfad & """ nicht verschieben!" 
22.
    WScript.Quit 3 
23.
End If 
24.
 
25.
Sub CheckAge(Ordner) 
26.
For Each Datei In Ordner.Files 
27.
    If Datei.DateLastModified >= Timestamp Then 
28.
        Old = False 
29.
        Exit Sub 
30.
    End If 
31.
    For Each Unter In Ordner.SubFolders 
32.
        If Unter.DateLastModified >= Timestamp Then 
33.
            Old = False 
34.
            Exit Sub 
35.
        End If 
36.
        CheckAge(Unter) 
37.
    Next 
38.
Next 
39.
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
Bitte warten ..
Mitglied: cr0sscut
05.04.2013 um 07:26 Uhr
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!
Bitte warten ..
Mitglied: bastla
05.04.2013 um 12:18 Uhr
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:
01.
cscript //nologo C:\Scripts\CheckAge.vbs "D:\Der\zu\prüfende\Ordner" && ( 
02.
    echo Verschieben! 
03.
)
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
Bitte warten ..
Mitglied: cr0sscut
28.05.2013 um 10:07 Uhr
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.
Bitte warten ..
Mitglied: bastla
28.05.2013 um 17:27 Uhr
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:
01.
set "Quellpfad=D:\Der\zu\prüfende" 
02.
set "Ordner=Ordner" 
03.
set "Ziel=D:\LD GD\Archiv Allgemein" 
04.
cscript //nologo C:\Scripts\CheckAge.vbs "%Quellpfad%\%Ordner%" && ( 
05.
    xcopy /ehkr "%Quellpfad%\%Ordner%%" "%Ziel%\%Ordner%\" && rd /s /q "%Quellpfad%\%Ordner%" 
06.
)
- mehr zu "xcopy" erfährst Du mit "xcopy /?".

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

Grüße
bastla
Bitte warten ..
Mitglied: cr0sscut
29.05.2013 um 08:58 Uhr
Hallo bastla,

danke für deine Hilfe! 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!
Bitte warten ..
Mitglied: bastla
29.05.2013 um 12:39 Uhr
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
Bitte warten ..
Mitglied: cr0sscut
29.05.2013 um 13:51 Uhr
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 ...

Danke & Grüße
Bitte warten ..
Mitglied: bastla
07.06.2013, aktualisiert um 19:52 Uhr
Hallo cr0sscut!

Mit leichter Verspätung eine hoffentlich funtionierende Version des Scripts:
01.
Alter = 90 'Tage 
02.
 
03.
If WScript.Arguments.Count < 1 Then 
04.
    WScript.Echo "Bitte mit Übergabe eines Ordners aufrufen!" 
05.
    WScript.Quit 1 
06.
End If 
07.
Pfad = WSCript.Arguments(0) 
08.
 
09.
Set fso = CreateObject("Scripting.FileSystemObject") 
10.
If Not fso.FolderExists(Pfad) Then 
11.
    WScript.Echo "Ordner """ & Pfad & """ nicht gefunden!" 
12.
    WScript.Quit 2 
13.
End If 
14.
 
15.
Timestamp = Date() - Alter 
16.
Old = True 
17.
CheckAge fso.GetFolder(Pfad) 
18.
If Old Then 
19.
    WScript.Echo """" & Pfad & """ verschieben!" 
20.
Else 
21.
    WScript.Echo """" & Pfad & """ nicht verschieben!" 
22.
    WScript.Quit 3 
23.
End If 
24.
 
25.
Sub CheckAge(Ordner) 
26.
For Each Datei In Ordner.Files 
27.
    If Datei.DateLastModified >= Timestamp Then 
28.
        Old = False 
29.
        Exit Sub 
30.
    End If 
31.
Next 
32.
For Each Unter In Ordner.SubFolders 
33.
    If Unter.DateLastModified >= Timestamp Then 
34.
        Old = False 
35.
        Exit Sub 
36.
    End If 
37.
    CheckAge(Unter) 
38.
Next 
39.
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
Bitte warten ..
Mitglied: cr0sscut
10.06.2013 um 11:23 Uhr
Hallo bastla, funktioniert super. Vielen Dank schonmal dafür! 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. Ich hoffe man versteht das, was ich hier jetzt geschrieben habe. ;)

Viele Dank im Voraus.
Bitte warten ..
Mitglied: bastla
10.06.2013 um 13:41 Uhr
Hallo cr0sscut!

Welche Ordnerebene Du genau meinst, ist mir zwar nicht zweifelsfrei klar, aber mit einem Batch der Art
01.
set "Quellpfad=C:\Ordner\Unterordner" 
02.
set "Ordner=Ordner" 
03.
set "Ziel=D:\LD GD\Archiv Allgemein" 
04.
 
05.
for /d %%i in ("%Quellpfad%\*") do ( 
06.
    cscript //nologo C:\Scripts\CheckAge.vbs "%%i" && ( 
07.
        xcopy /ehkr "%%i" "%Ziel%\%%~nxi\" && rd /s /q "%%i" 
08.
09.
)
kannst Du alle Ordner unterhalb des Quellpfades einzeln behandeln ...

Grüße
bastla
Bitte warten ..
Mitglied: cr0sscut
10.06.2013 um 14:51 Uhr
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.

Danke im Voraus.
Bitte warten ..
Mitglied: bastla
10.06.2013 um 15:12 Uhr
Hallo cr0sscut!

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

P.S.: Wie "Code"-Formatierung geht, steht hier ...
Bitte warten ..
Mitglied: cr0sscut
17.07.2013 um 14:12 Uhr
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!
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(8)

Tipp von agowa338 zum Thema Windows 10 ...

Ähnliche Inhalte
Microsoft
Ordner mit LW-Buchstaben versehen und benennen (21)

Frage von Xaero1982 zum Thema Microsoft ...

Exchange Server
Inhalt von Postfächern in Exchange löschen (9)

Frage von m.reeger zum Thema Exchange Server ...

Heiß diskutierte Inhalte
Microsoft
Ordner mit LW-Buchstaben versehen und benennen (21)

Frage von Xaero1982 zum Thema Microsoft ...

Netzwerkmanagement
gelöst Anregungen, kleiner Betrieb, IT-Umgebung (18)

Frage von Unwichtig zum Thema Netzwerkmanagement ...

Windows Update
Treiberinstallation durch Windows Update läßt sich nicht verhindern (17)

Frage von liquidbase zum Thema Windows Update ...