221 votes

Formatage de la date et de l'heure dans un script Windows batch.

Dans un script batch Windows (Windows XP), j'ai besoin de formater la date et l'heure actuelles pour une utilisation ultérieure dans les noms de fichiers, etc.

C'est similaire à la question de Stack Overflow Comment ajouter une date dans des fichiers batch mais aussi du temps.

J'ai ceci jusqu'à présent :

echo %DATE%
echo %TIME%
set datetimef=%date:~-4%_%date:~3,2%_%date:~0,2%__%time:~0,2%_%time:~3,2%_%time:~6,2%
echo %datetimef%

ce qui donne :

28/07/2009
 8:35:31.01
2009_07_28__ 8_36_01

Existe-t-il un moyen de prendre en compte une heure à un chiffre dans %TIME%, afin d'obtenir ce qui suit ?

2009_07_28__08_36_01

0 votes

Vous pouvez remplacer les espaces vides sur votre datetimef et mettez des 0 à la place. Dans votre exemple : SET datetimef=%datetimef: =0%

32voto

opello Points 1497

J'ai rencontré ce problème aujourd'hui et je l'ai résolu avec :

SET LOGTIME=%TIME: =0%

Il remplace les espaces par des 0 et met l'heure à zéro.

Après quelques recherches rapides, je n'ai pas trouvé si cela nécessitait des extensions de commande (cela fonctionnait toujours avec SETLOCAL DISABLEEXTENSIONS).

0 votes

OK, substitution dans les variables. Maintenant - comment substituer un deux-points ( : )?

0 votes

@TomaszGandor Cela fonctionne pour moi : echo %TIME: =:% mais si ce n'est pas le cas, essayez d'échapper à l'élément : avec un ^ comme echo %TIME: =^:% (ce qui fonctionne également pour moi).

1 votes

+1 pour la simplicité. Les deux points ne sont pas valides dans les noms de fichiers. set theTime=%Time::=% les supprime. Pouvez-vous remplacer l'espace par 0, supprimer les deux points et tronquer le nom à 6 caractères (en supprimant la partie décimale) dans une seule instruction ? Ce n'est pas très grave si cela prend deux ou trois lignes. Je suis simplement curieux.

20voto

jph Points 199

Comme cela a été noté, l'analyse de la date et de l'heure n'est utile que si vous connaissez le format utilisé par l'utilisateur actuel (par exemple, MM/jj/aa ou dd-MM-yyyy pour n'en citer que deux). Cela pourrait être déterminé, mais le temps de faire tout le stress et l'analyse syntaxique, vous vous retrouverez toujours dans une situation où un format inattendu est utilisé, et d'autres ajustements seront nécessaires.

Vous pouvez également utiliser un programme externe qui renverra un slug de date dans votre format préféré, mais cela présente l'inconvénient de devoir distribuer le programme utilitaire avec votre script/batch.

Il existe également des astuces de lots utilisant l'horloge CMOS de manière assez brute, mais c'est trop proche des fils nus pour la plupart des gens, et ce n'est pas toujours l'endroit préféré pour récupérer la date et l'heure.

Vous trouverez ci-dessous une solution qui permet d'éviter les problèmes susmentionnés. Oui, elle introduit d'autres problèmes, mais pour mes besoins, j'ai trouvé que c'était la solution la plus simple, la plus claire et la plus portable pour créer un horodatage dans les fichiers .bat pour les systèmes Windows modernes. Ce n'est qu'un exemple, mais je pense que vous verrez comment le modifier pour d'autres formats de date et/ou d'heure, etc.

reg copy "HKCU\Control Panel\International" "HKCU\Control Panel\International-Temp" /f
reg add "HKCU\Control Panel\International" /v sShortDate /d "yyMMdd" /f
@REM reg query "HKCU\Control Panel\International" /v sShortDate
set LogDate=%date%
reg copy "HKCU\Control Panel\International-Temp" "HKCU\Control Panel\International" /f

3 votes

Juste ce que je cherchais. Quelque chose qui fonctionne dans tous les paramètres locaux. Merci !

0 votes

+1 pour les "systèmes Windows modernes" avec lesquels nous devons composer :) Blague à part, c'est une façon très ingénieuse, et comme vous l'avez dit, portable, de traiter le problème.

11 votes

C'est une solution terrible. Si elle échoue, un paramètre global est modifié de façon permanente. Elle introduit également des conditions de concurrence avec d'autres applications.

13voto

Jesse Points 113

Si vous n'avez pas exactement besoin de ce format :

2009_07_28__08_36_01

Vous pourriez alors utiliser la formule suivante 3 lignes de code qui utilise %date% et %time% :

set mydate=%date:/=%
set mytime=%time::=%
set mytimestamp=%mydate: =_%_%mytime:.=_%

Remarque : Les caractères / y : sont supprimés et le caractère . et l'espace est remplacé par un trait de soulignement.

Exemple de sortie (prise le mercredi 8/5/15 à 12:49 PM avec 50 secondes et 93 millisecondes) :

echo %mytimestamp%
Wed_08052015_124950_93

9voto

ufukgun Points 2426

Ce qui suit n'est peut-être pas une réponse directe mais une réponse proche ?

set hour=%time:~0,2%
if "%hour:~0,1%" == " " set datetimef=%date:~-4%_%date:~3,2%_%date:~0,2%__0%time:~1,2%_%time:~3,2%_%time:~6,2%
else set datetimef=%date:~-4%_%date:~3,2%_%date:~0,2%__%time:~0,2%_%time:~3,2%_%time:~6,2%

Au moins, cela peut être une source d'inspiration.

9voto

Mike Raynham Points 31
REM Assumes UK style date format for date environment variable (DD/MM/YYYY).
REM Assumes times before 10:00:00 (10am) displayed padded with a space instead of a zero.
REM If first character of time is a space (less than 1) then set DATETIME to:
REM YYYY-MM-DD-0h-mm-ss
REM Otherwise, set DATETIME to:
REM YYYY-MM-DD-HH-mm-ss
REM Year, month, day format provides better filename sorting (otherwise, days grouped
REM together when sorted alphabetically).

IF "%time:~0,1%" LSS "1" (
   SET DATETIME=%date:~6,4%-%date:~3,2%-%date:~0,2%-0%time:~1,1%-%time:~3,2%-%time:~6,2%
) ELSE (
   SET DATETIME=%date:~6,4%-%date:~3,2%-%date:~0,2%-%time:~0,2%-%time:~3,2%-%time:~6,2%
)

ECHO %DATETIME%

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X