web-dev-qa-db-fra.com

Lot Windows: date formatée en variable

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
89
Maksym Polshcha

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%
133
Joey

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.

32
richhallstoke

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%
24
Anup Rav

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!:

  1. 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
    
  2. 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.

  3. 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());
    
  4. 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), ", ", "-")
    
  5. 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}"
    
  6. 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"));
    
  7. 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 .


15
npocmaka

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.

6
aardvarkk

Il suffit d'utiliser la variable %date%:

echo %date%
5
ProVi

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
4
Will

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
4
Mark

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
2
user103004

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.

1
CodeKid

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

1
Ivellios

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
1
Bhaskara Arani

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%
0
datchung
echo %DATE:~10,4%%DATE:~7,2%%DATE:~4,2% 
0
Hillmee Bob