web-dev-qa-db-fra.com

Formater la date et l'heure dans un script batch Windows

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

C'est semblable à la question de débordement de pile Comment ajouter une date dans des fichiers de traitement par lots, mais avec également l'heure.

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%

qui donne:

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

Existe-t-il un moyen de permettre une heure à un chiffre en% TIME% pour obtenir les informations suivantes?

2009_07_28__08_36_01
167
laurie

J'ai fini avec ce script:

set hour=%time:~0,2%
if "%hour:~0,1%" == " " set hour=0%hour:~1,1%
echo hour=%hour%
set min=%time:~3,2%
if "%min:~0,1%" == " " set min=0%min:~1,1%
echo min=%min%
set secs=%time:~6,2%
if "%secs:~0,1%" == " " set secs=0%secs:~1,1%
echo secs=%secs%

set year=%date:~-4%
echo year=%year%

:: Sur WIN2008R2 par exemple J'avais besoin de faire votre 'set month =% date: ~ 3,2%' comme ci-dessous :: sinon 00 apparaît pour le mois

set month=%date:~4,2%
if "%month:~0,1%" == " " set month=0%month:~1,1%
echo month=%month%
set day=%date:~0,2%
if "%day:~0,1%" == " " set day=0%day:~1,1%
echo day=%day%

set datetimef=%year%%month%%day%_%hour%%min%%secs%

echo datetimef=%datetimef%
136
laurie
@ECHO OFF
: Sets the proper date and time stamp with 24Hr Time for log file naming
: convention

SET HOUR=%time:~0,2%
SET dtStamp9=%date:~-4%%date:~4,2%%date:~7,2%_0%time:~1,1%%time:~3,2%%time:~6,2% 
SET dtStamp24=%date:~-4%%date:~4,2%%date:~7,2%_%time:~0,2%%time:~3,2%%time:~6,2%

if "%HOUR:~0,1%" == " " (SET dtStamp=%dtStamp9%) else (SET dtStamp=%dtStamp24%)

ECHO %dtStamp%

PAUSE
65
The lorax

Voici comment je génère un nom de fichier journal (basé sur http://ss64.com/nt/syntax-getdate.html ):

@ECHO OFF
:: Check WMIC is available
WMIC.EXE Alias /? >NUL 2>&1 || GOTO s_error

:: Use WMIC to retrieve date and time
FOR /F "skip=1 tokens=1-6" %%G IN ('WMIC Path Win32_LocalTime Get Day^,Hour^,Minute^,Month^,Second^,Year /Format:table') DO (
   IF "%%~L"=="" goto s_done
      Set _yyyy=%%L
      Set _mm=00%%J
      Set _dd=00%%G
      Set _hour=00%%H
      SET _minute=00%%I
      SET _second=00%%K
)
:s_done

:: Pad digits with leading zeros
      Set _mm=%_mm:~-2%
      Set _dd=%_dd:~-2%
      Set _hour=%_hour:~-2%
      Set _minute=%_minute:~-2%
      Set _second=%_second:~-2%

Set logtimestamp=%_yyyy%-%_mm%-%_dd%_%_hour%_%_minute%_%_second%
goto make_dump

:s_error
echo WMIC is not available, using default log filename
Set logtimestamp=_

:make_dump
set FILENAME=database_dump_%logtimestamp%.sql
...
56
nightcoder

Si PowerShell est installé, vous pouvez facilement et de manière fiable obtenir la date/heure dans le format de votre choix, par exemple:

for /f %%a in ('powershell -Command "Get-Date -format yyyy_MM_dd__HH_mm_ss"') do set datetime=%%a
move "%oldfile%" "backup-%datetime%"

Bien sûr, de nos jours, PowerShell est toujours installé, mais sous Windows XP, vous souhaiterez probablement utiliser cette technique uniquement si votre script de traitement par lots est utilisé dans un environnement connu dans lequel vous savez que PS est disponible (ou enregistrez votre si PowerShell est disponible ...)

Vous pouvez raisonnablement vous demander: pourquoi utiliser un fichier de traitement du tout si vous pouvez utiliser PowerShell pour obtenir la date et l'heure, mais je pense que certaines des raisons évidentes sont les suivantes: (b) vous mettez à jour un ancien script et vous ne voulez pas tout transférer à PS. 

34
G. Lombard

Je le fais habituellement de cette façon chaque fois que j'ai besoin d'une chaîne de date/heure:

set dt=%DATE:~6,4%_%DATE:~3,2%_%DATE:~0,2%__%TIME:~0,2%_%TIME:~3,2%_%TIME:~6,2%
set dt=%dt: =0%

Ceci est pour le format de date/heure allemand (jj.mm.aaaa hh: mm: ss). Fondamentalement, je concatène les sous-chaînes et remplace finalement tous les espaces par des zéros.

Brève explication du fonctionnement des sous-chaînes:

%VARIABLE:~num_chars_to_skip,num_chars_to_keep%

Donc, pour obtenir l'année juste à partir d'une date du type "29.03.2018", utilisez:

%DATE:~6,4%
       ^-----skip 6 characters
         ^---keep 4 characters 
31
mrt

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

SET LOGTIME=%TIME: =0%

Il remplace les espaces par des 0 et bascule généralement l'heure.

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

27
opello

Comme il 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 jj-MM-aaaa pour n'en nommer que deux). Cela pourrait être déterminé, mais au moment où vous ferez le stress et l'analyse, vous vous retrouverez toujours dans une situation dans laquelle un format inattendu est utilisé, et des ajustements supplémentaires seront nécessaires.

Vous pouvez également utiliser un programme externe qui renverra un slug de date dans le format de votre choix, mais le fait de devoir distribuer le programme utilitaire avec votre script/batch présente des inconvénients.

Il existe également des astuces discontinues utilisant l’horloge CMOS de façon plutôt crue, mais c’est trop près des câbles nus pour la plupart des gens et ce n’est pas toujours l’emplacement privilégié pour récupérer la date/heure.

Vous trouverez ci-dessous une solution qui évite les problèmes ci-dessus. Oui, cela introduit d'autres problèmes, mais pour les besoins de mon travail, j'ai trouvé que c'était la solution la plus facile, la plus claire et la plus portable pour créer un horodatage dans les fichiers .bat pour les systèmes Windows modernes. Ceci est juste un exemple, mais je pense que vous verrez comment 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
20
jph

Ce qui suit peut ne pas être 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 inspirant.

9
ufukgun

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

2009_07_28__08_36_01

Ensuite, vous pouvez utiliser les 3 lignes de code suivantes qui utilisent% date% et% time%:

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

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

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

echo %mytimestamp%
Wed_08052015_124950_93
8
Jesse
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%
6
Mike Raynham

Le formatage offset:length pris en charge avec la commande SET dans Windows ne vous permettra pas de remplir le 0 comme vous semblez être intéressé.

Cependant, vous pouvez coder un script BATCH pour vérifier que l’heure est inférieure à 10 et
pad en conséquence avec une chaîne echo différente.

Vous trouverez quelques informations sur la commande SET sur ce lien


Vous pouvez également utiliser d'autres méthodes de programmation pour vous y rendre. 

C’est assez simple dans unix bash (disponible avec Cygwin sous Windows) de simplement dire,

date +%Y_%m_%d__%H_%M_%S

Et, il tamponne toujours correctement.

6
nik

Je l'ai fait comme ça:

REM Generate FileName from date and time in format YYYYMMTTHHMM

Time /T > Time.dat
set /P ftime= < Time.dat

set FileName=LogFile%date:~6%%date:~3,2%%date:~0,2%%ftime:~0,2%%ftime:~3,2%.log

echo %FileName%

FichierJournal201310170928.log

5
Ice
::========================================================================  
::== CREATE UNIQUE DATETIME STRING IN FORMAT YYYYMMDD-HHMMSS   
::======= ================================================================  
FOR /f %%a IN ('WMIC OS GET LocalDateTime ^| FIND "."') DO SET DTS=%%a  
SET DATETIME=%DTS:~0,8%-%DTS:~8,6%  



4
Kees

Pour générer un horodatage YYYY-MM-DD hh:mm:ss (24 heures), j'utilise:

SET CURRENTTIME=%TIME%
IF "%CURRENTTIME:~0,1%"==" " (SET CURRENTTIME=0%CURRENTTIME:~1%)
FOR /F "tokens=2-4 delims=/ " %%A IN ('DATE /T') DO (SET TIMESTAMP=%%C-%%A-%%B %CURRENTTIME%)
3
M. Dudley

Je suis vraiment nouveau dans les fichiers batch et c'est mon code !! (Je ne sais pas pourquoi, mais je ne pouvais pas combiner date/t et time/t et je ne pouvais pas utiliser % date% et % time% directement sans variable ...)

@ECHO OFF
set ldt=%date% %time%
echo %ldt%>> logs.txt
EXIT

C'est en quelque sorte réutilisé par d'autres (la question était d'obtenir un timedate formaté à utiliser comme nom de fichier).

3
Kelly
set hourstr = %time:~0,2%
if "%time:~0,1%"==" " (set hourstr=0%time:~1,1%)
set datetimestr=%date:~0,4%%date:~5,2%%date:~8,2%-%hourstr%%time:~3,2%%time:~6,2%
2
Will Wu

Ce script de traitement par lots fera exactement ce que souhaite O.P. (testé sous Windows XP SP3). 

J'ai également utilisé cette astuce de registre intelligente décrite par "jph" précédemment, dont IMHO est le moyen le plus simple d'obtenir un formatage cohérent à 100% de la date en "yyyy_MM_dd" sur tout système Windows nouveau ou ancien. La modification d'une valeur de registre pour ce faire est instantanée, temporaire et triviale; cela ne dure que quelques millisecondes avant de revenir immédiatement.

Double-cliquez sur ce fichier de commandes pour une démonstration instantanée. La fenêtre d'invite de commande s'ouvre et affiche votre horodatage. . . . .

@ECHO OFF
SETLOCAL & MODE CON:COLS=80 LINES=15 & COLOR 0A
TITLE GENERATE A CUSTOM FORMATTED TIMESTAMP USING %%DATE%% AND %%TIME%% COMMANDS

:: --- CHANGE THE COMPUTER DATE FORMAT TEMPORARILY TO MY PREFERENCE "yyyy_MM_dd",
REG COPY "HKCU\Control Panel\International" "HKCU\Control Panel\International-Temp" /f 2>nul >nul
REG ADD "HKCU\Control Panel\International" /v sShortDate /d "yyyy_MM_dd" /f 2>nul >nul
SET MYDATE=%date%
:: --- REVERT COMPUTER DATE BACK TO SYSTEM PREFERENCE
REG COPY "HKCU\Control Panel\International-Temp" "HKCU\Control Panel\International" /f 2>nul >nul
REG DELETE "HKCU\Control Panel\International-Temp" /f 2>nul >nul

:: --- SPLIT THE TIME DIGITS TO THREE BLOCKS [H] [MM] [SS.SS]
FOR /F "tokens=1-3 delims=:" %%A IN ('echo %time%') DO SET HOUR=%%A& SET MINUTES=%%B& SET SECONDS=%%C

:: --- YOUR CHOICE - FOR 4 DIGIT SECONDS - REMOVES THE DOT FROM THE SECONDS BLOCK [SS.SS]
:: SET SECONDS=%SECONDS:.=%
:: --- YOUR CHOICE - FOR 2 DIGIT SECONDS - GETS THE FIRST TWO DIGITS FROM THE SECONDS BLOCK [SS.SS]
SET SECONDS=%SECONDS:~0,2%

:: --- GET THE "AM PM" STRING TO CHECK THE HOUR BLOCK
FOR /F "tokens=1,2 delims= " %%A IN ('time /t') DO SET AM_PM=%%B  

:: --- CONVERT THE HOUR BLOCK [H] TO "24 HOUR" FORMAT [HH]
IF %AM_PM%==PM (
IF %HOUR%==01 (SET HOUR=13)
IF %HOUR%==02 (SET HOUR=14)
IF %HOUR%==03 (SET HOUR=15)
IF %HOUR%==04 (SET HOUR=16)
IF %HOUR%==05 (SET HOUR=17)
IF %HOUR%==06 (SET HOUR=18)
IF %HOUR%==07 (SET HOUR=19)
IF %HOUR%==08 (SET HOUR=20)
IF %HOUR%==09 (SET HOUR=21)
IF %HOUR%==10 (SET HOUR=22)
IF %HOUR%==11 (SET HOUR=23)
) ELSE (
IF %HOUR%==12 (SET HOUR=00)
IF %HOUR%==1 (SET HOUR=01)
IF %HOUR%==2 (SET HOUR=02)
IF %HOUR%==3 (SET HOUR=03)
IF %HOUR%==4 (SET HOUR=04)
IF %HOUR%==5 (SET HOUR=05)
IF %HOUR%==6 (SET HOUR=06)
IF %HOUR%==7 (SET HOUR=07)
IF %HOUR%==8 (SET HOUR=08)
IF %HOUR%==9 (SET HOUR=09)
)

:: --- GENERATE OUR WANTED TIMESTAMP
ECHO. & ECHO.
SET TIMESTAMP=%MYDATE%__%HOUR%_%MINUTES%_%SECONDS%
ECHO    Your timestamp is:    %TIMESTAMP%

:: --- WAIT - VIEW THE RESULT IN THE CONSOLE SCREEN
ECHO. & ECHO.
ECHO    Job is done. Press any key to exit . . .
PAUSE > NUL

EXIT
2
derty2

Ce fichier bat (enregistrer sous datetimestr.bat) produit la chaîne datetime 3 fois: (1) chaîne datetime longue avec jour de la semaine et secondes, (2) chaîne datetime courte sans eux et (3) version abrégée du code.

@echo off
REM "%date: =0%" replaces spaces with zeros
set d=%date: =0%
REM "set yyyy=%d:~-4%" pulls the last 4 characters
set yyyy=%d:~-4%
set mm=%d:~4,2%
set dd=%d:~7,2%
set dow=%d:~0,3%
set d=%yyyy%-%mm%-%dd%_%dow%

set t=%TIME: =0%
REM "%t::=%" removes semi-colons
REM Instead of above, you could use "%t::=-%" to 
REM replace semi-colons with hyphens (or any 
REM non-special character)
set t=%t::=%
set t=%t:.=%

set datetimestr=%d%_%t%
@echo  Long date time str = %datetimestr%

set d=%d:~0,10%
set t=%t:~0,4%
set datetimestr=%d%_%t%
@echo Short date time str = %datetimestr%


@REM Short version of the code above
set d=%date: =0%
set t=%TIME: =0%
set datetimestr=%d:~-4%-%d:~4,2%-%d:~7,2%_%d:~0,3%_%t:~0,2%%t:~3,2%%t:~6,2%%t:~9,2%
@echo Datetimestr = %datetimestr%

pause

Pour donner un crédit, j'ai fusionné les concepts de Peter Mortensen (18 juin 14 à 21h02) et opello (25 août '11 à 14h27). 

Vous pouvez écrire cela beaucoup plus court, mais cette version longue facilite la lecture et la compréhension du code. 

2
cadvena

Créez un fichier appelé "search_files.bat" et placez le contenu ci-dessous dans le fichier. Puis double-cliquez dessus. La variable temporaire% THH% a été mise en place pour gérer correctement le MA. S'il existe un 0 dans les 2 premiers chiffres du temps, Windows ignore le reste du nom du fichier LOG.

CD .
SET THH=%time:~0,2%
SET THH=%THH: =0%
dir /s /b *.* > %date:~10,4%-%date:~4,2%-%date:~7,2%@%THH%.%time:~3,2%.%time:~6,2%.LOG
2
MacGyver

J'aime la version courte au-dessus de @Lorax, , Mais pour d'autres paramètres de langue, il pourrait être légèrement différent. 

Par exemple, dans les paramètres de langue allemande (avec le format de date naturel: jj.mm.aaaa), la requête du mois doit être modifiée de 4,2 à 3,2:

@ECHO OFF
: Sets the proper date and time stamp with 24h time for log file naming convention i.e.

SET HOUR=%time:~0,2%
SET dtStamp9=%date:~-4%%date:~3,2%%date:~7,2%_0%time:~1,1%%time:~3,2%%time:~6,2% 
SET dtStamp24=%date:~-4%%date:~3,2%%date:~7,2%_%time:~0,2%%time:~3,2%%time:~6,2%

if "%HOUR:~0,1%" == " " (SET dtStamp=%dtStamp9%) else (SET dtStamp=%dtStamp24%)

ECHO %dtStamp%
: Outputs= 20160727_081040
: (format: YYYYMMDD_HHmmss; e.g.: the date-output of this post timestamp)

PAUSE
2
webMac

Il existe un autre moyen facile de le faire:

set HH=%time:~0,2%
if %HH% LEQ 9 (
set HH=%time:~1,1%
)
1
vijay

Dans des situations comme celle-ci, utilisez une approche de programmation standard simple: Au lieu de déployer des efforts considérables pour analyser une entité inconnue, enregistrez simplement la configuration actuelle, réinitialisez-la dans un état connu, extrayez les informations puis restaurez l’état initial. Utilisez uniquement les ressources Windows standard.

Plus précisément, les formats de date et d’heure sont stockés sous la clé de registre HKCU\Panneau de configuration\International\dans [définition MS] "values": "sTimeFormat" et "sShortDate". Reg est l'éditeur de registre de la console inclus avec toutes les versions de Windows . Les privilèges élevés ne sont pas requis pour modifier la clé HKCU.

Prompt $N:$D $T$G

::Save current config to a temporary (unique name) subkey, Exit if copy fails
Set DateTime=
Set ran=%Random%
Reg copy "HKCU\Control Panel\International" "HKCU\Control Panel\International-Temp%ran%" /f
If ErrorLevel 1 GoTO :EOF

::Reset the date format to your desired output format (take effect immediately)
::Resetting the time format is useless as it only affect subsequent console windows
::Reg add "HKCU\Control Panel\International" /v sTimeFormat /d "HH_mm_ss"   /f
Reg add "HKCU\Control Panel\International" /v sShortDate  /d "yyyy_MM_dd" /f

::Concatenate the time and (reformatted) date strings, replace any embedded blanks with zeros
Set DateTime=%date%__%time:~0,2%_%time:~3,2%_%time:~6,2%
Set DateTime=%DateTime: =0%

::Restore the original config and delete the temp subkey, Exit if restore fails
Reg copy   "HKCU\Control Panel\International-Temp%ran%" "HKCU\Control Panel\International" /f
If ErrorLevel 1 GoTO :EOF
Reg delete "HKCU\Control Panel\International-Temp%ran%" /f

Simple, direct et devrait fonctionner pour toutes les régions.

Pour des raisons que je ne comprends pas, réinitialiser la valeur "sShortDate" prend effet immédiatement dans Dans une fenêtre de console, mais en réinitialisant la valeur très similaire "sTimeFormat", PAS prend effet. la fenêtre est ouverte. Cependant, la seule chose qui peut changer est le délimiteur - Les positions des chiffres sont fixes. De même, le jeton de temps "HH" est supposé préfixer les zéros non significatifs, mais ce n'est pas le cas. Heureusement, les solutions de contournement sont faciles.

1
ArtK

J'ai essayé la réponse acceptée et cela fonctionne plutôt bien. Malheureusement, le format de l'heure américaine semble être H: MM: SS.CS, et le 0 manquant au recto causait des problèmes d'analyse avant 10 heures. Pour surmonter cet obstacle et permettre également l’analyse de la plupart des formats horaires mondiaux, j’ai imaginé cette routine simple qui semble fonctionner assez bien.

:ParseTime
rem The format of %%TIME%% is H:MM:SS.CS or (HH:MM:SS,CS) for example 0:01:23.45 or 23:59:59,99
FOR /F "tokens=1,2,3,4 delims=:.," %%a IN ("%1") DO SET /A "%2=(%%a * 360000) + (%%b * 6000) + (%%c * 100) + %%d"
GOTO :EOF

La bonne chose avec cette routine est que vous transmettez la chaîne de temps en tant que premier paramètre et le nom de la variable d’environnement que vous voulez contenir le temps (en centisecondes) en tant que second paramètre. Par exemple:

CALL :ParseTime %START_TIME% START_CS
CALL :ParseTime %TIME% END_CS
SET /A DURATION=%END_CS% - %START_CS%

(* Chris *)

1
TheChrisPratt

Peut-être quelque chose comme ça:

@call:DateTime

@for %%? in (
    "Year   :Y"
    "Month  :M"
    "Day    :D"
    "Hour   :H"
    "Minutes:I"
    "Seconds:S"
) do @for /f "tokens=1-2 delims=:" %%# in (%%?) do @for /f "delims=" %%_ in ('echo %%_DT_%%$_%%') do @echo %%# : _DT_%%$_ : %%_

:: OUTPUT
:: Year    : _DT_Y_ : 2014
:: Month   : _DT_M_ : 12
:: Day     : _DT_D_ : 17
:: Hour    : _DT_H_ : 09
:: Minutes : _DT_I_ : 04
:: Seconds : _DT_S_ : 35

@pause>nul

@goto:eof

:DateTime
    @verify errorlevel 2>nul & @wmics Alias /? >nul 2>&1
    @if not errorlevel 1 (
        @for /f "skip=1 tokens=1-6" %%a in ('wmic path win32_localtime get day^,hour^,minute^,month^,second^,year /format:table') do @if not "%%f"=="" ( set "_DT_D_=%%a" & set "_DT_H_=%%b" & set "_DT_I_=%%c" & set "_DT_M_=%%d" & set "_DT_S_=%%e" & set "_DT_Y_=%%f" )
    ) else (
        @set "_DT_T_=1234567890 "
    )
    @if errorlevel 1 (
        @for %%? in ("iDate" "sDate" "iTime" "sTime" "F" "Y" "M" "D" "H" "I" "S") do @set "_DT_%%~?_=%%~?"
        @for %%? in ("Date" "Time") do @for /f "skip=2 tokens=1,3" %%a in ('reg query "HKCU\Control Panel\International" /v ?%%~? 2^>nul') do @for /f %%x in ('echo:%%_DT_%%a_%%') do @if "%%x"=="%%a" set "_DT_%%a_=%%b"
        @for /f "tokens=1-3 delims=%_DT_T_%" %%a in ("%time%") do @set "_DT_T_=%%a%%b%%c"
    )
    @if errorlevel 1 (
        @if "%_DT_iDate_%"=="0" (set "_DT_F_=_DT_D_ _DT_Y_ _DT_M_") else if "%_DT_iDate_%"=="1" (set "_DT_F_=_DT_D_ _DT_M_ _DT_Y_") else if "%_DT_iDate_%"=="2" (set "_DT_F_=_DT_Y_ _DT_M_ _DT_D_")
        @for /f "tokens=1-4* delims=%_DT_sDate_%" %%a in ('date/t') do @for /f "tokens=1-3" %%x in ('echo:%%_DT_F_%%') do @set "%%x=%%a" & set "%%y=%%b" & set "%%z=%%c"
        @for /f "tokens=1-3 delims=%_DT_T_%" %%a in ("%time%") do @set "_DT_H_=%%a" & set "_DT_I_=%%b" & set "_DT_S_=%%c"
        @for %%? in ("iDate" "sDate" "iTime" "sTime" "F" "T") do @set "_DT_%%~?_="
    )
    @for %%i in ("Y"                ) do @for /f %%j in ('echo:"%%_DT_%%~i_%%"') do @set /a _DT_%%~i_+=  0 & @for /f %%k in ('echo:"%%_DT_%%~i_:~-4%%"') do @set "_DT_%%~i_=%%~k"
    @for %%i in ("M" "D" "H" "I" "S") do @for /f %%j in ('echo:"%%_DT_%%~i_%%"') do @set /a _DT_%%~i_+=100 & @for /f %%k in ('echo:"%%_DT_%%~i_:~-2%%"') do @set "_DT_%%~i_=%%~k"
@exit/b
1
SerGeeK Kasimov

Ceci est mes 2 cents pour undatetime string. Sur MM DD YYYY, les systèmes commutent les première et deuxième entrées %DATE:~.

    REM ====================================================================================
    REM CREATE UNIQUE DATETIME STRING FOR ADDING TO FILENAME
    REM ====================================================================================
    REM Can handle dd DDxMMxYYYY and DDxMMxYYYY > CREATES YYYYMMDDHHMMSS (x= any character)
    REM ====================================================================================
    REM CHECK for SHORTDATE dd DDxMMxYYYY 
    IF "%DATE:~0,1%" GTR "3" (
        SET DATETIME=%DATE:~9,4%%DATE:~6,2%%DATE:~3,2%%TIME:~0,2%%TIME:~3,2%%TIME:~6,2%
    ) ELSE (
    REM ASSUMES SHORTDATE DDxMMxYYYY
        SET DATETIME=%DATE:~6,4%%DATE:~3,2%%DATE:~0,2%%TIME:~0,2%%TIME:~3,2%%TIME:~6,2%
        )
    REM CORRECT FOR HOURS BELOW 10
    IF %DATETIME:~8,2% LSS 10 SET DATETIME=%DATETIME:~0,8%0%DATETIME:~9,5%
    ECHO %DATETIME%
1
Case

Pour une solution très simple de date numérique à utiliser dans les noms de fichiers, utilisez le code suivant:

set month=%date:~4,2%
set day=%date:~7,2%
set curTimestamp=%month%%day%%year%

rem then the you can add a prefix and a file extension easily like this
echo updates%curTimestamp%.txt
0
Thomas Boomer

Ce script utilise une interface WMI accessible en primaire via l’outil WMIC, qui fait partie intégrante de Windows depuis Windows XP Professional (l'édition Home est également prise en charge, mais l'outil n'est pas installé par défaut). Le script implémente également une solution de contournement de l'outil WMIC manquant en créant et en appelant un vbscript WSH pour accéder à une interface WMI et écrire sur la sortie de la console l'heure au même format que celui fourni par l'outil WMIC.

@ECHO OFF
REM Returns: RETURN
REM Modify:  RETURN, StdOut
REM Required - mandatory: none
REM Required - optionaly: format strings delimited by a space to format an output delimited by predefined delimiter
REM    YYYY = 4-digit year
REM      MM = 2-digit month
REM      DD = 2-digit day
REM      hh = 2-digit hour
REM      mm = 2-digit minute
REM      ss = 2-digit second
REM      ms = 3-digit millisecond

CALL :getTime %*
ECHO %RETURN%
GOTO :EOF


REM SUBROUTINE
REM Returns: RETURN
REM Modify:  RETURN
REM Required - mandatory: none
REM Required - optionaly: format strings delimited by a space to format an output delimited by predefined delimiter
REM    YYYY = 4-digit year
REM      MM = 2-digit month
REM      DD = 2-digit day
REM      hh = 2-digit hour
REM      mm = 2-digit minute
REM      ss = 2-digit second
REM      ms = 3-digit millisecond
:getTime
  SETLOCAL EnableDelayedExpansion
    SET DELIM=-
    WHERE /Q wmic.exe
    IF NOT ERRORLEVEL 1 FOR /F "usebackq skip=1 tokens=*" %%x IN (`wmic.exe os get LocalDateTime`) DO (SET DT=%%x & GOTO getTime_Parse)
    SET _TMP=%TEMP:"=%
    ECHO Wscript.StdOut.WriteLine (GetObject("winmgmts:root\cimv2:Win32_OperatingSystem=@").LocalDateTime)>"%_TMP%\get_time_local-helper.vbs"
    FOR /F "usebackq tokens=*" %%x IN (`cscript //B //NoLogo "%_TMP%\get_time_local-helper.vbs"`) DO (SET DT=%%x & GOTO getTime_Parse)
    :getTime_Parse
      SET _RET=
      IF "%1" EQU "" (
        SET _RET=%DT:~0,4%%DELIM%%DT:~4,2%%DELIM%%DT:~6,2%%DELIM%%DT:~8,2%%DELIM%%DT:~10,2%%DELIM%%DT:~12,2%%DELIM%%DT:~15,3%
      ) ELSE (
        REM Not recognized format strings are ignored during parsing - no error is reported.
       :getTime_ParseLoop
         SET _VAL=
         IF "%1" EQU "YYYY" SET _VAL=%DT:~0,4%
         IF "%1" EQU "MM"   SET _VAL=%DT:~4,2%
         IF "%1" EQU "DD"   SET _VAL=%DT:~6,2%
         IF "%1" EQU "hh"   SET _VAL=%DT:~8,2%
         IF "%1" EQU "mm"   SET _VAL=%DT:~10,2%
         IF "%1" EQU "ss"   SET _VAL=%DT:~12,2%
         IF "%1" EQU "ms"   SET _VAL=%DT:~15,3%
         IF DEFINED _VAL (
           IF DEFINED _RET (
             SET _RET=!_RET!%DELIM%!_VAL!
           ) ELSE (
             SET _RET=!_VAL!
           )
         )
         SHIFT
         IF "%1" NEQ "" GOTO getTime_ParseLoop
      )
  ENDLOCAL & SET RETURN=%_RET%
GOTO :EOF
0
Petr Matlas
:: =============================================================
:: Batch file to display Date and Time seprated by undescore.
:: =============================================================
:: Read the system date.
:: =============================================================
@SET MyDate=%DATE%
@SET MyDate=%MyDate:/=:%
@SET MyDate=%MyDate:-=:%
@SET MyDate=%MyDate: =:%
@SET MyDate=%MyDate:\=:%
@SET MyDate=%MyDate::=_%
:: =============================================================
:: Read the system time.
:: =============================================================
@SET MyTime=%TIME%
@SET MyTime=%MyTime: =0%
@SET MyTime=%MyTime:.=:%
@SET MyTime=%MyTime::=_%
:: =============================================================
:: Build the DateTime string.
:: =============================================================
@SET DateTime=%MyDate%_%MyTime%
:: =============================================================
:: Display the Date and Time as it is now.
:: =============================================================
@ECHO MyDate="%MyDate%" MyTime="%MyTime%" DateTime="%DateTime%"
:: =============================================================
:: Wait before close.
:: =============================================================
@PAUSE
:: =============================================================
0
Christo

En utilisant%, vous rencontrerez une erreur d'opération hexadécimale lorsque la valeur de l'heure est 7-9. Pour éviter cela, utilisez DelayedExpansion et récupérez les valeurs de temps avec! Min: ~ 1!

Une autre méthode, si vous avez PowerShell est d'appeler cela:

for /F "usebackq delims=Z" %%i IN (`powershell Get-Date -format u`) do (set server-time=%%i)
0
Leland

Divisez les résultats de la commande de date par une barre oblique, puis vous pourrez déplacer chacun des jetons dans les variables appropriées.

FOR /F "tokens=1-3 delims=/" %%a IN ("%date:~4%") DO (
SET _Month=%%a
SET _Day=%%b
SET _Year=%%c
)
ECHO Month %_Month%
ECHO Day %_Day%
ECHO Year %_Year%
0
Casey

Une astuce simple sur une seule ligne pour éviter une expansion précoce des variables consiste à utiliser cmd /c echo ^%time^%

cmd /c echo ^%time^% & dir /s somelongcommand & cmd /c echo ^%time^%
0
tresf

Utilisez REG pour sauvegarder/modifier/restaurer les valeurs les plus utiles pour votre fichier bat. Il s’agit de Windows 7; pour d’autres versions, vous aurez peut-être besoin d’un nom de clé différent.

reg save    "HKEY_CURRENT_USER\Control Panel\International" _tmp.reg /y
reg add     "HKEY_CURRENT_USER\Control Panel\International" /v sShortDate  /d "yyyy-MM-dd" /f
set file=%DATE%-%TIME: =0%
reg restore "HKEY_CURRENT_USER\Control Panel\International" _tmp.reg
set file=%file::=-%
set file=%file:.=-%
set file
0
Malcolm