Hier ist eine reine Batchdatei, die alle Dateien in einem bestimmten Verzeichnis eines bestimmten Alters, mit folgenden Einschränkungen gibt:
- Daten sind nicht korrekt aufgelöst. Wenn eine Datei im vorherigen Monat geändert wurde, wird sie möglicherweise nicht fälschlicherweise in das Ergebnis aufgenommen. falls das maximale Alter in Tagen definiert werden soll, könnte ein
forfiles
solution vernünftiger sein;
- Dateien, die beide Zeichen
)
und ,
in ihren Pfaden haben, werden in der Ausgabe fehlen; Dies ist wegen einer design flaw of the wmic
command, die zum Abrufen von Gebietsschema-unabhängigen Datum/Uhrzeit-Informationen der letzten Änderung von Dateien verwendet wird;
das Skript nutzen - lassen Sie uns es max-aged-files.bat
nennen -, Befehlszeilenargumente wie folgt liefern:
max-aged-files.bat 15*60 "D:\BatchFiles"
Das erste Argument ist der maximale Alter einer Datei in Sekunden; einfache arithmetische Ausdrücke wie 15*60
werden verstanden. Das zweite Argument ist das Verzeichnis und/oder das Dateimuster, das für die Suche nach Dateien verwendet wird. Sie können hier einen Verzeichnispfad wie angeben oder ein Dateimuster wie "*.bat"
oder eine Kombination wie ; Wenn Sie es weglassen, wird das aktuelle Verzeichnis verwendet. Hier
ist der Code:
@echo off
setlocal EnableExtensions DisableDelayedExpansion
rem /* Please regard that this script cannot handle dates correctly!
rem so if current date and file date are in different months it fails! */
rem // Retrieve and prepare arguments:
set "MAXAGE=%~1" & rem // (maximum age of files in terms of seconds)
if defined MAXAGE (set /A "MAXAGE=%MAXAGE%+0") else (
>&2 echo ERROR: maximum age not specified! & exit /B 1
)
if %MAXAGE% GEQ 86400 (>&2 echo ERROR: maximum age exceeds range! & exit /B 1)
shift /1
set "LOCATION=%~1"
set "ATTR=%~a1"
set "ATTR=%ATTR:~,1%"
if not defined LOCATION (set "LOCATION=.\*.*") else (
if "%ATTR%"=="d" set "LOCATION=%LOCATION%\*.*"
)
rem /* Gather current date/time in standardised format
rem [like: `YYYYMMDDHHMMSS.UUUUUU+ZZZ`]: */
for /F "delims=" %%I in ('wmic OS GET LocalDateTime') do (
for /F "delims=" %%J in ("%%I") do set "CURRTIME=%%J"
)
rem // Extract `YYYYMMSS` portion from current date/time:
set "CURRDATE=%CURRTIME:~,8%"
rem // Extract `HHMMSS` portion from current date/time only:
for /F "delims=." %%T in ("%CURRTIME:~8%") do (
set "CURRTIME=%%T"
)
rem // Loop through all files at given location:
for %%F in ("%LOCATION%") do (
set "ITEM=%%~fF"
setlocal EnableDelayedExpansion
rem // Gather file date/time in standardised format:
for /F "delims=" %%E in ('
2^> nul wmic DataFile WHERE Name^="!ITEM:\=\\!" GET LastModified ^|^|^
2^> nul wmic DataFile WHERE ^(Name^="!ITEM:\=\\!"^) GET LastModified
') do (
for /F "delims=" %%F in ("%%E") do set "FILETIME=%%F"
)
rem // Extract `YYYYMMSS` portion from file date/time:
set "FILEDATE=!FILETIME:~,8!"
rem // Extract `HHMMSS` portion from file date/time:
for /F "delims=." %%T in ("!FILETIME:~8!") do (
set "FILETIME=%%T"
)
rem // Compute date difference between file and current date:
set /A "DATEDIFF=CURRDATE-FILEDATE"
rem // Continue processing only if date difference is zero or one:
if !DATEDIFF! GEQ 0 if !DATEDIFF! LEQ 1 (
rem // Convert date difference to seconds:
set /A "DATEDIFF*=240000"
rem // Compute time difference, regarding also date difference:
set /A "TIMEDIFF=DATEDIFF+1!CURRTIME!-1!FILETIME!"
rem // Pad time difference to consist of 6 digits [like `HHMMSS`]:
set "TIMEDIFF=000000!TIMEDIFF!" & set "TIMEDIFF=!TIMEDIFF:~-6!"
rem // Convert time difference to seconds:
set /A "TIMEDIFF=1!TIMEDIFF:~-2!-100+60*(1!TIMEDIFF:~-4,-2!-100+60*(1!TIMEDIFF:~-6,-4!-100))"
rem // Return item if
if !TIMEDIFF! LEQ %MAXAGE% (
echo(!ITEM!
)
)
endlocal
)
endlocal
exit /B
für Datum/Uhrzeit Mathematik gibt es weder eine einfache noch eine gute Lösung mit reinem Charge (obwohl es möglich ist). Betrachten Sie Powershell, Java oder VBA für diesen Teil. – Stephan