Extraire la date avec Ms-dos

Résolu
bonjour,
je cherche a extraire la date du jour sous le dos, à la mettre sous la forme jj_mm_aaaa, et mettre le résultat obtenu dans une variable (qui me servira a ouvrir un fichier portant ce nom).
est ce que c possible ???????

32 réponses

Résumé de la discussion

L'objectif est d'extraire la date du jour sous DOS et de la mettre au format jj_mm_aaaa afin de l'utiliser dans une variable qui renomme ou ouvre un fichier. Plusieurs propositions existent, mais une méthode simple consiste à remplacer les séparateurs de date dans la variable système par des underscores, par exemple set ladate=%date:/=_% pour obtenir jj_mm_aaaa. Des variantes plus robustes s'adaptent selon le système (DOS ancien, XP/2000) et illustrent comment concaténer Date et Time pour composer des noms incluant l'heure. En pratique, il faut aussi gérer les éventuels caractères invisibles lorsque l'heure est 00 et prévoir des zéro devant les chiffres, afin d'éviter des noms de fichier incomplets.

Bobot (l’IA à votre service)
  1. Bonjour,

    une manière extrêmement simple d'obtenir la date système sous la forme JJ_MM_AAAA avec MS-DOS est en une seule ligne dans un batch est la suivante :

    set ladate=%date:/=_%

    Là on indique qu'il faut remplacer / par _

    Vous pouvez exécuter %date:/=_% sous DOS et ça vous affichera bien la date sous la forme JJ_MM_AAAA
    9
    1. explication très clair, y compris pour un néophyte comme moi
      0
  2. Windows xp sp3

    création d'un fichier batch pour compresser le fichier "c:\contact.doc" en "c:\contact.rar" et ajout de la date et heure système séparées par traits d'union au nom du fichier produit.

    le résultat doit être comme : "c:\contact-20150206-071727.rar"
    (le fichier créé le 06 février 2015 à 07 heure 17 minutes 27 secondes)

    nombre de lignes sans les commentaires : 9 lignes
    copier juste ce qui se trouve entre DEBUT et FIN

    DEBUT
    @echo off
    rem la date système est sous la forme: 0 6 / 0 2 / 2 0 1 5
    rem L'heure système est sous la forme: 0 7 : 1 7 : 2 7 , 3 7
    rem les positions des caractères: 0 1 2 3 4 5 6 7 8 9 10
    rem position 4 le 7 et 2, position 9 le 3 et 5, position 6 le 2 et 2 etc...
    rem les séparateurs ":" et "/" et "," sont aux positions 2 et 5 et 8

    rem ------- 1 extraction et affectation de la date à la variable amj -------
    rem la date système sans les deux séparateurs "/" (date=06022015)
    set amj=%date:~6,4%%date:~3,2%%date:~0,2%
    rem amj=20150206 veut dire Année Mois Jour

    rem ------- 2 extraction de time -------
    rem extraire deux caractères à partir de position 0 (l'heure) dans la variable h
    set h=%time:~0,2%
    rem résultat h=07

    rem extraire deux caractères à partir de position 3 (minutes) dans m
    set m=%time:~3,2%
    rem m=17

    rem extraire deux caractères à partir de position 6 (secondes) dans s
    set s=%time:~6,2%
    rem s=27

    rem ------- 3 condition de l'heure (de 00h à 09h) -------
    rem si l'heure est inférieure à 10 donc remplacer le premier caractère vide par 0
    rem et l'affecter à la variable h
    if %h% lss 10 set h=0%h:~1,1%

    rem ------- 4 affectation de l'heure en entier à la variable hms -------
    rem concaténer les trois variables de time sans les deux séparateurs ":"
    set hms=%h%%m%%s%
    rem hms=071727

    rem ------- 5 compression en rar -------
    rem compression avec ajout de date et heure système
    rem amj=20150206 et hms=071727
    rar a -m3 -ep c:\contact-%amj%-%hms%.rar c:\contact.doc
    rem résultat c:\contact-20150206-071727.rar

    rem ------- 6 déplacement vers un lieu sure -------
    rem déplacement du fichier produit vers disk dur externe à ce dossier E:\backup\
    move c:\contact-%amj%-%hms%.rar E:\backup\
    rem résultat E:\backup\contact-20150206-071727.rar

    rem ------- 7 pause CCM Café_Chaud_Mérité -------
    rem pause pour voir le résultat (Done)
    pause
    FIN
    1
    1. Pour afficher l'heure sur un nom de fichier est éviter le problème du null dans le cas ou l'heure et entre ( 00h = 0h à 09 = 9h), il faut tous simplement reformater la variable utiliser pour afficher l'heure , par exemple si la variable utiliser est vtime, on utilise une autre variable ptime=%vtime: =0% cette commande remplace le null dans vtime par 0 (si vtime= 92531 alors ptime=092531)
      0
      1. for /f "tokens=1-3 delims=:" %%i in ('time /t') do echo Testing: %date:/=_% %%ih%%j >> _test-date-time.txt

        =)
        0
        1. Super, fonctionne très bien aussi.
          0
      2. Whaouu 6 ans après :) Moi je dis Bravo mooossieur ! ... Ça nous rajeunis pas tout ça ! Mais cela fait plaisir de voir les heures passées a élaborer des petits bouts de codes peuvent encore servir 6 ans après, j'avoue que je viens de temps en temps faire des petits copier/coller des exemples expliqués dans ce thread . Bonne fêtes de fin d'années a toi.

        Poulpenstring
        0
        1. 6 ans aprés je remercie eric et poulpenstring pour leurs aides
          Grace à eux j'ai réussi à faire mon batch facilement et qui fonctionne parfaitement.
          Merci beaucoup
          0
          1. Salut Van,

            Essaie la commande string.com

            et exécute un script .BAT comme suit

            Echo OFF
            STRINGS JOUR = DAY

            RENAME file.txt %JOUR%.TXT

            Bonne Chance Van

            SEMTECH
            0
            1. extraire la date sous le format:
              jour de semaine (lundi.....vendredi)
              jour(dd)
              mois(mm)
              année(aaaa)
              0
              1. ???
                0
            2. Bon j'avais 2 minutes et 30 secondes devant moi...

              Voici un exemple complet si l'on considere que tes fichiers sont sur C:\ et que tu les copies sur D:\

              L'exemple est volontairement simpliste, tu peux éventuellement l'optimiser par des boucles ou autre étiquettes... (si tu en as envies)

              set mon_fic=c:\bases_%Date:~-4%%Date:~-7,-5%%Date:~-10,-8%.FIC
              copy %mon_fic% d:\
              set mon_fic=c:\bases_%Date:~-4%%Date:~-7,-5%%Date:~-10,-8%.NDX
              copy %mon_fic% d:\
              set mon_fic=c:\histo_%Date:~-4%%Date:~-7,-5%%Date:~-10,-8%.FIC
              copy %mon_fic% d:\
              set mon_fic=c:\histo_%Date:~-4%%Date:~-7,-5%%Date:~-10,-8%.NDX
              copy %mon_fic% d:\
              set mon_fic=c:\reglem_%Date:~-4%%Date:~-7,-5%%Date:~-10,-8%.FIC
              copy %mon_fic% d:\
              set mon_fic=c:\reglem_%Date:~-4%%Date:~-7,-5%%Date:~-10,-8%.NDX
              copy %mon_fic% d:\


              (le tout dans un fichier.bat bien sur)

              Bonne journée.
              1
              1. Petite modif (plus rationnel et un peu plus propre)

                set Wdatjour=%Date:~-4%%Date:~-7,-5%%Date:~-10,-8%
                copy c:\bases_%wdatjour%.FIC D:\
                copy c:\bases_%wdatjour%.NDX D:\
                copy c:\histo_%wdatjour%.FIC D:\
                copy c:\histo_%wdatjour%.NDX D:\
                copy c:\reglem_%wdatjour%.FIC D:\
                copy c:\reglem_%wdatjour%.NDX D:\

                voilou...
                0
            3. En regardant ce sujet, je me suis rendu compte que la réponse n°15 de ce sujet correspond a tes attentes...

              dans l'exemple :

              set mon_fic=c:\ZZZ-%Date:~-4%%Date:~-7,-5%%Date:~-10,-8%.XXX
              echo %mon_fic%

              il te suffit de replacer le c:\ par le bon chemin - ZZZ par le nom de ton fichier et XXX par l'extension de ton fichier, puis ensuite faire ta copie a la place de la commande echo de cet exemple...

              ce ferait un truc du genre :

              set mon_fic=c:\bases_-%Date:~-4%%Date:~-7,-5%%Date:~-10,-8%.FIC
              copy %mon_fic% DESTINATION (voir syntaxe exacte de copy)

              Le tout dans un .bat en pratiquant de meme pour...
              bases_20080405.NDX
              histo_20080405.FIC
              histo_20080405.NDX
              reglem_20080405.FIC
              reglem_20080405.NDX

              A tester.......

              Bonne journée
              0
              1. Bonjour,

                Oui c'est certainement possible, étant au bureau, pas beaucoup de temps pour faire un test, mais en attendant, pourquoi ne pas essayer un bon soft de synchro comme SyncBackSE qui te fera ce boulot a merveille?

                Désolé pour cette réponse incomplète, mais en attendant, on ne sait jamais si cela peut t'aider.

                Bonne journée.
                0
                1. Je travaille sur un logiciel qui crée chaque jour 6 fichiers qui correspondent à l'historique du jour.
                  Ces fichiers sont:
                  bases_20080405.FIC
                  bases_20080405.NDX
                  histo_20080405.FIC
                  histo_20080405.NDX
                  reglem_20080405.FIC
                  reglem_20080405.NDX

                  Ma mission est d'acheminer tous les jours à 23h, uniquement les 6 fichiers qui comportent la date du système, vers un ordi distant (donc transfert par IP) et de les coller das un répertoire précis.

                  ma question est-elle claire? irréalisable? bref merci à celui qui me sortira de ce mauvais pas!!!
                  0
                  1. Remarques:

                    Attention aux variables déclarées dans une boucle for ou dans un call appelé dans la boucle for:
                    -- pas de mise à jour ou de récupération possible.
                    -- utiliser des variables déclarées avant la boucle.
                    -- bien tester avant de mettre en production.

                    pour ma part je traite mes opérations entièrement dans les call;
                    la boucle for ne me sert que pour lire des valeurs l'une après l'autre.
                    0
                    1. Bravo et merci Philippe, pour cet exemple généreux en terme de code et de commentaires, auquel je m'empresse de faire un copier/coller en cas de besoin.
                      Bonne journée.
                      3
                      1. Superbe réponse... agréable a lire, pas agressive et plein de politesse...
                        Maintenant tout le monde attend ton exemple, qui je suis sur, pourra servir aux autres.
                        0
                      2. Merci, j'ai proposé cela sur l'ensemble de sites de "CodeS-SourceS" et je me suis fais jeté ! sous prétexte que celà ne rentrait dans aucune rubrique...tans pis pour eux !#§@?
                        0
                      3. Merci Stern, j'ai fais au plus lisible et compréhensible par tous pour une maintenance facile.
                        Maintenant j'attends avec curiosité que tu tiennes ta parole en fournissant une optimisation de ce code ???
                        0
                    2. Un petit exemple de ce que l'on peut faire pour XP/2000
                      (adaptable pour d'autres versions; extensible pour le calcul de la date de pâques...)
                      Copier/coller les lignes suivantes dans un fichier texte à adapter selon les besoins:
                      @echo off
                      REM ==============================================================================================================
                      REM RECUPERATION DE LA DATE DE DERNIERE CLOTURE DES CAISSES D'UNE LISTE DONNEE
                      REM --------------------------------------------------------------------------------------------------------------
                      REM HISTORIQUE:
                      REM Création 26/05/2007 Philippe LEBLANC
                      REM Modification 28/05/2007 Philippe LEBLANC
                      REM Refonte du fait qu'en plannification de tâche aucune valeur n'est retournée par les sous-routines
                      REM ==============================================================================================================
                      setlocal EnableDelayedExpansion
                      title RECUPERATION DE LA DATE DE DERNIERE CLOTURE DES CAISSES D'UNE LISTE DONNEE

                      REM ----- PARAMETRAGE -------------------------------------
                      set path=%path%;c:\progra~1\tivoli\lcf\bin\w32-ix86\tools

                      REM Version de windows
                      for /F "usebackq delims==" %%i in (`ver`) do set OSVER=%%i

                      REM Identifications windows XP et 2K
                      set USERADMIN=xxxxxxxxx
                      set ADMPASXP=yyyyyyyyy
                      set ADMPAS2K=zzzzzzzzz
                      set USERCAISSE=ttttttttt\CAISSE
                      set CAIPAS2K=uuuuuuuuu
                      set CAIPASXP=vvvvvvvvv

                      REM Fichier contenant la liste des caisses
                      set FichierCaisses=liste.csv
                      REM Fichier temporaire contenant la liste des caisses déjà traitées
                      set FichierTemp=liste.tmp
                      set Lecteur=C$
                      REM Répertoire de récupération
                      set Repertoire=winstore
                      set Chemin=%Lecteur%\%Repertoire%
                      REM Fichier ini
                      set FichierData=Transferts.ini

                      REM Récupération de la date et de l'heure
                      call :DateHeureSysteme
                      set Bissextile=0
                      set Semaine=0
                      set Journee=0
                      call :JourneeSemaineDate %Annee% %Mois% %Jour%
                      if "%Mois%" == "01" set NomMois=Janvier
                      if "%Mois%" == "02" set NomMois=Fevrier
                      if "%Mois%" == "03" set NomMois=Mars
                      if "%Mois%" == "04" set NomMois=Avril
                      if "%Mois%" == "05" set NomMois=Mai
                      if "%Mois%" == "06" set NomMois=Juin
                      if "%Mois%" == "07" set NomMois=Juillet
                      if "%Mois%" == "08" set NomMois=Aout
                      if "%Mois%" == "09" set NomMois=Septembre
                      if "%Mois%" == "10" set NomMois=Octobre
                      if "%Mois%" == "11" set NomMois=Novembre
                      if "%Mois%" == "12" set NomMois=Decembre
                      if "%Journee%"=="1" set NomJour=Lundi
                      if "%Journee%"=="2" set NomJour=Mardi
                      if "%Journee%"=="3" set NomJour=Mercredi
                      if "%Journee%"=="4" set NomJour=Jeudi
                      if "%Journee%"=="5" set NomJour=Vendredi
                      if "%Journee%"=="6" set NomJour=Samedi
                      if "%Journee%"=="7" set NomJour=Dimanche

                      REM Création du fichier log
                      set FichierLog=TransfertsIniCaisses_%aaaammjj%.log
                      echo %DateHeure% Debut de la récupération pour le %NomJour% >> %FichierLog%

                      REM Test de lancement sur présence du fichier contenant la liste des caisses
                      if not exist %FichierCaisses% (
                      echo %DateHeure% : Pas de récupération car le fichier contenant la liste des caisses %FichierCaisses% est absent. >> %FichierLog%
                      goto :SORTIE) else (echo.)
                      REM Test de lancement journalier selon le jour de la semaine
                      if "%NomJour%"=="Samedi" (
                      echo %DateHeure% : Pas de récupération planifiée le %NomJour%. >> %FichierLog%
                      goto :SORTIE) else (echo.)

                      REM Initialisation du fichier résultat
                      set FichierResultat=ResultatTransfertsIniCaisses_%aaaammjj%.txt
                      echo Caisse;DateCloture > %FichierResultat%

                      REM ----- BOUCLE ------------------------------------------
                      REM Boucle de lecture du fichier de la liste des caisses
                      for /F "tokens=1,2 delims=;" %%i in (%FichierCaisses%) do (

                      REM Test de l'indicateur 'déjà traité' du fichier de la liste des caisses
                      if %%j==O (echo %%i;O >> %FichierTemp%) else (

                      REM Connection avec la caisse
                      net use \\%%i\ipc$ /user:%USERADMIN% %ADMPASXP% || net use \\%%i\ipc$ /user:%USERADMIN% %ADMPAS2K%
                      if ERRORLEVEL 1 (
                      echo %DateHeure% : %%i non connectée >> %FichierLog%
                      echo %%i;N >> %FichierTemp%) else (

                      REM Récupération de la date de dernière clôture de la caisse
                      call :DateClotureCaisse \\%%i\%Chemin%\%FichierData% %%i

                      )
                      REM Fin de connection avec la caisse
                      net use \\%%i\ipc$ /d
                      )
                      REM Fin du test de l'indicateur 'déjà traité' du fichier de la liste des caisses
                      )
                      REM Fin de la boucle de lecture du fichier de la liste des caisses
                      REM -------------------------------------------------------

                      REM Mise à jour du fichier de la liste des caisses
                      copy /Y %FichierTemp% %FichierCaisses%

                      REM Récupération de la date et de l'heure
                      call :DateHeureSysteme

                      :SORTIE
                      REM Message de log
                      echo %DateHeure% Fin de la récupération pour le %NomJour% >> %FichierLog%

                      REM Suppression des fichiers temporaires
                      @del /q /f %FichierTemp%

                      REM Fin du traitement principal
                      goto :EOF
                      REM ==============================================================================================================

                      REM ----- SOUS-ROUTINE ------------------------------------
                      :DateClotureCaisse
                      REM -------------------------------------------------------
                      REM Récupération de la date de dernière clôture de la caisse
                      REM paramètres: nom du fichier de données, nom de la caisse selon le format 'VEG'
                      REM
                      call :DateHeureSysteme
                      REM ----- BOUCLE ------------------------------------------
                      REM Boucle de lecture du fichier de données:
                      REM Recherche de la date attribuée à la clause 'DateDerniereCloture='
                      REM Initialisation de la variable 'DateCloture', nulle si la clause n'est pas trouvée
                      for /F "tokens=1,2 delims==" %%g in (%1) do (if %%g == DateDerniereCloture set DateCloture=%%h)
                      REM
                      REM Test de la variable 'DateCloture':
                      REM Ecriture dans le fichier résultat si la variable est renseignée
                      REM Mise à jour du fichier temporaire contenant la liste des caisses déjà traitées
                      if "%DateCloture%"=="" (
                      echo %DateHeure% : Echec lors de la lecture de la date de clôture de la caisse %2 >> %FichierLog%
                      echo %2;N >> %FichierTemp%) else (
                      echo %2;%DateCloture% >> %FichierResultat%
                      echo %2;O >> %FichierTemp%)
                      REM
                      REM ----- Fin de la sous-routine
                      goto :EOF

                      REM ----- SOUS-ROUTINE ------------------------------------
                      :DateHeureSysteme
                      REM -------------------------------------------------------
                      REM Récupération de la date et de l'heure système
                      REM selon la version de l'OS, Windows 2000 ou XP
                      if "%OSVER:~18,2%"=="XP" (
                      set Annee=%DATE:~6,4%
                      set Mois=%DATE:~3,2%
                      set Jour=%DATE:~0,2%
                      set Heure=%TIME:~0,2%
                      set Minutes=%TIME:~3,2%
                      set Secondes=%TIME:~6,2%) else (
                      if "%OSVER:~18,4%"=="2000" (
                      set Annee=%DATE:~11,4%
                      set Mois=%DATE:~8,2%
                      set Jour=%DATE:~5,2%
                      set Heure=%TIME:~0,2%
                      set Minutes=%TIME:~3,2%
                      set Secondes=%TIME:~6,2%))
                      if %Heure% LSS 10 set Heure=0%Heure:~1,1%
                      REM
                      set DateHeure=%Jour%/%Mois%/%Annee% - %Heure%:%Minutes%:%Secondes%
                      set aaaammjj=%Annee%%Mois%%Jour%
                      REM
                      REM ----- Fin de la sous-routine
                      goto :EOF

                      REM ----- SOUS-ROUTINE ------------------------------------
                      :JourneeSemaineDate
                      REM -------------------------------------------------------
                      REM Récupération des éléments de date tels que
                      REM le jour bissextile de l'année,
                      REM le quantième de la semaine de l'année,
                      REM le quantième du jour de la semaine
                      set yy=%1
                      set mm=%2
                      set dd=%3
                      set ly=0
                      set /a lx=%yy% %% 4
                      if %lx% EQU 0 set ly=1
                      set /a lx=%yy% %% 100
                      if %lx% EQU 0 set ly=0
                      set /a lx=%yy% %% 400
                      if %lx% EQU 0 set ly=1
                      if 1%yy% LSS 200 if 1%yy% LSS 170 (set yy=20%yy%) else (set yy=19%yy%)
                      set /a dd=100%dd%%%100,mm=100%mm%%%100
                      set /a z=14-mm,z/=12,y=yy+4800-z,m=mm+12*z-3,Jd=153*m+2
                      set /a Jd=Jd/5+dd+y*365+y/4-y/100+y/400-32045
                      set /a y=yy+4798,Jp=y*365+y/4-y/100+y/400-31738,t=Jp+3,Jp=t-t%%7
                      set /a y=yy+4799,Jt=y*365+y/4-y/100+y/400-31738,t=Jt+3,Jt=t-t%%7
                      set /a y=yy+4800,Jn=y*365+y/4-y/100+y/400-31738,t=Jn+3,Jn=t-t%%7
                      set /a Jr=%Jp%,yn=yy-1,yn+=Jd/Jt,yn+=Jd/Jn
                      if %Jd% GEQ %Jn% (set /a Jr=%Jn%) else (if %Jd% GEQ %Jt% set /a Jr=%Jt%)
                      set /a diff=Jd-Jr,cw=diff/7+1,wd=diff%%7,wd+=1
                      if %cw% LSS 10 set cw=0%cw%
                      REM
                      set %Bissextile%=%ly%
                      set Semaine=%cw%
                      set Journee=%wd%
                      REM echo yyyy: [%yy%] mm: [%mm%] dd: [%dd%] wd: [%wd%] cw: [%Semaine%] ly: [%Bissextile%]
                      REM
                      REM ----- Fin de la sous-routine
                      goto :EOF
                      3
                      1. j'ai une base de données en sql server et je voudrais ajouter des données dans ujn certain nombre de table mais étant en Access XP. en fait je lie des tables à la base sql server par ODBC.quelle sécurité doi_je mettre sur les tables afin que ceci soit possible.
                        0
                        1. Pour récupérer la date (ou l'heure), sans utiliser de fichier tmp :

                          for /F "tokens=1* delims=@" ('date /T') do set date=%%a
                          delims=@ permet de tout récupérer dans une seule variable
                          sinon, on peut utiliser plusieurs délimiteurs et récupérer les champs individuellement.

                          pour avoir des explications : help for

                          ne fonctionne que sous W/NT et supérieur (pas sous W98)
                          0
                          1. Aaaaaaah enfin la solution qui marche sur mon système

                            Je commençais a désespérer ...

                            Merci Yazul
                            0
                        2. bonjour,
                          sous Win98, cela fontionne pas.
                          Je desire renommer un fichier avec la date du jour.
                          Tout ceci executé ds un .bat

                          qqu'un a une idée?
                          0
                          1. Oufff à force de bricoler j'y suis arrivé :)
                            je propose le code suivant :

                            @Echo off
                            SET dizaine=A%time:~0,1%B 
                            if A1B==%dizaine% goto OK 
                            if A2B==%dizaine% goto OK 
                            :ZERO 
                            SET dizaine=0
                            goto fin 
                            :OK 
                            SET dizaine=%time:~0,1%
                            goto fin
                            
                            :FIN 
                            rename "%userprofile%\bureau\fichier.xls" fichier_%Date:~-4%%Date:~-7,-5%%Date:~-10,-8%_%dizaine%%Time:~-10,-9%%Time:~-8,-6%%Time:~-5,-3%.xls


                            MERCI beaucoup pour ton aide !!
                            et merci aussi pour l'excellent lien.
                            Bonne continuation :)
                            1
                            1. Juste une info comme ca en passant... Le probleme avec les commandes SET - DATE et TIME c'est la "non portabilite" dans certains cas. En effet, comme je le dis un peu plus haut, un batch comportant ces commandes risque de ne pas fonctionner sous W95 ou W98 ou 2000 ou bien XP, tout dépend de la version DOS qui est embarquée.
                              C'est pourquoi l'idéal serait, a mon avis, d'utiliser plutot des petites fonctions (ou programme exe et com) trouvées dans le monde Unix ou a faire soit meme, qui seraient utilisable sur n'importe quelle plateforme.

                              Si vous avez des idées dans ce sens... Je suis preneur. Merci par avance.

                              exemple vardate.exe retournerait, selon ses parametres une variables sous differentes forme JJ_mm_aa ou bien HH_jj_mm ou bien encore LUN (pour lundi=) etc. etc. etc.
                              0
                              • 1
                              • 2