Batch Delete a file older than X hours

Sulyvan77 Posted messages 3 Status Membre -  
brucine Posted messages 24434 Registration date   Status Membre Last intervention   -
Hello,

I am currently doing an internship at a large company, and I have been asked to create a Batch or VB script to delete temporary files, but only files older than 3 hours.
I am really not an expert in scripting; I am just starting out.
Here is the code I found on the internet that I tried to modify without success, and I received an error message.
@echo off

set fich=C:\Users\paje01\Desktop\TEST\test1
set jour=3

pause
forfiles -p %fich% -s -m *.* -d -0:03 "cmd /c del @FILE"

pause
@exit


I then get the following error message:

Press any key to continue...
Error: Invalid argument or option - "cmd /c del @FILE".
Enter "FORFILES /?" to display the syntax.
Press any key to continue...


So, if anyone has a solution for me :)
Thank you and have a good day.

4 réponses

jee pee Posted messages 31926 Registration date   Status Modérateur Last intervention   9 950
 
Hello,

In your command, there is a missing space between
-3 -c
 

However, this command processes days, not hours. You should look for another script.

Best regards
--
        a stranger is a friend you haven't met yet.
0
Sulyvan77 Posted messages 3 Status Membre
 
Hello and thank you for your response,

After some research, I managed to create a functional script for the days, but I'm still struggling with the hours. Here is my test:

 
@ECHO OFF
REM START OF THE SCRIPT

REM DISPLAYING HOURS AND MINUTES

for /f "tokens=1,2,3 delims=:" %%a in ('time /t') do set hour=%%a
for /f "tokens=1,2,3 delims=:" %%a in ('time /t') do set minute=%%b
echo Hour : %hour%
echo Minute : %minute%

REM ///////CREATING A FOLDER CONTAINING HOURS AND MINUTES

REM ///////echo Test > file_%hour%%minute%.txt

pause

REM TIME AND FOLDER VARIABLES
REM DIRECTORY CONTAINING OUR FILES
SET REPDIR=C:\Users\paje01\Desktop\TEST\test1

REM MAXIMUM NUMBER OF DAYS TO KEEP
SET HMAX=%time:~0,2%

pause

REM DELETE FILES
forfiles /P %REPDIR% /m *.* /D -%HMAX% /C "cmd /c del /q @path"

pause
REM ///// TEST
REM /////ForFiles /P "%REPDIR%" /D -%DAYMAX% /C "CMD /C if @ISDIR==TRUE echo RD /Q /S @FILE &RD /Q /S @path"

REM DISPLAY A MESSAGE AFTER DELETION

echo Msgbox "The script has been executed successfully and your files have been deleted."
pause
0
Sulyvan77 Posted messages 3 Status Membre
 
And here is the one that works,

 @ECHO OFF REM START OF THE SCRIPT 

REM TIME AND FOLDER VARIABLES
REM DIRECTORY CONTAINING OUR FILES
SET REPDOSS=C:\Users\paje01\Desktop\TEST\test1
REM MAXIMUM RETENTION DAYS
SET JOURMAX=1

REM DELETE FILES
forfiles /P %REPDOSS% /m *.* /D -%JOURMAX% /C "cmd /c del /q @path"
pause

REM DELETE FOLDERS
REM ForFiles /P "%REPDOSS%" /D -%JOURMAXS% /C "CMD /C if @ISDIR==TRUE echo RD /Q /S @FILE &RD /Q /S @path"

PAUSE
0
barnabe0057 Posted messages 14431 Registration date   Status Contributeur Last intervention   4 929
 
Hello,

I took your code to eliminate files/folders older than 1 day, then I created the code to delete those older than 3 hours:

@echo off
setlocal enableextensions enabledelayedexpansion
chcp 1252 >nul

REM DIRECTORY CONTAINING OUR FILES
SET REPDOSS=C:\Users\paje01\Desktop\TEST\test1

REM MAXIMUM NUMBER OF DAYS OF RETENTION
SET JOURMAX=1

cd /d %REPDOSS% || exit /b 1

REM DELETE FILES
forfiles /D -%JOURMAX% /C "cmd /c if @ISDIR==FALSE (del /f /q @file)"

REM DELETE FOLDERS
forfiles /D -%JOURMAX% /C "cmd /c if @ISDIR==TRUE (rd /Q /S @file)"

PAUSE

:: GET CURRENT TIME AND CONVERT IT TO MINUTES
for /f "tokens=1,2,3 delims=:" %%a in ('time /t') do (
set H_actuelle=%%a
set M_actuelle=%%b

if !H_actuelle! LSS 10 (set H_actuelle=!H_actuelle:~-1!)
if !M_actuelle! LSS 10 (set M_actuelle=!M_actuelle:~-1!)

set /a total_actuelle=!H_actuelle!*60+!M_actuelle!
)

pause

:: LIST FILES AND FOLDERS
for /f "delims=" %%K in ('dir /b') do (

:: GET TIME FOR EACH FILE/FOLDER
for /f "skip=5 tokens=1,2,3,* delims=: " %%A in ('2^>nul dir "%%~K" ^| findstr /v "octets"') do (
set heure=%%B
set minute=%%C

:: CONVERT TIME TO MINUTES
if !heure! LSS 10 (set heure=!heure:~-1!)
if !minute! LSS 10 (set minute=!minute:~-1!)

set /a total_fichier=!heure!*60+!minute!

:: DETERMINE THE DIFFERENCE AND DELETE FILES/FOLDERS THAT ARE TOO OLD
set /a ecart=!total_actuelle!-!total_fichier!

if !ecart! GTR 180 (2>nul rd /s /q "%%~K" || del /f "%%~K")
if !ecart! LSS -1440 (2>nul rd /s /q "%%~K" || del /f "%%~K")
if !ecart! LSS 0 (if !ecart! GTR -1260 (2>nul rd /s /q "%%~K" || del /f "%%~K"))
)
)
pause

exit /b 0


“Artificial intelligence is defined as the opposite of natural stupidity.”
0
barbabe0057
 
Hello, did it work for you? Because it's not working for me!
0
barnabe0057 Posted messages 14431 Registration date   Status Contributeur Last intervention   4 929 > barbabe0057
 
Hello,

If you want help, you need to describe your problem precisely; it's not enough to say it doesn't work.

Which part of the script isn't working? The first part that deletes folders/files older than 1 day, or the second part that deletes files/folders older than 3 hours?

Is your problem regarding the files, the folders, or both?
0
Ludo777 > barnabe0057 Posted messages 14431 Registration date   Status Contributeur Last intervention  
 

Hello,

At my place, it deletes all the files and shows me "missing operator" in the command prompt.

Do you have any idea?

Otherwise, the forfiles command works great for 1 day, too bad we can't do less than a day.

0
brucine Posted messages 24434 Registration date   Status Membre Last intervention   4 109 > Ludo777
 

Hello,

It's probably that you miscopied the formula from barnane0057, who I trust completely in this regard.

Note that Batch Dos handles dates very poorly; there are plenty of workarounds, the simplest without third-party utilities via PowerShell:

https://stackoverflow.com/questions/74026069/how-to-delete-all-files-last-modified-more-than-5-minutes-ago

0