Extraire la date avec Ms-dos
Résoluje 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
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.
-
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 -
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 -
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)
-
for /f "tokens=1-3 delims=:" %%i in ('time /t') do echo Testing: %date:/=_% %%ih%%j >> _test-date-time.txt
=) -
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 -
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 -
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 -
extraire la date sous le format:
jour de semaine (lundi.....vendredi)
jour(dd)
mois(mm)
année(aaaa) -
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.-
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...
-
-
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 -
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. -
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!!! -
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. -
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. -
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 -
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.
-
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) -
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? -
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 :) -
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.
- 1
- 2