web-dev-qa-db-fra.com

Comment obtenir l'heure actuelle sur la ligne de commande Windows, dans un format adapté à l'utilisation dans un nom de fichier?

Mise à jour: Maintenant que nous sommes en 2016, j'utiliserais PowerShell pour cela sauf s'il existe une raison vraiment convaincante de compatibilité avec les versions antérieures, notamment en raison du problème de paramètres régionaux lié à l'utilisation de date. Voir @ npocmaka's https://stackoverflow.com/a/19799236/8479


Qu'est-ce qu'une instruction de ligne de commande Windows que je peux utiliser pour obtenir la date/heure actuelle dans un format que je peux mettre en nom de fichier?

Je veux un fichier .bat qui zippe un répertoire dans une archive avec la date et l'heure actuelles dans le nom, par exemple, Code_2008-10-14_2257.Zip. Y a-t-il un moyen simple de le faire, indépendamment des paramètres régionaux de la machine?

Le format de la date ne me dérange pas vraiment; idéalement, ce serait aaaa-mm-jj, mais tout ce qui est simple convient parfaitement.

Jusqu'ici, j'ai ce qui, sur ma machine, me donne Tue_10_14_2008_230050_91:

rem Get the datetime in a format that can go in a filename.
set _my_datetime=%date%_%time%
set _my_datetime=%_my_datetime: =_%
set _my_datetime=%_my_datetime::=%
set _my_datetime=%_my_datetime:/=_%
set _my_datetime=%_my_datetime:.=_%

rem Now use the timestamp by in a new Zip file name.
"d:\Program Files\7-Zip\7z.exe" a -r Code_%_my_datetime%.Zip Code

Je peux vivre avec cela, mais cela semble un peu maladroit. Idéalement, ce serait plus bref et le format mentionné plus tôt.

J'utilise Windows Server 2003 et Windows XP Professionnel. Je ne veux pas installer d’utilitaires supplémentaires pour y parvenir (bien que je sache que certains feront le formatage de la date de Nice).

507
Rory

Voir Fichier de commandes Windows (.bat) pour obtenir la date actuelle au format MMJJAAAA:

@echo off
For /f "tokens=2-4 delims=/ " %%a in ('date /t') do (set mydate=%%c-%%a-%%b)
For /f "tokens=1-2 delims=/:" %%a in ('time /t') do (set mytime=%%a%%b)
echo %mydate%_%mytime%

Si vous préférez l'heure au format 24 heures/militaire, vous pouvez remplacer la deuxième ligne FOR par ceci:

For /f "tokens=1-2 delims=/:" %%a in ("%TIME%") do (set mytime=%%a%%b)

C:>.\Date.bat
2008-10-14_0642

Si vous souhaitez obtenir la date indépendamment de l'ordre jour/mois de la région, vous pouvez utiliser "WMIC os GET LocalDateTime" comme source, car il s'agit d'un ordre ISO:

@echo off
for /F "usebackq tokens=1,2 delims==" %%i in (`wmic os get LocalDateTime /VALUE 2^>NUL`) do if '.%%i.'=='.LocalDateTime.' set ldt=%%j
set ldt=%ldt:~0,4%-%ldt:~4,2%-%ldt:~6,2% %ldt:~8,2%:%ldt:~10,2%:%ldt:~12,6%
echo Local date is [%ldt%]

C:> test.cmd
La date locale est le [2012-06-19 10: 23: 47.048]

644
Jay

Analyse date-heure indépendante de la région

Les formats de sortie de %DATE% et de la commande dir dépendent des régions et ne sont donc ni robustes ni intelligents. date.exe (une partie de nxUtils ) fournit toutes les informations de date et d'heure dans tout format pensable. Vous pouvez également extraire les informations de date/heure de n’importe quel fichier avec date.exe.

Exemples: (dans un script cmd, utilisez %% au lieu de%)

date.exe +"%Y-%m-%d"
2009-12-22

date.exe +"%T"
18:55:03

date.exe +"%Y%m%d %H%M%S: Any text"
20091222 185503: N'importe quel texte

date.exe +"Text: %y/%m/%d-any text-%H.%M"
Texte: 09/12/12 - n'importe quel texte - 18,55

Command: date.exe +"%m-%d """%H %M %S """"
07-22 "18:55:03"

Les informations de date/heure d'un fichier de référence:
date.exe -r c:\file.txt +"The timestamp of file.txt is: %Y-%m-%d %H:%M:%S"

L’utiliser dans un script CMD pour obtenir l’année, le mois, le jour et l’heure:

for /f "tokens=1,2,3,4,5,6* delims=," %%i in ('C:\Tools\etc\date.exe +"%%y,%%m,%%d,%%H,%%M,%%S"') do set yy=%%i& set mo=%%j& set dd=%%k& set hh=%%l& set mm=%%m& set ss=%%n

L’utiliser dans un script CMD pour obtenir un horodatage dans n’importe quel format requis:

for /f "tokens=*" %%i in ('C:\Tools\etc\date.exe +"%%y-%%m-%%d %%H:%%M:%%S"') do set timestamp=%%i

Extraire les informations de date/heure de n’importe quel fichier de référence.

for /f "tokens=1,2,3,4,5,6* delims=," %%i in ('C:\Tools\etc\date.exe -r file.txt +"%%y,%%m,%%d,%%H,%%M,%%S"') do set yy=%%i& set mo=%%j& set dd=%%k& set hh=%%l& set mm=%%m& set ss=%%n

Ajouter à un fichier ses informations de date/heure:

for /f "tokens=*" %%i in ('C:\Tools\etc\date.exe -r file.txt +"%%y-%%m-%%d.%%H%%M%%S"') do ren file.txt file.%%i.txt

date.exe est élément des outils gratuits GN qui ne nécessite aucune installation.

REMARQUE: La copie de date.exe dans un répertoire situé dans le chemin de recherche peut entraîner l'échec d'autres scripts utilisant la commande intégrée Windows date.

102
Uri Liebeskind

Deux autres moyens qui ne dépendent pas des paramètres de temps (tous deux pris de : Comment obtenir des données/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 (rapide, 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
    

    Plus d'informations sur la fonction get-date .

  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 Microsoft . Mais est intégré à tout de Windows Vista et supérieur:

    @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 toutes les formes de système NT et supérieures, en tant que partie de Windows Script Host ( même s'il 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. VSCRIPT/BATCH hybride (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 de .NET - téléchargement depuis Microsoft ( v1 , v2 , v (uniquement pour Windows 7 et supérieur)). Il est installé par défaut sur tout ce qui concerne Windows 7/Windows Server 2008 et les versions ultérieures:

    C:\> powershell get-date -format "{dd-MMM-yyyy HH:mm}"
    

    Pour l'utiliser depuis un fichier batch:

    for /f "delims=" %%# in ('powershell get-date -format "{dd-MMM-yyyy HH:mm}"') do @set _date=%%#
    
  6. Auto-compilé jscript.net/batch (jamais vu une machine Windows sans .NET, je pense donc que c'est 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 et crée également un fichier temporaire basé sur les horodatages que logman met sur ses fichiers journaux. Cela fonctionnera sur tout, à partir de Windows XP et supérieur. Il ne sera probablement jamais utilisé par personne - y compris par moi - mais c'est un moyen de plus ...

    @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
    
  8. Une autre manière avec WMIC qui donne également la semaine de l’année et le jour de la semaine, mais pas les millisecondes (pour les millisecondes, vérifiez la réponse de foxidrive):

    for /f %%# in ('wMIC Path Win32_LocalTime Get /Format:value') do @for /f %%@ in ("%%#") do @set %%@
    echo %day%
    echo %DayOfWeek%
    echo %hour%
    echo %minute%
    echo %month%
    echo %quarter%
    echo %second%
    echo %weekinmonth%
    echo %year%
    
  9. En utilisant TYPEPERF avec quelques efforts pour être rapide et compatible avec des paramètres de langue différents et aussi vite que possible:

    @echo off
    setlocal
    
    :: Check if Windows is Windows XP and use Windows XP valid counter for UDP performance
    ::if defined USERDOMAIN_roamingprofile (set "v=v4") else (set "v=")
    
    for /f "tokens=4 delims=. " %%# in ('ver') do if %%# GTR 5 (set "v=v4") else ("v=")
    set "mon="
    for /f "skip=2 delims=," %%# in ('typeperf "\UDP%v%\*" -si 0 -sc 1') do (
       if not defined mon (
          for /f "tokens=1-7 delims=.:/ " %%a in (%%#) do (
            set mon=%%a
            set date=%%b
            set year=%%c
            set hour=%%d
            set minute=%%e
            set sec=%%f
            set ms=%%g
          )
       )
    )
    echo %year%.%mon%.%date%
    echo %hour%:%minute%:%sec%.%ms%
    endlocal
    
  10. MSHTA permet d'appeler des méthodes JavaScript similaires à la méthode JScript illustrée au point 3 ci-dessus. N'oubliez pas que les propriétés de l'objet Date de JavaScript, impliquant des valeurs de mois, sont numérotées de 0 à 11, et non de 1 à 12. Ainsi, une valeur de 9 signifie octobre.

    <!-- : Batch portion
    
    @echo off
    setlocal
    
    for /f "delims=" %%I in ('mshta "%~f0"') do set "now.%%~I"
    
    rem Display all variables beginning with "now."
    set now.
    
    goto :EOF
    
    end batch / begin HTA -->
    
    <script>
        resizeTo(0,0)
        var fso = new ActiveXObject('Scripting.FileSystemObject').GetStandardStream(1),
            now = new Date(),
            props=['getDate','getDay','getFullYear','getHours','getMilliseconds','getMinutes',
                'getMonth','getSeconds','getTime','getTimezoneOffset','getUTCDate','getUTCDay',
                'getUTCFullYear','getUTCHours','getUTCMilliseconds','getUTCMinutes','getUTCMonth',
                'getUTCSeconds','getYear','toDateString','toGMTString','toLocaleDateString',
                'toLocaleTimeString','toString','toTimeString','toUTCString','valueOf'],
            output = [];
    
        for (var i in props) {output.Push(props[i] + '()=' + now[props[i]]())}
        close(fso.Write(output.join('\n')));
    </script>
    
88
npocmaka

Voici une variante de alt.msdos.batch.nt qui fonctionne indépendamment du local.

Placez ceci dans un fichier texte, par exemple. getDate.cmd

-----------8<------8<------------ snip -- snip ----------8<-------------
    :: Works on any NT/2k machine independent of regional date settings
    @ECHO off
    SETLOCAL ENABLEEXTENSIONS
    if "%date%A" LSS "A" (set toks=1-3) else (set toks=2-4)
    for /f "tokens=2-4 delims=(-)" %%a in ('echo:^|date') do (
      for /f "tokens=%toks% delims=.-/ " %%i in ('date/t') do (
        set '%%a'=%%i
        set '%%b'=%%j
        set '%%c'=%%k))
    if %'yy'% LSS 100 set 'yy'=20%'yy'%
    set Today=%'yy'%-%'mm'%-%'dd'% 
    ENDLOCAL & SET v_year=%'yy'%& SET v_month=%'mm'%& SET v_day=%'dd'%

    ECHO Today is Year: [%V_Year%] Month: [%V_Month%] Day: [%V_Day%]

    :EOF
-----------8<------8<------------ snip -- snip ----------8<-------------

Pour que le code fonctionne sans erreur msg à stderr, j'ai dû ajouter les guillemets simples autour des assignations de variables pour %% a, %% b et %% c. Mes paramètres régionaux provoquaient des erreurs à une étape de la boucle/analyse, où des éléments tels que "set = 20" étaient exécutés. Les guillemets génèrent un jeton (bien que vide) pour le côté gauche de l'instruction d'affectation.

L'inconvénient est le nom désordonné des variables de paramètres régionaux: "yy", "mm" et "jj". Mais bon, on s'en fout!

43
vMax

J'utilise ceci (encore une fois, pas indépendant de la région (UK))

set bklog=%date:~6,4%-%date:~3,2%-%date:~0,2%_%time:~0,2%%time:~3,2%
34
Dale Walker

Malheureusement, cela n’est pas à l’abri des situations régionales, mais c’est ce que vous voulez.

set hour=%time:~0,2%
if "%time:~0,1%"==" " set hour=0%time:~1,1%
set _my_datetime=%date:~10,4%-%date:~4,2%-%date:~7,2%_%hour%%time:~3,2%

Incroyable les choses que vous pouvez trouver sur Wikipedia .

24
Mark Ransom

Les quatre premières lignes de ce code vous donneront des variables AA JJ JJ MM AAAA HH Min Sec dans Windows XP Professionnel et supérieur.

@echo off
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 "datestamp=%YYYY%%MM%%DD%" & set "timestamp=%HH%%Min%%Sec%" & set "fullstamp=%YYYY%-%MM%-%DD%_%HH%%Min%-%Sec%"
echo datestamp: "%datestamp%"
echo timestamp: "%timestamp%"
echo fullstamp: "%fullstamp%"
pause
19
foxidrive

Veuillez utiliser le script suivant pour obtenir le jour actuel dans la ligne de commande:

echo %Date:~0,3%day
17
sudipto roy

Une autre façon ( crédit ):

@For /F "tokens=2,3,4 delims=/ " %%A in ('Date /t') do @( 
    Set Month=%%A
    Set Day=%%B
    Set Year=%%C
)

@echo DAY = %Day%
@echo Month = %Month%
@echo Year = %Year%

Notez que mes deux réponses ici dépendent toujours de l'ordre du jour et du mois tels que déterminés par les paramètres régionaux - vous ne savez pas vraiment comment résoudre ce problème.

15
J c
"d:\Program Files\7-Zip\7z.exe" a -r code_%date:~10,4%-%date:~4,2%-%date:~7,2%.Zip
14
DigiP

Ce n'est pas vraiment plus bref mais pourrait être un moyen plus flexible ( crédit ):

FOR /F "TOKENS=1* DELIMS= " %%A IN ('DATE/T') DO SET CDATE=%%B
FOR /F "TOKENS=1,2 eol=/ DELIMS=/ " %%A IN ('DATE/T') DO SET mm=%%B
FOR /F "TOKENS=1,2 DELIMS=/ eol=/" %%A IN ('echo %CDATE%') DO SET dd=%%B
FOR /F "TOKENS=2,3 DELIMS=/ " %%A IN ('echo %CDATE%') DO SET yyyy=%%B
SET date=%mm%%dd%%yyyy%
13
J c

Voici un moyen d'obtenir l'heure de la date sur une seule ligne:

for /f "tokens=2,3,4,5,6 usebackq delims=:/ " %a in ('%date% %time%') do echo %c-%a-%b %d%e

Aux États-Unis, la sortie "aaaa-mm-jj hhmm". Des paramètres régionaux différents entraîneront des sorties différentes de% date%, mais vous pouvez modifier l'ordre des jetons.

Si vous souhaitez un format différent, modifiez l'instruction echo en réorganisant les jetons ou en utilisant des séparateurs différents (ou aucun).

9
Matthew Johnson

Il suffit d'utiliser cette ligne:

PowerShell -Command "get-date"
8
gdelfino

Réponse courte :

 :: Start - Run , type:
 cmd /c "powershell get-date -format ^"{yyyy-MM-dd HH:mm:ss}^"|clip"

 :: click into target media, Ctrl + V to paste the result 

Longue réponse

    @echo off
    :: START USAGE  ==================================================================
    ::SET THE NICETIME 
    :: SET NICETIME=BOO
    :: CALL GetNiceTime.cmd 

    :: ECHO NICETIME IS %NICETIME%

    :: echo Nice time is %NICETIME%
    :: END USAGE  ==================================================================

    echo set hhmmsss
    :: this is Regional settings dependant so Tweak this according your current settings
    for /f "tokens=1-3 delims=:" %%a in ('echo %time%') do set hhmmsss=%%a%%b%%c 
    ::DEBUG ECHO hhmmsss IS %hhmmsss%
    ::DEBUG PAUSE
    echo %yyyymmdd%
        :: this is Regional settings dependant so Tweak this according your current settings
    for /f "tokens=1-3 delims=." %%D in ('echo %DATE%') do set  yyyymmdd=%%F%%E%%D
    ::DEBUG ECHO yyyymmdd IS %yyyymmdd%
    ::DEBUG PAUSE


    set NICETIME=%yyyymmdd%_%hhmmsss%
    ::DEBUG echo THE NICETIME IS %NICETIME%

    ::DEBUG PAUSE
8
Yordan Georgiev

Matthew Johnson] solution à une ligne pour obtenir la date et l'heure à une ligne est éloquent et utile.

Il faut cependant une simple modification pour pouvoir travailler à partir d'un fichier batch:

for /f "tokens=2,3,4,5,6 usebackq delims=:/ " %%a in ('%date% %time%') do echo %%c-%%a-%%b %%d%%e
7
John Langstaff

Et voici un fichier de commandes similaire pour la partie temps.

:: http://stackoverflow.com/questions/203090/how-to-get-current-datetime-on-windows-command-line-in-a-suitable-format-for-usi
:: Works on any NT/2k machine independent of regional time settings
::
:: Gets the time in ISO 8601 24-hour format
::
:: Note that %time% gets you fractions of seconds, and time /t doesn't, but gets you AM/PM if your locale supports that.
:: Since ISO 8601 does not care about AM/PM, we use %time%
::
    @ECHO off
    SETLOCAL ENABLEEXTENSIONS
    for /f "tokens=1-4 delims=:,.-/ " %%i in ('echo %time%') do (
      set 'hh'=%%i
      set 'mm'=%%j
      set 'ss'=%%k
      set 'ff'=%%l)
    ENDLOCAL & SET v_Hour=%'hh'%& SET v_Minute=%'mm'%& SET v_Second=%'ss'%& SET v_Fraction=%'ff'%

    ECHO Now is Hour: [%V_Hour%] Minute: [%V_Minute%] Second: [%v_Second%] Fraction: [%v_Fraction%]
    set timestring=%V_Hour%%V_Minute%%v_Second%.%v_Fraction%
    echo %timestring%

    :EOF

--jeroen

7

J'ai changé la réponse avec le fichier de commandes de vMax , de sorte qu'il fonctionne également avec la langue néerlandaise.
Les Néerlandais - aussi persistants que nous sommes - ont quelques modifications à apporter au %date%, date/t et au date qui décomposent le fichier de traitement par lots d'origine.

Ce serait bien si certaines personnes pouvaient également vérifier cela par rapport aux autres paramètres régionaux de Windows et rendre compte des résultats.
Si le fichier de commandes échoue à votre emplacement, veuillez inclure le résultat de ces deux instructions dans l'invite de commande:
echo:^|date
date/t

Voici un exemple de la sortie que vous devriez obtenir du fichier de commandes:

C:\temp>set-date-cmd.bat
Today is Year: [2011] Month: [01] Day: [03]
20110103

Voici le code révisé avec des commentaires sur pourquoi:

:: https://stackoverflow.com/questions/203090/how-to-get-current-datetime-on-windows-command-line-in-a-suitable-format-for-usi
:: Works on any NT/2k machine independent of regional date settings
::
:: 20110103 - adapted by [email protected] for Dutch locale
:: Dutch will get jj as year from echo:^|date, so the '%%c' trick does not work as it will fill 'jj', but we want 'yy'
:: luckily, all countries seem to have year at the end: http://en.wikipedia.org/wiki/Calendar_date
::            set '%%c'=%%k
::            set 'yy'=%%k
::
:: In addition, date will display the current date before the input Prompt using dashes
:: in Dutch, but using slashes in English, so there will be two occurances of the outer loop in Dutch
:: and one occurence in English.
:: This skips the first iteration:
::        if "%%a" GEQ "A"
::
:: echo:^|date
:: Huidige datum: ma 03-01-2011
:: Voer de nieuwe datum in: (dd-mm-jj)
:: The current date is: Mon 01/03/2011
:: Enter the new date: (mm-dd-yy)
::
:: date/t
:: ma 03-01-2011
:: Mon 01/03/2011
::
:: The assumption in this batch-file is that echo:^|date will return the date format
:: using either mm and dd or dd and mm in the first two valid tokens on the second line, and the year as the last token.
::
:: The outer loop will get the right tokens, the inner loop assigns the variables depending on the tokens.
:: That will resolve the order of the tokens.
::
@ECHO off
    set v_day=
    set v_month=
    set v_year=

    SETLOCAL ENABLEEXTENSIONS
    if "%date%A" LSS "A" (set toks=1-3) else (set toks=2-4)
::DEBUG echo toks=%toks%
      for /f "tokens=2-4 delims=(-)" %%a in ('echo:^|date') do (
::DEBUG echo first token=%%a
        if "%%a" GEQ "A" (
          for /f "tokens=%toks% delims=.-/ " %%i in ('date/t') do (
            set '%%a'=%%i
            set '%%b'=%%j
            set 'yy'=%%k
          )
        )
      )
      if %'yy'% LSS 100 set 'yy'=20%'yy'%
      set Today=%'yy'%-%'mm'%-%'dd'%

    ENDLOCAL & SET v_year=%'yy'%& SET v_month=%'mm'%& SET v_day=%'dd'%

    ECHO Today is Year: [%V_Year%] Month: [%V_Month%] Day: [%V_Day%]
    set datestring=%V_Year%%V_Month%%V_Day%
    echo %datestring%

    :EOF

--jeroen

7

Une fonction basée sur wmic:

:Now  -- Gets the current date and time into separate variables
::    %~1: [out] Year
::    %~2: [out] Month
::    %~3: [out] Day
::    %~4: [out] Hour
::    %~5: [out] Minute
::    %~6: [out] Second
  setlocal
  for /f %%t in ('wmic os get LocalDateTime ^| findstr /b [0-9]') do set T=%%t
  endlocal & (
    if "%~1" neq "" set %~1=%T:~0,4%
    if "%~2" neq "" set %~2=%T:~4,2%
    if "%~3" neq "" set %~3=%T:~6,2%
    if "%~4" neq "" set %~4=%T:~8,2%
    if "%~5" neq "" set %~5=%T:~10,2%
    if "%~6" neq "" set %~6=%T:~12,2%
  )
goto:eof

pside: Région indépendante. Inconvénient: Seuls les administrateurs système peuvent exécuter wmic.exe.

Usage:

call:Now Y M D H N S
echo %Y%-%M%-%D% %H%:%N%:%S%

Cela fait écho à une chaîne comme ceci:

2014-01-22 12:51:53

Notez que les paramètres de fonction sont out-Parameters, c’est-à-dire que vous devez fournir des noms de variable au lieu de valeurs.

Tous les paramètres sont facultatifs. call:Now Y M est donc un appel valide si vous souhaitez uniquement obtenir l'année et le mois.

6
Tomalak

J'avais un problème similaire. J'ai un téléchargement quotidien automatique à partir d'un serveur FTP d'un fichier crypté. Je voulais décrypter le fichier en utilisant gpg, renommer le fichier avec la date du jour (format AAAAMMJJ) et déposer le fichier décrypté dans un dossier du département approprié.

Je suis passé par plusieurs suggestions pour renommer le fichier en fonction de la date et n'avais aucune chance jusqu'à ce que je suis tombé sur cette solution simple.

for /f "tokens=1-5 delims=/ " %%d in ("%date%") do rename "decrypted.txt" %%g-%%e-%%f.txt

Cela a parfaitement fonctionné (le nom de fichier est donc "2011-06-14.txt").

(Source)

5
KChiki

C'est ce que j'ai utilisé:

::Date Variables - replace characters that are not legal as part of filesystem file names (to produce name like "backup_04.15.08.7z")
SET DT=%date%
SET DT=%DT:/=.%
SET DT=%DT:-=.%

Si vous souhaitez plus d'idées pour automatiser des sauvegardes dans des archives 7-Zip, j'ai un projet libre/ouvert que vous pouvez utiliser ou revoir pour des idées: http://wittman.org/ziparcy/

5
micahwittman

http://sourceforge.net/projects/unxutils/files/

Recherchez dans le fichier Zip quelque chose appelé "Date.exe" et renommez-le "DateFormat.exe" (pour éviter les conflits).

Placez-le dans votre dossier Windows system32.

Il a beaucoup d'options de "sortie de date".

Pour obtenir de l'aide, utilisez DateFormat.exe --h

Je ne sais pas comment vous mettriez sa sortie dans une variable d'environnement ... en utilisant SET.

4
Sally

Solution indépendante régionale générant le format de date ISO:

rem save the existing format definition
for /f "skip=2 tokens=3" %%a in ('reg query "HKCU\Control Panel\International" /v sShortDate') do set FORMAT=%%a
rem set ISO specific format definition
reg add "HKCU\Control Panel\International" /v sShortDate /t REG_SZ /f /d yyyy-MM-dd 1>nul:
rem query the date in the ISO specific format 
set ISODATE=%DATE%
rem restore previous format definition
reg add "HKCU\Control Panel\International" /v sShortDate /t REG_SZ /f /d %FORMAT% 1>nul:

Ce qui pourrait encore être optimisé: D'autres processus pourraient être confus si vous utilisez le format de date dans la courte période pendant laquelle il est modifié. Donc, analyser la sortie en fonction de la chaîne de format existante pourrait être 'plus sûr' - mais sera plus compliqué

3
V15I0N
:: GetDate.cmd -> Uses WMIC.exe to get current date and time in ISO 8601 format
:: - Sets environment variables %_isotime% and %_now% to current time
:: - On failure, clears these environment variables
:: Inspired on -> https://ss64.com/nt/syntax-getdate.html
:: - (cX) 2017 [email protected]
:: - http://stackoverflow.com/questions/203090
@echo off

set _isotime=
set _now=

:: Check that WMIC.exe is available
WMIC.exe Alias /? >NUL 2>&1 || goto _WMIC_MISSING_

if not (%1)==() goto _help
SetLocal EnableDelayedExpansion

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

::   1    2     3       4      5      6
:: %%G  %%H    %%I     %%J    %%K    %%L
:: Day  Hour  Minute  Month  Second  Year
:: 27   9     35      4      38      2017

:: Remove excess leading zeroes
        set _mm=%_mm:~-2%
        set _dd=%_dd:~-2%
        set _hour=%_hour:~-2%
        set _minute=%_minute:~-2%
        set _second=%_second:~-2%
:: Syntax -> %variable:~num_chars_to_skip,num_chars_to_keep%

:: Set date/time in ISO 8601 format:
        Set _isotime=%_yyyy%-%_mm%-%_dd%T%_hour%:%_minute%:%_second%
:: -> http://google.com/search?num=100&q=ISO+8601+format

if 1%_hour% LSS 112 set _now=%_isotime:~0,10% %_hour%:%_minute%:%_second%am
if 1%_hour% LSS 112 goto _skip_12_
    set /a _hour=1%_hour%-12
    set _hour=%_hour:~-2%
    set _now=%_isotime:~0,10% %_hour%:%_minute%:%_second%pm
    :: -> https://ss64.com/nt/if.html
    :: -> http://google.com/search?num=100&q=SetLocal+EndLocal+Windows
    :: 'if () else ()' will NOT set %_now% correctly !?
:_skip_12_

EndLocal & set _isotime=%_isotime% & set _now=%_now%
goto _out

:_WMIC_MISSING_
echo.
echo WMIC.exe command not available
echo - WMIC.exe needs Administrator privileges to run in Windows
echo - Usually the path to WMIC.exe is "%windir%\System32\wbem\WMIC.exe"

:_help
echo.
echo GetDate.cmd: Uses WMIC.exe to get current date and time in ISO 8601 format
echo.
echo    %%_now%%     environment variable set to current date and time
echo    %%_isotime%% environment variable to current time in ISO format
echo    set _today=%%_isotime:~0,10%%
echo.

:_out
:: EOF: GetDate.cmd
2
Adolfo

Étant donné une localité connue, pour référence sous forme fonctionnelle. L'appel ECHOTIMESTAMP montre comment obtenir l'horodatage dans une variable (DTS dans cet exemple.)

@ECHO off

CALL :ECHOTIMESTAMP
GOTO END

:TIMESTAMP
SETLOCAL  EnableDelayedExpansion
    SET DATESTAMP=!DATE:~10,4!-!DATE:~4,2!-!DATE:~7,2!
    SET TIMESTAMP=!TIME:~0,2!-!TIME:~3,2!-!TIME:~6,2!
    SET DTS=!DATESTAMP: =0!-!TIMESTAMP: =0!
ENDLOCAL & SET "%~1=%DTS%"
GOTO :EOF

:ECHOTIMESTAMP
SETLOCAL
    CALL :TIMESTAMP DTS
    ECHO %DTS%
ENDLOCAL
GOTO :EOF

:END

EXIT /b 0

Et enregistré dans le fichier timestamp.bat, voici le résultat:

enter image description here

0
bvj

Avec Windows 7, ce code fonctionne pour moi:

SET DATE=%date%
SET YEAR=%DATE:~0,4%
SET MONTH=%DATE:~5,2%
SET DAY=%DATE:~8,2%
ECHO %YEAR%
ECHO %MONTH%
ECHO %DAY%

SET DATE_FRM=%YEAR%-%MONTH%-%DAY% 
ECHO %DATE_FRM%
0
Frizz1977

Je préfère le faire le plus court possible, donc sans mois et année, cela suffit pour une mise à jour quotidienne.

SET date=%DATE:~0,2%
SET hour=%TIME:~0,2%
SET minute=%TIME:~3,2%
IF "%date:~0,1%"==" " SET date=0%DATE:~1,1%
IF "%hour:~0,1%"==" " SET hour=0%TIME:~1,1%
IF "%minute:~0,1%"==" " SET minute=0%TIME:~1,1%
SET VERSION=%date%%hour%%minute%
ECHO VERSION=%date%%hour%%minute%
VERSION=140105

Quand il s’agit de la version d’une application, déployer dans une nouvelle mise à jour quotidienne avec un constructeur

steps:
- name: "gcr.io/cloud-builders/gcloud"
  args: ["app", "deploy", '--version=v1-140105-fresh']
timeout: "300s"

Grâce à cela, il sera plus facile de mettre à jour automatiquement l'application entière

sed -e "s/-[0-9]\{1,\}-fresh/-%VERSION%-local/g" cloudbuild.yaml > tmp.txt 
mv -f tmp.txt cloudbuild.yaml

Le fichier de sortie sera prêt pour la mise à jour locale sans toucher à ses noms de fichiers

steps:
- name: "gcr.io/cloud-builders/gcloud"
  args: ["app", "deploy", '--version=v1-140117-local']
timeout: "300s"
0
Chetabahana