Batch: Retour de sept jours en arrière

Résolu/Fermé
Georges le Yéti albinos, grand mangeur de poulet. - 26 mai 2009 à 16:12
 chouka - 26 août 2009 à 13:52
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.
A voir également:

8 réponses

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
Utilisateur anonyme
5 juin 2009 à 11:01
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
V@rd3k > Utilisateur anonyme
5 juin 2009 à 11:21
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
Utilisateur anonyme > V@rd3k
5 juin 2009 à 11:47
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
Utilisateur anonyme
26 mai 2009 à 16:50
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
Georges le Yéti albinos, grand mangeur de poulet.
26 mai 2009 à 17:14
Wahou !
Merci bien pour la réponse !
Je vais essayer avec ça, je te redit demain.
0
Utilisateur anonyme
26 mai 2009 à 17:15
je viens d'apporter quelques modifs. J'arrête je décolle, fin de la journée =)

Bon courage
0
Georges le Yéti albinos, grand mangeur de poulet.
26 mai 2009 à 17:23
Roxxor man :o
0
Utilisateur anonyme
26 mai 2009 à 19:39
je roxx du poney XD
0
Utilisateur anonyme > Utilisateur anonyme
27 mai 2009 à 18:41
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
chouka > Utilisateur anonyme
26 août 2009 à 13:52
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
26 mai 2009 à 17:30
hello
ou utiliser la commande date Linux pour DOS
C:> date -d "1 week ago"
Tue May 19 17:28:19 Europe de l'Ouest 2009

https://sourceforge.net/projects/unxutils/files/unxutils/current/
0
Georges le Yéti albinos, grand mangeur de poulet
28 mai 2009 à 15:31
Merci infiniment :)
J'ai opté pour la solution d'ahmet en batch, ça fonctionne parfaitement !
0
Utilisateur anonyme
28 mai 2009 à 15:34
Derien =)

N'oublie pas de cocher le petit résolu en haut à droite de ton premier message
0
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
Utilisateur anonyme
28 mai 2009 à 15:51
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
dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
5 juin 2009 à 12:30
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
Utilisateur anonyme
5 juin 2009 à 13:39
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
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
Utilisateur anonyme > V@rd3k
5 juin 2009 à 14:30
huhu ^^
0