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
chouka - 26 août 2009 à 13:52
A voir également:
- Batch: Retour de sept jours en arrière
- Fichier batch - Guide
- Batch renommer une partie du nom de plusieurs fichiers - Guide
- Batch net use - Forum Réseau
- Color batch - Forum Autoit / batch
- Script batch utile ✓ - Forum Programmation
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
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
Utilisateur anonyme
26 mai 2009 à 16:50
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 :
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 !
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 !
Wahou !
Merci bien pour la réponse !
Je vais essayer avec ça, je te redit demain.
Merci bien pour la réponse !
Je vais essayer avec ça, je te redit demain.
Roxxor man :o
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
Le VBScript
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 ^^
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 ^^
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
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
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
dubcek
Messages postés
18757
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
19 décembre 2024
5 623
26 mai 2009 à 17:30
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/
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/
Merci infiniment :)
J'ai opté pour la solution d'ahmet en batch, ça fonctionne parfaitement !
J'ai opté pour la solution d'ahmet en batch, ça fonctionne parfaitement !
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
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
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 !
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 !
dubcek
Messages postés
18757
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
19 décembre 2024
5 623
5 juin 2009 à 12:30
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
5 juin 2009 à 11:01
Merci ^^
5 juin 2009 à 11:21
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 :(
5 juin 2009 à 11:47
Il ne gère pas le 0 devant 9 ou 8. Faut pas chercher à comprendre XD
Merci pour l'info !