Batch: Retour de sept jours en arrière

Résolu
Georges le Yéti albinos, grand mangeur de poulet. -  
 chouka -
Bonjour,
Je suis actuellement en train de faire un batch pour un système de backup.
Mais je bloque sur une étape.
Il faudra que j'obtienne une date donnée, moins 7 jours.

Quelqu'un serait comment faire ?
Le problème est surtout au changement de mois.
Configuration: Windows XP
Chrome

8 réponses

  1. V@rd3k
     
    Hello
    Pour info lors de l'utilisation de ton script, j'ai pu constater qu'une erreur apparaissait lorsque le chiffre 8 ou 9 se trouvait dans le mois ou dans les jours.

    l'erreur est la suivant: "Invalid number. Numeric constants are either decimal (17), hexadecimal (0x11), or octal (021)."

    Pour résoudre le problème il suffit de remplacer les lignes comme ci-dessous:

    REM on peut remplacer par set /a nbJourSoustraire=7 pour fixer à 7 jours
    set /a nbJourSoustraire=7

    for /f "tokens=1-3 delims=." %%1 in ('date /T') do (
    set /a jour=%%1
    set /a mois=%%2
    set /a annee=%%3

    par les lignes mises en gras ci-dessous

    REM on peut remplacer par set /a nbJourSoustraire=7 pour fixer à 7 jours
    set /a nbJourSoustraire=6

    for /f "tokens=1-3 delims=." %%1 in ('date /T') do (
    if %date:~0,1%==0 (set JOUR=%date:~1,1%) else (set JOUR=%date:~0,2%)
    if %date:~3,1%==0 (set mois=%date:~4,1%) else (set mois=%date:~3,2%)

    set /a annee=%%3
    1
    1. Utilisateur anonyme
       
      Ah bon, c'est bizarre. Peut tu m'expliquer ce que fais tes lignes ? et pourquoi ce genre d'erreur. J'ai eu presque la même chose en VBS que j'ai corrigé grâce au CINT

      Merci ^^
      0
      1. V@rd3k > Utilisateur anonyme
         
        Je ne sais pas trop d'où sa vient, mais c'est le 0 qui apparaitrait devant le 8 ou le 9.

        if %date:~0,1%==0 (set JOUR=%date:~1,1%) else (set JOUR=%date:~0,2%)

        %date:~0,1% les deux paramètres après le ~ corresponde aux caractères qu'il doit prendre en charge. le premier chiffe correspond au premier caractère compté. Exemple : le 1 correspond au deuxième chiffres des jours (9) si la date est 09.06.2009

        le deuxième paramètre correspond au nombre de caractères suivant à prendre en compte. Exemple : le 2 correspond à 09 si la date est 09.06.2009

        Je sais pas si c'est très claire mais c'est pas facile à expliquer :(
        0
      2. Utilisateur anonyme > V@rd3k
         
        c'est bon j'ai compris ^^
        Il ne gère pas le 0 devant 9 ou 8. Faut pas chercher à comprendre XD

        Merci pour l'info !
        0
  2. Utilisateur anonyme
     
    Salut,

    Bon déjà tu sais que à partir du 8 tu n'as pas de soucis tu fais le jour-7.

    Ensuite tu sais que les mois 1,3,5,7,8,10,12 comportent 31 jours, le mois 2 28 ou 29 jours et les mois 2,4,6,9,11 eux 30 jours.

    Si le jour est inférieur à 8 donc entre 1 et 7 tu fais X = 7-jour.
    Ensuite tu soustraits par 1 le mois actuel, tu regardes dans quel cas il se situe (31, 30, 29/28 jours).
    Tu le soustrais par X, exemple 31 par X , si il vaut 0 tu prend le dernier jour, 1 lavant-dernier ...

    Tu as des cas particuliers :
    - Pour le mois de février tu dois faire attention aux années bissextile. Pour savoir si une année l'est il faut que l'année soit divisible par 4.
    - le changement d'année, si tu es début janvier, donc mois=1 alors le mois précédent vaut 12 et non 1-1.
    et il faut également soustraire l'année.

    Voilà déjà un début pour récupérer les différents éléments nécessaire :
    @echo off
    cls
    setlocal EnableDelayedExpansion
    
    for /f "tokens=1-3 delims=^/" %%1 in ('date ^/T') do (
    	set /a jour=%%1 ou pour tester mets tes dates genre 5
    	set /a mois=%%2 et ici 1
    	set /a annee=%%3
    
           REM -- gérer ici le nb de jour j'ai mis en dur---
            set /a nbJour = 31
    
    	REM ----si la date est inferieur à 8-----
    	if !jour! lss 8 (
    	  REM -----si début janvier----
    	  if !mois! equ 1 (
    	    set /a mois = 12
    	    set /a jour = !nbJour! - 7 + !jour!
    	    set /a annee -= 1
    	    GOTO END
    	  )	  
    	)
    )
    
    :END
    echo %jour%:%mois%:%annee%
    endlocal
    pause
    


    C'est long surtout en batch.

    Je crois que j'ai rien oublié. Tu commences toujours par gérer les cas particuliers avant de gérer le cas général(dans l'ordre du code).

    Bon courage !
    0
  3. Georges le Yéti albinos, grand mangeur de poulet.
     
    Wahou !
    Merci bien pour la réponse !
    Je vais essayer avec ça, je te redit demain.
    0
    1. Utilisateur anonyme
       
      je viens d'apporter quelques modifs. J'arrête je décolle, fin de la journée =)

      Bon courage
      0
  4. Georges le Yéti albinos, grand mangeur de poulet.
     
    Roxxor man :o
    0
    1. Utilisateur anonyme
       
      je roxx du poney XD
      0
      1. Utilisateur anonyme > Utilisateur anonyme
         
        Re ce matin j'ai fini le batch et j'ai même fait un VBScript (mieux que le vieux Batch, c'est pour les puristes^^).

        Eh oui j'ai fini mon sujet de stage alors je me fais un peu chier lol

        Le Batch
        ----------------------- myDate.bat------------------------------
        @echo off
        cls
        setlocal EnableDelayedExpansion
        
        REM set /p sert a demander une valeur
        REM set /a pour dire que la variable est un entier
        
        REM -- on peut remplacer par set /a nbJourSoustraire=7 pour fixer à 7 jours --
        set /p nbJourSoustraire=Nombre de jour a soustraire ? 
        
        for /f "tokens=1-3 delims=^/" %%1 in ('date ^/T') do (
            set /a jour=%%1
            set /a mois=%%2
            set /a annee=%%3
            
            echo Date Actuelle : !jour!^/!mois!^/!annee!
        
            REM -- Gestion du nombre de jours pour le mois précédent--
            REM -- Exemple, si je suis en juin le mois précédent comporte 31 jour (mai) --
        
               set /a modulo=!annee!%%4
        	
               if !mois! equ 1 set /a nbJourPrecedent=31 
               if !mois! equ 2 set /a nbJourPrecedent=31
               if !mois! equ 4 set /a nbJourPrecedent=31
               if !mois! equ 6 set /a nbJourPrecedent=31
               if !mois! equ 8 set /a nbJourPrecedent=31
               if !mois! equ 9 set /a nbJourPrecedent=31
               if !mois! equ 11 set /a nbJourPrecedent=31
        
               if !mois! equ 3 (
                 REM -- année bissextile --
                   if !modulo! equ 0 (set /a nbJourPrecedent=29) ELSE set /a nbJourPrecedent=28
               )
               
               if !mois! equ 5 set /a nbJourPrecedent=30
               if !mois! equ 7 set /a nbJourPrecedent=30
               if !mois! equ 10 set /a nbJourPrecedent=30
               if !mois! equ 12 set /a nbJourPrecedent=30
        	
            REM -- END gestion nbJourPrecedent --
        
            REM -- si la date est inferieur ou = à nbJourSoustraire --
               if !jour! leq !nbJourSoustraire! (
                 REM -- si début janvier --
                 if !mois! equ 1 (
        	    set /a mois=12
        	    set /a jour=!nbJourPrecedent! - !nbJourSoustraire! + !jour!
        	    set /a annee-=1
        	    GOTO END
                 )
                 set /a mois-=1
                 set /a jour=!nbJourPrecedent! - !nbJourSoustraire! + !jour!
                 GOTO END
               )
            REM -- END jr<8 --
        
            REM -- Cas général --
              set /a jour-=!nbJourSoustraire!
        )
        
        :END
        
        echo Date -!nbJourSoustraire! jours : %jour%^/%mois%^/%annee%
        endlocal
        pause
        
        


        Le VBScript
        ---------------------------------------------------------------------
        ---------------------------------- myDate.vbs --------------------
        ---------------------------------------------------------------------
        Dim NbJourMoisPrecedent, NbJourASoustraire
        Dim DateActuelle, DateFinale
        Dim Parametre, Jour, Mois, Annee
        
        'NbJourASoustraire = CInt(27)
        NbJourASoustraire = CInt(inputbox("Entez le nombre de jours à soustraire ?")) 'Cint=>conversion de String en Int
        Parametre=split(Date, "/")
        
        Jour  = CInt(Parametre(0))
        Mois  = CInt(Parametre(1))
        Annee = CInt(Parametre(2))
        
        '<-- On peut mettre directement Date, mais c'est pour les test -->'
        DateActuelle = Jour & "/" & Mois & "/" & Annee 
        
        WScript.echo "Date Actuelle   : " & DateActuelle
        
        '<-- Les mois précedents avec 31 Jours -->'
        If Mois=1 OR Mois=2 Or Mois=4 Or Mois=6 Or Mois=8 Or Mois=9 Or Mois=11 Then
        	NbJourMoisPrecedent = 31
        Else 
        	'<-- Les mois précedents avec 30 Jours -->'
        	If Mois=5 OR Mois=7 Or Mois=10 Or Mois=12 Then
        		NbJourMoisPrecedent = 30
        	Else
        		If Mois=3 Then
        			'<-- Années Bissextiles -->'
        			If Annee Mod 4 = 0 Then
        				NbJourMoisPrecedent = 29
        			Else
        				NbJourMoisPrecedent = 28
        			End If
        		End If
        	End If
        End If
        
        '<-- Début du mois(<=X) donc avec -X jours on doit décaler d'un mois -->'
        If Jour <= NbJourASoustraire Then
        	'<-- Changement d'année -->'
        	If Mois=1 Then
        		Mois = 12
        		Annee = Annee - 1
        	Else
        		Mois = Mois - 1
        	End If
        	Jour = NbJourMoisPrecedent - NbJourASoustraire + Jour
        Else
        	'<-- Cas général -->'
        	Jour = Jour - NbJourASoustraire
        End If
        
        DateFinale = Jour & "/" & Mois & "/" & Annee
        
        WScript.echo "Date -" & NbJourASoustraire & " jour(s) : " & DateFinale
        
        WScript.Sleep 3000 'Pause de 3s pour avoir le temps de lire le résultat
        
        


        Résultats :

        /** Date d'aujourd'hui **/
        Date Actuelle : 5/1/2009
        Date -7 jours : 29/12/2008

        /** Cas avec changement d'année**/
        Date Actuelle : 5/1/2009
        Date -7 jours : 29/12/2008

        /** Année non Bissextile **/
        Date Actuelle : 3/3/2003
        Date -7 jours : 24/2/2003

        /** Année Bissextile **/
        Date Actuelle : 3/3/2004
        Date -7 jours : 25/2/2004

        Enjoy ^^
        0
      2. chouka > Utilisateur anonyme
         
        Bonjour,

        Merci pour les sources qui m'ont permis de me dépatouiller dans un premier temps avec un problème similaire.
        En cherchant un peu je suis tomber sur la fonction DateAdd(interval, number, date) qui permet de résoudre le problème plus simplement (en VBS), voir le lien ci-dessous pour les descriptifs complets des fonction dates VBS.

        J'ai donc repris le script et cela se limite à cela :

        '---------------------------------------------------------------------
        '---------------------------------- myDate.vbs --------------------
        '---------------------------------------------------------------------
        Dim NbJourASoustraire
        Dim DateFinale

        NbJourASoustraire = inputbox("Entez le nombre de jours à soustraire ?")

        DateFinale = DateAdd("d",NbJourASoustraire*(-1), Date)

        WScript.echo "Date Actuelle : " & Date
        WScript.echo "Date Actuelle - " & NbJourASoustraire & " jour(s) : " & DateFinale

        WScript.Sleep 3000 'Pause de 3s pour avoir le temps de lire le résultat


        http://www.commentcamarche.net/contents/vbscript/vbs-fonctions-date.php3
        0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. Georges le Yéti albinos, grand mangeur de poulet
     
    Merci infiniment :)
    J'ai opté pour la solution d'ahmet en batch, ça fonctionne parfaitement !
    0
    1. Utilisateur anonyme
       
      Derien =)

      N'oublie pas de cocher le petit résolu en haut à droite de ton premier message
      0
  7. Benjamin
     
    Salut!

    Comme ca parle de Batch ici je vais pouvoir poser ma question ^^

    Est ce que vous savez quel différences il y a entre les scripts en Batch et les scripts en VBS?

    Si vous avez des doc sur internet je suis preneur
    Merci d'avance
    Benjamin
    0
    1. Utilisateur anonyme
       
      il faut ouvrir un autre sujet normalement !

      pour faire simple

      VBS c'est un langage de script, il est interprété, donc pas compilé, et donc tu peux l'ecuter n'importe où, comme un batch.

      Le Batch c'est le langage de programmation du shell ms-dos, ça sert à regrouper plusieurs commandes.

      ça fait pas longtemps que j'ai découvert les script vbs. Et je dois dire que c'est magique, plus simple et plus propre !
      0
  8. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
     
    ne serait-ce pas parce que comme dans d'autres languages, un nombre qui commence par 0 est un nombre octal (base 8), donc ...06, 07, 010, 011, etc donc 08 et 09 sont invalides
    0
    1. Utilisateur anonyme
       
      C'est pas bête, ça expliquerai pourquoi 01 est géré et non 08 car si c'est en octal les nombres vont de 0 à 7, c'est surement ça =)
      0
    2. V@rd3k
       
      Oui je pense que l'explication est tout à fait plausible.

      Heureusement que l'ordinateur de test avait 5 jours d'avance :)

      ++ et merci à vous pour l'aide
      0
      1. Utilisateur anonyme > V@rd3k
         
        huhu ^^
        0