[batch] action selon date du fichier [Résolu/Fermé]

Signaler
Messages postés
20
Date d'inscription
jeudi 30 octobre 2008
Statut
Membre
Dernière intervention
1 octobre 2010
-
danieliiitooo
Messages postés
20
Date d'inscription
jeudi 30 octobre 2008
Statut
Membre
Dernière intervention
1 octobre 2010
-
Bonsoir,

Ci-dessous le descriptif de ma problématique:

Soit "D:\nouveau_dossier" un répertoire dans lequel sont continuellement sauvegardés des fichiers .pdf (env toutes les 20 secondes)

Toutes les minutes, une moulinette (Executable) traite ces fichiers .pdf avant de les archiver dans un autre répertoire. (On va dire D:\nouveau_dossier_2)

Quatre à cinq fois par jour, celle moulinette plante laissant rapidement s'entasser les .pdf

Je souhaiterai via l'aide d'un batch, checker toutes les cinq minutes le contenu du répertoire "D:\nouveau_dossier" afin de vérifier si le fichier le plus ancien a plus de dix minutes. Si oui, lancer une procedure enchainant taskkill.exe, envoi de mail d'alerter et relançage de l'exécutable.

Je bloque sur la partie récupération de l'heure du fichier le plus ancien avant comparaison avec l'heure de l'OS. Pour le reste je n'ai pas de souci.

J'ai tenté deux trois trucs via commande dir /OD > fichier.txt mais je ne parviens pas à récupérer dans une variable la date de création du fichier le plus ancien. (Via set var_A=%VAR_2:~X,Y% )

Par ailleurs, même si je parviens à la récupérer, je ne sais pas s'il est possible de la comparer à la variable %time%

L'une ou l'un d'entre vous aurait t'il une idée ?

Merci d'avance,

1 réponse

Messages postés
127
Date d'inscription
samedi 20 décembre 2008
Statut
Membre
Dernière intervention
11 mars 2009
22
Coucou
Va faire un tour par là cela devrait t'intéresser

http://www.commentcamarche.net/forum/affich 9282887 programme batch dos probleme if

Et oui faut fouiller les gars
A plus
danieliiitooo
Messages postés
20
Date d'inscription
jeudi 30 octobre 2008
Statut
Membre
Dernière intervention
1 octobre 2010

Bonsoir Mike,

Merci pour le lien, celui-ci m'a donné quelques idées quand à la piste à suivre.

Ci-dessous le fameux script désormais au complet.

La partie à problème, object de ma requête, est assez longue. Aussi, n'hésitez pas à citer des points d'amélioration.

(Je sais qu'il est possible de combiner les fonctions FOR & FIND mais ne maîtrise pas le process)

Merci d'avance,



@echo off
color 70
cls

rem ---------------------------------------------------------------------------------------------------------------------------
rem Save OS time as three variables / Note that OS format date must be HH:mm ss AM
rem ---------------------------------------------------------------------------------------------------------------------------

rem Save OS time as a variable
Set "OS_Time=%TIME%"
Echo OS Time is: %TIME%

rem Remove first caracter if it is a 0 and save OS time hour as a variable
If "%OS_Time:~0,1%" == "0" (SET "OS_Time_hour=%OS_Time:~1,1%") else (SET "OS_Time_hour=%OS_Time:~0,2%")
Echo OS Time hour is: %OS_Time_hour%

rem Save OS time minutes as a variable
Set "OS_Time_minutes=%OS_Time:~3,2%"
echo OS Time minutes are: %OS_Time_minutes%

rem Save OS time AM-PM as a variable
Set "OS_Time_AM-PM=%TTIME:~9,2%"
echo OS Time AM-PM is: %OS_Time_AM-PM%


rem --------------------------------------------------------------------------------------------------------------
rem Get number of files and oldest file name as two variables
rem --------------------------------------------------------------------------------------------------------------

set /a nb_of_files=0
if exist "Test\*.pdf" for /f "delims=" %%a in ('dir /o-d /b "Test\*.pdf"') do (
set Oldest_file=%%a
set /a nb_of_files+=1
)
echo Oldest file is %Oldest_file%
echo There are %nb_of_files% .pdf files in the Test folder


rem --------------------------------------------------------------------------------------------------------------
rem Get oldest file time and save it as a variable
rem --------------------------------------------------------------------------------------------------------------

dir Test\%Oldest_file%> Token_1.txt
For /F "skip=5 tokens=1-2 delims= " %%a in (Token_1.txt) do echo %%b >>Token_2.txt
Find /V "(s)" Token_2.txt > Token_3.txt
For /F "skip=2 tokens=*" %%a in (Token_3.txt) do set Oldest_file_time=%%a
echo Oldest file time is: %Oldest_file_time%

del /q Token_2.txt
del /q Token_3.txt


rem --------------------------------------------------------------------------------------------------------------
rem Save oldest file hour and minutes as two variables
rem --------------------------------------------------------------------------------------------------------------

rem Remove first caracter if it is a 0 and save oldest file time hour as a variable
if "%Oldest_file_time:~0,1%" == "0" (SET "Oldest_file_hour=%Oldest_file_time:~1,1%") else (SET "Oldest_file_hour=%Oldest_file_time:~0,2%")
echo Oldest file hour is: %Oldest_file_hour%

rem Save oldest file minutes as a variable
Set "Oldest_file_minutes=%Oldest_file_time:~3,2%"
echo Oldest file minutes are: %Oldest_file_minutes%

rem Save oldest file time AM-PM as a variable
For /F "skip=5 tokens=1-3 delims= " %%a in (Token_1.txt) do echo %%c >>Token_2.txt
Find /V "(s)" Token_2.txt > Token_3.txt
For /F "skip=2 tokens=*" %%a in (Token_3.txt) do set Oldest_file_AM-PM=%%a
echo Oldest file time AM-PM is %oldest_file_AM-PM%

del /q Token_1.txt
del /q Token_2.txt
del /q Token_3.txt



rem -----------------------------------------------------------------------------------------------------------------------------------------
rem Test if OS time - oldest file time > 5 minutes
rem -----------------------------------------------------------------------------------------------------------------------------------------


:Test_Dif_AM-PM

rem Test if OS_time_AM-PM is equal to Oldest_file_Am-PM
if %OS_time_AM-PM% NEQ %Oldest_file_time_AM-PM% (goto Test_Dif_hour_AM-PM_same) else goto Test_Dif_hour_AM-PM_dif
goto :End


:Test_Dif_hour_sup_1

rem Test if OS_Time_hour - Oldest_file_hour is greater than 1 hour
set /a Test_hour_sup_1 = %OS_time_hour% - %Oldest_file_hour%
echo %OS_time_hour% - %Oldest_file_hour% = %Test_hour_sup_1%
if %Test_hour_sup_1% GTR 1 (goto Alert_mail) else goto Test_Dif_min_sup_5
goto :End


:Test_Dif_min_sup_5

rem Test if OS_Time_minutes - Oldest_file_minutes is greater than 5 minutes
set /a Test_min_sup_5 = %OS_time_minutes% - %Oldest_file_minutes%
echo %OS_time_minutes% - %Oldest_file_minutes% = %Test_min_sup_5%
if %Test_min_sup_5% GTR 5 (goto Alert_mail) else goto End
goto :End


:Test_Dif_hour_inf_-11

rem Test if OS_Time_hour - Oldest_file_hour is less than 11 hour
set /a Test_hour_inf_-11 = %OS_time_hour% - %Oldest_file_hour%
echo %OS_time_hour% - %Oldest_file_hour% = %Test_hour_inf_-11%
if %Test_hour_inf_-11% LSS -11 (goto Alert_mail) else goto Test_Dif_min_inf_-55
goto :End


:Test_Dif_min_inf_-55

set /a Test_min_inf_-55 = %OS_time_minutes% - %Oldest_file_minutes%
echo %OS_time_minutes% - %Oldest_file_minutes% = %Test_min_inf_-55%
if %Test_min_inf_-55% LSS -55 (goto Alert_mail) else goto End
goto :End


:Alert_email

rem ------------------------------------------------------------------------------------------------------------------------------
rem Send an e-mail alert
rem -----------------------------------------------------------------------------------------------------------------------------

postie\postie -host:Mail server -to:email adress-from:email adress-s:"Subject" -msg:"There are currently %nb_of_file% in the FTP folder. Oldest file time is %Oldest_file_time%. Please connect to XXXX to check what is up."
goto End


:End

L'objectif de ce script était pour rappel, de détecter si les fichiers stockés dans un répertoire (Dans cet exemple Test\. En réalité le répertoire désigné par le FTP virtuel de Win2K) n'ont pas été traités depuis 5 minutes.
Si c'est le cas, envoyer une alerte par e-mail via Postie.
La contrainte était un OS US avec format de date et d'heure US.
Le batch sera schédulé toutes les 5 minutes. (Voir 10 minutes, j'attend la fin des vaccances pour compléter le test)

Bonne soirée et joyeuses fêtes.

Cordialement,

Daniel