Comment enregistrer la date actuelle au format AAAA-MM-JJ dans une variable d'un fichier Windows .bat?
Analogue Unix Shell:
today=`date +%F`
echo $today
Vous pouvez obtenir la date du jour d’une manière indépendante de la localisation en utilisant
for /f "skip=1" %%x in ('wmic os get localdatetime') do if not defined MyDate set MyDate=%%x
Ensuite, vous pouvez extraire les pièces individuelles à l’aide de sous-chaînes:
set today=%MyDate:~0,4%-%MyDate:~4,2%-%MyDate:~6,2%
Une autre façon, où vous obtenez des variables contenant les parties individuelles, serait:
for /f %%x in ('wmic path win32_localtime get /format:list ^| findstr "="') do set %%x
set today=%Year%-%Month%-%Day%
Beaucoup plus agréable que de jouer avec des sous-chaînes, au prix de polluer votre espace de noms de variable.
Si vous avez besoin du temps UTC au lieu de l'heure locale, la commande est plus ou moins la même:
for /f %%x in ('wmic path win32_utctime get /format:list ^| findstr "="') do set %%x
set today=%Year%-%Month%-%Day%
Si vous souhaitez atteindre cet objectif à l'aide de commandes MS-DOS standard dans un fichier de commandes, vous pouvez utiliser:
FOR /F "TOKENS=1 eol=/ DELIMS=/ " %%A IN ('DATE/T') DO SET dd=%%A
FOR /F "TOKENS=1,2 eol=/ DELIMS=/ " %%A IN ('DATE/T') DO SET mm=%%B
FOR /F "TOKENS=1,2,3 eol=/ DELIMS=/ " %%A IN ('DATE/T') DO SET yyyy=%%C
Je suis sûr que cela peut encore être amélioré, mais cela donne la date en 3 variables pour Jour (jj), Mois (mm) et Année (aaaa). Vous pouvez ensuite les utiliser plus tard dans votre script de traitement par lots, si nécessaire.
SET todaysdate=%yyyy%%mm%%dd%
echo %dd%
echo %mm%
echo %yyyy%
echo %todaysdate%
Bien que je comprenne que la réponse à cette question a été acceptée, cette méthode alternative peut être appréciée par de nombreuses personnes qui souhaitent y parvenir sans utiliser la console WMI. J'espère donc que cette solution ajoute une valeur à cette question.
Utilisez date/T pour trouver le format sur invite de commande.
Si le format de date est "Jeu 03/03/2016", utilisez comme suit:
set datestr=%date:~10,4%-%date:~7,2%-%date:~4,2%
echo %datestr%
Deux autres moyens qui ne dépendent pas des paramètres de temps (tous deux pris de Comment obtenir des données/l'heure indépendamment de la localisation) Et les deux reçoivent également le jour de la semaine et aucun d’entre eux n’a besoin d’autorisation administrateur!:
MAKECAB - fonctionnera sur TOUS les systèmes Windows (rapidement, mais crée un petit fichier temporaire) (le script foxidrive):
@echo off
pushd "%temp%"
makecab /D RptFileName=~.rpt /D InfFileName=~.inf /f nul >nul
for /f "tokens=3-7" %%a in ('find /i "makecab"^<~.rpt') do (
set "current-date=%%e-%%b-%%c"
set "current-time=%%d"
set "weekday=%%a"
)
del ~.*
popd
echo %weekday% %current-date% %current-time%
pause
ROBOCOPY - ce n'est pas une commande native pour Windows XP et Windows Server 2003 , mais il peut être téléchargé depuis le site de Microsoft . Mais il est intégré à tout ce qui concerne Windows Vista et les versions ultérieures:
@echo off
setlocal
for /f "skip=8 tokens=2,3,4,5,6,7,8 delims=: " %%D in ('robocopy /l * \ \ /ns /nc /ndl /nfl /np /njh /XF * /XD *') do (
set "dow=%%D"
set "month=%%E"
set "day=%%F"
set "HH=%%G"
set "MM=%%H"
set "SS=%%I"
set "year=%%J"
)
echo Day of the week: %dow%
echo Day of the month : %day%
echo Month : %month%
echo hour : %HH%
echo minutes : %MM%
echo seconds : %SS%
echo year : %year%
endlocal
Et trois autres façons d’utiliser d’autres langages de script Windows. Ils vous donneront plus de flexibilité, par exemple. vous pouvez obtenir la semaine de l'année, le temps en millisecondes et ainsi de suite.
JScript/BATCH hybride (doit être enregistré sous le nom .bat
). JScript est disponible sur tous les systèmes à partir de Windows NT et supérieur, dans le cadre de Windows Script Host ( peut être désactivé via le registre, il s'agit d'un cas rare ):
@if (@X)==(@Y) @end /* ---Harmless hybrid line that begins a JScript comment
@echo off
cscript //E:JScript //nologo "%~f0"
exit /b 0
*------------------------------------------------------------------------------*/
function GetCurrentDate() {
// Today date time which will used to set as default date.
var todayDate = new Date();
todayDate = todayDate.getFullYear() + "-" +
("0" + (todayDate.getMonth() + 1)).slice(-2) + "-" +
("0" + todayDate.getDate()).slice(-2) + " " + ("0" + todayDate.getHours()).slice(-2) + ":" +
("0" + todayDate.getMinutes()).slice(-2);
return todayDate;
}
WScript.Echo(GetCurrentDate());
VBScript/BATCH hybrid ( Est-il possible d'incorporer et d'exécuter VBScript dans un fichier batch sans utiliser de fichier temporaire? ) Même cas que jScript, mais l'hybridation n'est pas si parfaite:
:sub echo(str) :end sub
echo off
'>nul 2>&1|| copy /Y %windir%\System32\doskey.exe %windir%\System32\'.exe >nul
'& echo current date:
'& cscript /nologo /E:vbscript "%~f0"
'& exit /b
'0 = vbGeneralDate - Default. Returns date: mm/dd/yy and time if specified: hh:mm:ss PM/AM.
'1 = vbLongDate - Returns date: weekday, monthname, year
'2 = vbShortDate - Returns date: mm/dd/yy
'3 = vbLongTime - Returns time: hh:mm:ss PM/AM
'4 = vbShortTime - Return time: hh:mm
WScript.echo Replace(FormatDateTime(Date, 1), ", ", "-")
PowerShell - peut être installé sur toutes les machines disposant du téléchargement .NET - de Microsoft ( v1 , v2 et v3 (uniquement pour Windows 7 et versions ultérieures)). Installé par défaut sur tout ce qui est sous Windows 7/Win2008 et supérieur:
C:\> powershell get-date -format "{dd-MMM-yyyy HH:mm}"
Jscript.net/batch auto-compilé (je n'ai jamais vu de machine Windows sans .NET, je pense donc qu'il s'agit d'un joli portable):
@if (@X)==(@Y) @end /****** silent line that start jscript comment ******
@echo off
::::::::::::::::::::::::::::::::::::
::: Compile the script ::::
::::::::::::::::::::::::::::::::::::
setlocal
if exist "%~n0.exe" goto :skip_compilation
set "frm=%SystemRoot%\Microsoft.NET\Framework\"
:: searching the latest installed .net framework
for /f "tokens=* delims=" %%v in ('dir /b /s /a:d /o:-n "%SystemRoot%\Microsoft.NET\Framework\v*"') do (
if exist "%%v\jsc.exe" (
rem :: the javascript.net compiler
set "jsc=%%~dpsnfxv\jsc.exe"
goto :break_loop
)
)
echo jsc.exe not found && exit /b 0
:break_loop
call %jsc% /nologo /out:"%~n0.exe" "%~dpsfnx0"
::::::::::::::::::::::::::::::::::::
::: End of compilation ::::
::::::::::::::::::::::::::::::::::::
:skip_compilation
"%~n0.exe"
exit /b 0
****** End of JScript comment ******/
import System;
import System.IO;
var dt=DateTime.Now;
Console.WriteLine(dt.ToString("yyyy-MM-dd hh:mm:ss"));
Logman Cela ne peut pas avoir l'année et le jour de la semaine. Il est relativement lent, crée également un fichier temporaire et est basé sur les horodatages que logman met sur ses fichiers journaux. Travaillera tout à partir de Windows XP et supérieur. Cela ne sera probablement jamais utilisé par personne - y compris par moi - mais c'est une autre façon ...
@echo off
setlocal
del /q /f %temp%\timestampfile_*
Logman.exe stop ts-CPU 1>nul 2>&1
Logman.exe delete ts-CPU 1>nul 2>&1
Logman.exe create counter ts-CPU -sc 2 -v mmddhhmm -max 250 -c "\Processor(_Total)\%% Processor Time" -o %temp%\timestampfile_ >nul
Logman.exe start ts-CPU 1>nul 2>&1
Logman.exe stop ts-CPU >nul 2>&1
Logman.exe delete ts-CPU >nul 2>&1
for /f "tokens=2 delims=_." %%t in ('dir /b %temp%\timestampfile_*^&del /q/f %temp%\timestampfile_*') do set timestamp=%%t
echo %timestamp%
echo MM: %timestamp:~0,2%
echo dd: %timestamp:~2,2%
echo hh: %timestamp:~4,2%
echo mm: %timestamp:~6,2%
endlocal
exit /b 0
Plus d'informations sur la fonction Get-Date .
J'aimais vraiment beaucoup la méthode de Joey, mais je pensais en parler un peu plus longuement.
Dans cette approche, vous pouvez exécuter le code plusieurs fois sans vous soucier de l'ancienne valeur de date qui reste en suspens car elle est déjà définie.
Chaque fois que vous exécutez ce fichier de commandes, il génère une représentation combinée de la date et de l'heure compatible ISO 8601.
FOR /F "skip=1" %%D IN ('WMIC OS GET LocalDateTime') DO (SET LIDATE=%%D & GOTO :GOT_LIDATE)
:GOT_LIDATE
SET DATETIME=%LIDATE:~0,4%-%LIDATE:~4,2%-%LIDATE:~6,2%T%LIDATE:~8,2%:%LIDATE:~10,2%:%LIDATE:~12,2%
ECHO %DATETIME%
Dans cette version, vous devrez faire attention à ne pas copier/coller le même code à plusieurs endroits dans le fichier car cela provoquerait des étiquettes en double. Vous pouvez soit avoir une étiquette distincte pour chaque copie, soit simplement mettre ce code dans son propre fichier de commandes et l'appeler à partir de votre fichier source chaque fois que nécessaire.
Il suffit d'utiliser la variable %date%
:
echo %date%
Je règle une variable d'environnement sur la valeur du format numérique souhaité en procédant comme suit:
FOR /F "tokens=1,2,3,4 delims=/ " %a IN ('echo %date%') DO set DateRun=%d-%b-%c
Selon la réponse de @ProVi, il suffit de modifier pour adapter le formatage souhaité
echo %DATE:~10,4%-%DATE:~7,2%-%DATE:~4,2% %TIME:~0,2%:%TIME:~3,2%:%TIME:~6,2%
reviendra
yyyy-MM-dd hh:mm:ss
2015-09-15 18:36:11
EDIT Selon le commentaire de @Jeb, le format de l'heure ci-dessus ne fonctionnera que si votre commande DATE/T est renvoyée.
ddd dd/mm/yyyy
Thu 17/09/2015
Il est facile de le modifier pour l'adapter à vos paramètres régionaux. Toutefois, en utilisant l'indexation de chaque caractère dans la chaîne renvoyée par la variable d'environnement% DATE% appropriée, vous pouvez extraire les parties de la chaîne dont vous avez besoin.
par exemple. Utiliser% DATE ~ 10,4% développerait la variable d'environnement DATE et n'utiliserait ensuite que les 4 caractères commençant par le onzième caractère (décalage 10) du résultat développé
Par exemple, si vous utilisez des dates stylisées aux États-Unis, les conditions suivantes s'appliquent
ddd mm/dd/yyyy
Thu 09/17/2015
echo %DATE:~10,4%-%DATE:~4,2%-%DATE:~7,2% %TIME:~0,2%:%TIME:~3,2%:%TIME:~6,2%
2015-09-17 18:36:11
Il est possible d'utiliser PowerShell et de rediriger sa sortie vers une variable d'environnement à l'aide d'une boucle.
A partir de la ligne de commande (cmd
):
for /f "tokens=*" %a in ('powershell get-date -format "{yyyy-mm-dd+HH:mm}"') do set td=%a
echo %td%
2016-25-02+17:25
Dans un fichier de commandes, vous pouvez échapper %a
en tant que %%a
:
for /f "tokens=*" %%a in ('powershell get-date -format "{yyyy-mm-dd+HH:mm}"') do set td=%%a
Si vous avez installé Python, vous pouvez faire
python -c "import datetime;print(datetime.date.today().strftime('%Y-%m-%d'))"
Vous pouvez facilement adapter la chaîne de format à vos besoins.
En raison du fait que le format de date et d’heure est spécifique à l’emplacement, il est nécessaire de redoubler d’efforts pour extraire les variables à partir des variables% date% et% time% afin d’analyser la chaîne avec le format transformé. Une bonne idée est d’utiliser une API pour récupérer la structure de données et l’analyser à votre guise. WMIC est un bon choix. Dans l'exemple ci-dessous, utilisez Win32_LocalTime . Vous pouvez également utiliser Win32_CurrentTime ou Win32_UTCTime .
@echo off
SETLOCAL ENABLEDELAYEDEXPANSION
for /f %%x in ('wmic path Win32_LocalTime get /format:list ^| findstr "="') do set %%x
set yyyy=0000%Year%
set mmmm=0000%Month%
set dd=00%Day%
set hh=00%Hour%
set mm=00%Minute%
set ss=00%Second%
set ts=!yyyy:~-4!-!mmmm:~-2!-!dd:~-2!_!hh:~-2!:!mm:~-2!:!ss:~-2!
echo %ts%
ENDLOCAL
Résultat:
2018-04-25_10: 03: 11
Vérifier celui-ci..
for /f "tokens=2 delims==" %%a in ('wmic OS Get localdatetime /value') do set "dt=%%a"
set "YY=%dt:~2,2%" & set "YYYY=%dt:~0,4%" & set "MM=%dt:~4,2%" & set "DD=%dt:~6,2%"
set "HH=%dt:~8,2%" & set "Min=%dt:~10,2%" & set "Sec=%dt:~12,2%" & set "MS=%dt:~15,3%"
set "datestamp=%YYYY%%MM%%DD%" & set "timestamp=%HH%%Min%%Sec%" & set "fullstamp=%YYYY%-%MM%-%DD%_%HH%-%Min%-%Sec%-%MS%"
echo datestamp: "%datestamp%"
echo timestamp: "%timestamp%"
echo fullstamp: "%fullstamp%"
pause
Ceci est une extension de la réponse de Joey pour inclure le temps et compléter les parties avec des 0.
Par exemple, le résultat sera 2019-06-01_17-25-36. Notez également qu'il s'agit de l'heure UTC.
for /f %%x in ('wmic path win32_utctime get /format:list ^| findstr "="') do set %%x
set Month=0%Month%
set Month=%Month:~-2%
set Day=0%Day%
set Day=%Day:~-2%
set Hour=0%Hour%
set Hour=%Hour:~-2%
set Minute=0%Minute%
set Minute=%Minute:~-2%
set Second=0%Second%
set Second=%Second:~-2%
set TimeStamp=%Year%-%Month%-%Day%_%Hour%-%Minute%-%Second%
echo %DATE:~10,4%%DATE:~7,2%%DATE:~4,2%