2009-08-20 3 views
0

Jede Nacht muss ich arbeiten an einem Ordner 36 Tage alt vom aktuellen Datum. Ich habe ein System, das Dateien in eine tägliche Struktur wie folgt schreibt. Ich muss 35 Tage auf der lokalen Festplatte halten und so muss ich jede Nacht den 36. Tag archivieren. Hier ist der Kicker ... Es gibt ca. 2 Millionen Dateien pro Tag, so dass ich den gesamten 2009 Ordner nicht effizient scannen kann und nur Dateien älter als 35 Tage verschieben kann. Was ich tun muss, ist, obwohl ein Batch-Skript den Pfad des Ordners, der 36 Tage alt ist, bestimmen und dann meine Archivlogik anwenden. Ich habe Skripte zu bestimmen, aber Schwierigkeiten haben, die Bestimmung zu 36 Tage alt. Im Notfall kann ich Perl verwenden, wenn es keine Batch-Möglichkeit gibt, dies zu tun. --ShawnCMD/BAT - Hilfe bestimmend Datum vor 36 Tagen

Ordnerstruktur ist wie folgt:

2009\07\01 
2009\07\02 
2009\07\03 
. 
. 
. 
2009\08\01 
2009\08\02 
2009\08\03 

@EDIT: Helens große Antwort hat mir 99% des Weges dorthin. Mein einziges Problem ist, dass der Monat und der Tag außerhalb der Vbs nicht mit einer Null aufgefüllt wird, mit der ich in der Ordnerstruktur umgehen muss. Hat jemand eine einfache Möglichkeit, in einer führenden 0 zu puffern, wenn der Tag oder Monat weniger als 10 ist? Hier

ist, was ich bisher tue:

for /F "tokens=1-3 delims=/" %%x in ('cscript //nologo get36thday.vbs') do (
    SET YYYY=%%z 
    SET MM=%%x 
    SET DD=%%y) 

außer% MM% endet als 7 statt 07

Antwort

0

Der Ansatz Art und Weise würde das Datum zu bestimmen, zu compilcated ein paar Zeilen Code sein würde; Es ist viel einfacher, ein Skript dafür zu verwenden. Leider kein Perl Probe, sondern ein VBScript ein:

WScript.Echo DateAdd("d", Date, -36) 

Sie dieses Skript aus einer Batch-Datei aufrufen und die berechnete Datum wie folgt lesen:

for /f %%d in ('cscript //nologo datediff.vbs') do set dt=%%d 
1

Die Batch-Option ziemlich abgefahren ist, müssen Sie berechnen, welcher Monat ist dann basierend auf diesem Lauf eine while-Schleife, die die Tage herunterzählt. Ich würde hohe perl empfehlen, da es

mit dem Datetime-Modul von CPAN

http://search.cpan.org/dist/DateTime/lib/DateTime.pm

my $dt = DateTime->now->subtract(days => 36); 
0

Wenn Sie hier mit Google wie mir kam:
Um die führenden Nullen in der .vbs zu beheben, füge ich eine Null vor und entferne die rechten 2 Zeichen.
"0" & "7" -> "07" und "0" & "14" -> "14"

OldDateCode.vbs:

OldDate = DateAdd("d", Date, -36) 
DateCode = Year(OldDate) & Right("0" & Month(OldDate), 2) & Right("0" & Day(OldDate), 2) 
WScript.Echo DateCode 

Ich wollte auch die ersten Ordner halten von der Monat so vergleiche ich die letzten zwei Ziffern (Tag) mit "01"
VBS-Code für den 1. Tag zu überprüfen:

If Right(DateCode, 2)="01" then 
    WScript.Echo "The 1st:" & vbCrLf & DateCode 
Else 
    WScript.Echo "Not the 1st:" & vbCrLf & DateCode 
End If 

CheckDate.bat:

@Echo Off 
Set Folder=D: 

for /f %%d in ('cscript //nologo OldDateCode.vbs') do set OldDateCode=%%d 

If "%OldDateCode:~6,7%"=="01" (
    Echo "Old Backup: %OldDateCode% 1st of the month: keeping..." 
) ELSE (
    Echo "Old Backup: %OldDateCode% not the 1st of the month: removing..." 
    RD /S /Q "%Folder%\%OldDateCode%" 
) 
pause 

Erstellen Sie einen Ordner in D: \ mit dem Datumscode von vor 36 Tagen. Spielen Sie mit dem -36 und den Datumscodes herum.

Verwandte Themen