Question Comment puis-je obtenir datetime courant sur la ligne de commande Windows, dans un format approprié pour l'utilisation dans un nom de fichier?


Mise à jour: Maintenant que nous sommes en 2016, j'utiliserais PowerShell pour cela, à moins qu'il y ait une raison vraiment convaincante de compatibilité ascendante, en particulier à cause du problème de l'utilisation des paramètres régionaux. 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 le datetime actuel dans un format que je peux mettre dans un nom de fichier?

Je souhaite avoir un fichier .bat qui compresse un répertoire dans une archive avec la date et l'heure actuelles comme partie du 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 est bien.

Jusqu'à présent, j'ai cela, 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 ça, mais ça me semble un peu maladroit. Idéalement, il devrait être plus bref et avoir le format mentionné plus haut.

J'utilise Windows Server 2003 et Windows XP Professionnel. Je ne veux pas installer d'utilitaires supplémentaires pour y parvenir (bien que je me rende compte qu'il y en a qui feront un bon formatage de date).


459
2017-10-14 22:25


origine


Réponses:


Voir Windows Batch File (.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 seconde ligne par celle-ci:

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

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

Si vous voulez la date indépendamment de l'ordre des jours / mois de la région, vous pouvez utiliser "WMIC os GET LocalDateTime" comme source, car elle est dans l'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 [2012-06-19 10: 23: 47.048]


592
2017-10-14 22:36



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

Le format de sortie de %DATE% et de dir La commande dépend de la région et n'est donc ni robuste ni intelligente. date.exe (partie de UnxUtils) délivre toute information 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: Tout texte

date.exe +"Text: %y/%m/%d-any text-%H.%M"
Texte: 09/12/22-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 des informations sur 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 une partie des outils GNU gratuits qui ne nécessitent aucune installation.

REMARQUE: Copie date.exe dans un répertoire qui se trouve dans le chemin de recherche peut entraîner l'échec d'autres scripts qui utilisent le Windows intégré date commander.


92
2017-12-23 09:40



Deux autres moyens qui ne dépendent pas des réglages de l'heure (tous deux pris : Comment obtenir des données / temps indépendant de la localisation:). Et tous les deux obtiennent aussi le jour de la semaine et aucun d'eux n'exige des permissions d'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. ROBOCOPIE - Ce n'est pas une commande native pour Windows XP et Windows Server 2003, mais cela peut être téléchargé à partir du site Microsoft. Mais est intégré dans tout à partir de Windows Vista et plus:

    @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 ex. vous pouvez obtenir la semaine de l'année, le temps en millisecondes et ainsi de suite.

  3. JScript / batch hybride (besoin d'être sauvegardé comme .bat). JScript est disponible sur toutes les versions de système NT et supérieures, dans le cadre de Fenêtres de script hôte (si peut être désactivé par le biais du registre, il est 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 de commandes 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 chaque machine qui a. NET - téléchargement de Microsoft (v1, v2, v3 (seulement pour Windows 7 et plus)). 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 à partir d'un fichier de commandes:

    for /f "delims=" %%# in ('powershell get-date -format "{dd-MMM-yyyy HH:mm}"') do @set _date=%%#
    
  6. Jscript.net/batch auto-compilé (jamais vu une machine Windows sans .NET, donc je pense 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 permet pas d'obtenir 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 place dans ses fichiers journaux. Il fonctionnera sur tout à partir de Windows XP et supérieur. Il ne sera probablement jamais utilisé par personne - y compris 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
    
  8. Une autre façon avec WMIC ce qui donne aussi la semaine de l'année et le jour de la semaine, mais pas les millisecondes (pendant 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 différents paramètres de langue 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 démontrée au # 3 ci-dessus. Gardez à l'esprit que les propriétés d'objet Date de JavaScript impliquant des valeurs de mois sont numérotées de 0 à 11, et non de 1 à 12. Donc, 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>
    

72
2017-11-05 21:21



Voici une variante de alt.msdos.batch.nt qui fonctionne de manière indépendante.

Mettez ceci dans un fichier texte, par ex. 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 aux affectations de variables pour %% a, %% b et %% c. Mon locale (PT) provoquait des erreurs à un moment dans la boucle / l'analyse où des choses comme "set = 20" étaient exécutées. Les guillemets donnent un jeton (bien que vide) pour le côté gauche de l'instruction d'affectation.

L'inconvénient est les noms de variables locales désordonnées: 'yy', 'mm' et 'dd'. Mais bon, on s'en fout!


42
2017-07-08 10:50



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

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

29
2018-04-12 13:13



Malheureusement, ce n'est pas à l'abri des paramètres régionaux, mais il fait 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 ce que vous pouvez trouver sur Wikipédia.


22
2017-10-14 22:43



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

echo %Date:~0,3%day

16
2017-07-15 13:00



Les quatre premières lignes de ce code vous donneront des variables fiables YY JJ MM AAAA HH Min Sec dans Windows XP Professionnel et versions ultérieures.

@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

14
2017-09-07 19:47



Autrement (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 les deux réponses que vous trouverez ici dépendent toujours de l’ordre du jour et du mois, tel que déterminé par les paramètres régionaux.


13
2017-10-14 22:36



"d:\Program Files\7-Zip\7z.exe" a -r code_%date:~10,4%-%date:~4,2%-%date:~7,2%.zip

13
2017-12-04 19:44



Ce n’est pas très bref, mais peut être plus souple (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
2017-10-14 22:31