2016-08-10 3 views
1

Hallo Ich brauche Hilfe, da ich zu BatchScript neu bin. Ich muss überprüfen, ob irgendeine Datei/Ordner in einem Verzeichnis in den letzten 15 Minuten geändert wurde.Datei wurde in den letzten 15 Minuten geändert -Batch-Skript

Hier ist meine Logik:

  1. Finden Datum der letzten Änderung
  2. aktuelle Datum finden
  3. finden, wenn Unterschied zwischen diesen beiden 15 Minuten ist. Ich bin in der Lage, die ersten 2 Schritte zu tun. Ich bin mit dem dritten stecken Bitte helfen Sie mir, den Zeitunterschied zwischen diesen 2 Daten zu finden. Oder wenn es eine bessere/einfachere Logik gibt.

Hier ist mein Code:

@echo off 
for /f %a in (' dir "D:\BatchFiles" /od/b/s/t') do set Date1= %~ta 
echo The most recently created file is %Date1% 
@echo off 
for /f "delims=" %i in ('time /t') do set output=%i 
@echo off 
SET Date2= %DATE:~4,2%/%DATE:~7,2%/%DATE:~10,4% %output% 
echo The current date is %Date2% 
PAUSE 
+0

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

Antwort

0

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 
Verwandte Themen