[batch] action selon date du fichier

Résolu
danieliiitooo Messages postés 20 Statut Membre -  
danieliiitooo Messages postés 20 Statut Membre -
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,
Configuration: Windows XP
Internet Explorer 7.0

1 réponse

  1. mikebzh Messages postés 135 Statut Membre 28
     
    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
    0
    1. danieliiitooo Messages postés 20 Statut Membre 1
       
      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
      1