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-------------
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
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"
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
É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"
Ma solution fonctionne si vous
touch
sur votre système (ce que je fais)date
(ce qui n'est probablement pas le cas, mais qui sait)Voici l'idée:
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.
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.
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.
Je me demande pourquoi vous devez utiliser le vieux shell DOS ... Python ou Windows Powershell serait le bon choix en 2008 :)