web-dev-qa-db-fra.com

fichier de commandes pour supprimer les fichiers antérieurs à une date spécifiée

Comment créer un fichier batch pour supprimer des fichiers antérieurs à une date spécifiée?

Ça n'a pas l'air de fonctionner;

:: --------DELOLD.BAT----------
@echo off
SET OLDERTHAN=%1
IF NOT DEFINED OLDERTHAN GOTO SYNTAX

for /f "tokens=2" %%i in ('date /t') do set thedate=%%i
type %1
pause
set mm=%thedate:~0,2%
set dd=%thedate:~3,2%
set yyyy=%thedate:~6,4%

set /A dd=%dd% - %OLDERTHAN%
set /A mm=%mm% + 0

if /I %dd% GTR 0 goto DONE
set /A mm=%mm% - 1
if /I %mm% GTR 0 goto ADJUSTDAY
set /A mm=12
set /A yyyy=%yyyy% - 1

:ADJUSTDAY
if %mm%==1 goto SET31
if %mm%==2 goto LEAPCHK
if %mm%==3 goto SET31
if %mm%==4 goto SET30
if %mm%==5 goto SET31
if %mm%==6 goto SET30
if %mm%==7 goto SET31
if %mm%==8 goto SET31
if %mm%==9 goto SET30
if %mm%==10 goto SET31
if %mm%==11 goto SET30
if %mm%==12 goto SET31

goto ERROR

:SET31
set /A dd=31 + %dd%
goto DONE

:SET30
set /A dd=30 + %dd%
goto DONE

:LEAPCHK
set /A tt=%yyyy% %% 4
if not %tt%==0 goto SET28
set /A tt=%yyyy% %% 100
if not %tt%==0 goto SET29
set /A tt=%yyyy% %% 400
if %tt%==0 goto SET29

:SET28
set /A dd=28 + %dd%
goto DONE

:SET29
set /A dd=29 + %dd%

:DONE
if /i %dd% LSS 10 set dd=0%dd%
if /I %mm% LSS 10 set mm=0%mm%
for %%i in (*.*) do (
set FileName=%%i
call :PROCESSFILE %%~ti
)

set mm=
set yyyy=
set dd=
set thedate=
goto EXIT

:SYNTAX
ECHO.
ECHO USAGE:
ECHO DELOLD X
ECHO   Where X is the number of days previous to Today.
ECHO.
ECHO EX: "DELOLD 5" Deletes files older than 5 days.
GOTO EXIT

:PROCESSFILE
set temp=%1
set fyyyy=20%temp:~6%
set fmm=%temp:~0,2%
set fdd=%temp:~3,2%
if /I %fyyyy% GTR 2069 set fyyyy=19%temp:~6%


:: ***************************************
:: * This is where the files are deleted *
:: * Change the ECHO command to DEL to   *
:: * delete. ECHO is used for test.      *
:: ***************************************
if /I %yyyy%/%mm%/%dd% GEQ %fyyyy%/%fmm%/%fdd% (
ECHO %FileName%
)

set temp=
set fyyyy=
set fmm=
set fdd=

:EXIT

:: ----------END-DELOLD.BAT-------------
15
ccc

J'utilise ce script:

////////////////////////////////////////////////////////
// Deletes file older than a number of days 
// in the current directory
////////////////////////////////////////////////////////
// Usage: wscript DeleteOlderThan.js [#Days]
// By default, remove files older than 30 days
////////////////////////////////////////////////////////

function removeDays(date, nDays)
{
    var dateRet = date
    return dateRet.setDate(date.getDate() - nDays);
}

function addSlash(strPath)
{
    var c = strPath.substr(-1, 1);
    if( c !== '\\' && c !== '/' )
    {
        strPath += '\\';
    }
    return strPath;
}

// Read arguments
var nDays = WScript.Arguments(0) || 30;

// Create system objects
var fs = WScript.CreateObject("Scripting.FileSystemObject");
var Shell = WScript.CreateObject("WScript.Shell");

// Retrieve current directory
var strDirectoryPath = addSlash(Shell.CurrentDirectory);

// Compute date
var dateNow = new Date();
var dateTest = removeDays(dateNow, nDays);

// Iterate on files
var folder = fs.GetFolder(strDirectoryPath);
var files = folder.Files;

for( var it = new Enumerator(files); !it.atEnd(); it.moveNext() )
{
    var file = it.item();

    if( file.DateLastModified < dateTest)
    {
        file.Delete(true);
    }
}

que j'invoque tous les jours avec:

wscript "C:\Program Files\Utils\DeletesOlderThan.js" 30
10
Vincent Robert

Si vous utilisez un serveur Windows et/ou si le Kit de ressources serveur est installé, forfiles peut être exactement ce que vous recherchez.

Exemples: imprimer tous les noms de fichiers, datant de plus de 180 jours

forfiles /S /D -180 /C "cmd /C Echo @Path" >olderthan180days.txt

supprimer tous les fichiers PDF, datant de plus de 365 jours

forfiles /S /M *.pdf /D -365 /C "cmd /C Del @Path"
10
ℳ  .

eJames: J'ai trouvé que votre solution xcopy fonctionnait très bien, en effet! Ce que j'aime le plus, c'est qu'il devrait également fonctionner dans des versions de langue Windows autres que l'anglais, car le format des paramètres XCOPY semble être indépendant de la date. Merveilleux! ;]

Une amélioration consisterait à pré-créer le fichier FILES_TO_KEEP.TXT afin que si aucun fichier ne correspond aux critères de conservation, la deuxième instruction XCOPY puisse continuer et effectuer la suppression (elle échoue si elle ne trouve pas le fichier FILES_TO_KEEP.TXT). Voici mon script (veuillez noter que dans cet exemple, je l'ai changé pour ne supprimer que les fichiers * .pdf et j'ai également changé le nom du fichier temporaire pour m'assurer qu'il n'y a pas de conflits potentiels, ainsi que pour nettoyer le fichier temporaire par la suite):

@echo off
SET OLDERTHAN=%1
IF NOT DEFINED OLDERTHAN GOTO SYNTAX

echo >> ~~~FILES_TO_KEEP.TXT~
for /f "tokens=*" %%a IN ('xcopy *.pdf /d:%1 /L /I null') do if exist %%~nxa echo %%~nxa >> ~~~FILES_TO_KEEP.TXT~
for /f "tokens=*" %%a IN ('xcopy *.pdf /L /I /EXCLUDE:~~~FILES_TO_KEEP.TXT~ null') do if exist "%%~nxa" del "%%~nxa"
del ~~~FILES_TO_KEEP.TXT~

GOTO END

:SYNTAX
ECHO.
ECHO USAGE:
ECHO DELOLD mm-dd-yyyy
ECHO   Where mm-dd-yyyy is the date prior to which you want to delete files.
ECHO.
ECHO EX: "DELOLD 10-17-2008" Deletes files older than October 17, 2008.
ECHO.
ECHO This should work on any language version of Windows, but has only been 
ECHO tested in English-US versions.
GOTO END

:END
6
HerbCSO

Éditer: Je l'ai compris.

Pour supprimer tous les fichiers antérieurs à une date donnée:

REM del_old.bat
REM usage: del_old MM-DD-YYY
for /f "tokens=*" %%a IN ('xcopy *.* /d:%1 /L /I null') do if exist %%~nxa echo %%~nxa >> FILES_TO_KEEP.TXT
for /f "tokens=*" %%a IN ('xcopy *.* /L /I /EXCLUDE:FILES_TO_KEEP.TXT null') do if exist "%%~nxa" del "%%~nxa"

Pour supprimer tous les fichiers plus récents qu'une date donnée:

REM del_new.bat
REM usage: del_new MM-DD-YYYY
for /f "tokens=*" %%a IN ('xcopy *.* /d:%1 /L /I null') do if exist "%%~nxa" del "%%~nxa"
6
e.James

Ma solution fonctionne si vous

  • soit avoir un utilitaire touch sur votre système (ce que je fais)
  • ou peut se permettre de changer temporairement la date du système en utilisant la commande date (ce qui n'est probablement pas le cas, mais qui sait)

Voici l'idée:

  1. Dans le répertoire cible, créez un fichier de signal (avec un nom unique) et avec un horodatage égal à l'heure de votre seuil de suppression. Cela peut être fait avec touch (qui accepte l'horodatage souhaité comme paramètre), ou en se souvenant de la date actuelle avec date /T, En changeant la date système en souhaitée avec date <param>, Et en restaurant le date d'origine.

  2. Utilisez for /f %%I in ('dir /od') pour parcourir tous les fichiers classés par date, en les supprimant un par un. Après avoir rencontré (et supprimé) le fichier de signal, arrêtez de supprimer.

1
atzz

Peut-être que vous aimeriez ceci: http://blog.jumlin.com/2010/10/move-files-in-folders-and-subfolders-older-than-one-year/

C'est un script qui déplacera des fichiers de plus d'un an, il prend même en charge divers formats de date et sous-dossiers. Vous pouvez apporter quelques modifications pour le supprimer au lieu de les déplacer. C'est un script très complet avec des commentaires et des explications.

1
NiklasJ

Je me demande pourquoi vous devez utiliser le vieux shell DOS ... Python ou Windows Powershell serait le bon choix en 2008 :)

0
Gabriele D'Antona