Comment puis-je obtenir la date actuelle 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 n'y ait une raison vraiment convaincante et rétrocompatible pour cela, en particulier en raison de la question des paramètres régionaux avec l'utilisation de date . Voir @npocmaka's https://stackoverflow.com/a/19799236/8479


Qu'est-ce qu'un énoncé en 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 veux un .fichier bat qui bride 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 . Est-il un moyen facile je peux le faire, indépendamment des paramètres régionaux de l'ordinateur?

Je ne me soucie pas vraiment du format de la date, idéalement ce serait AAAA-mm-JJ, mais tout ce qui est simple est très bien.

Jusqu'à présent j'ai ceci, 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-Zipz.exe" a -r Code_%_my_datetime%.zip Code

je peux vivre avec ça, mais ça semble un peu lourd. Idéalement, il devrait être plus bref et avoir le format mentionné plus tôt.

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

475
demandé sur Peter Mortensen 2008-10-15 02:25:34

26 réponses

Voir Windows Fichier De Commandes (.bat) pour obtenir la date actuelle dans le format MMDDYYYY :

@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 le temps en format 24 heures/militaire, vous pouvez remplacer le deuxième pour la ligne avec ceci:

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

C:>.\date.chauve-souris

2008-10-14_0642

si vous voulez la date indépendamment de la région jour / mois ordre, vous pouvez utiliser "WMIC os GET LocalDateTime" comme source, car il 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:>essai.cmd

Date locale[2012-06-19 10:23:47.048]

604
répondu Jay 2017-07-15 11:39:48

Régional indépendant date du temps d'analyse

le format de sortie de %DATE% et de la commande dir est régionalement dépendant et donc ni robuste ni intelligent. date.exe (partie de UnxUtils ) fournit toute information sur la date et l'heure dans n'importe quel format pensable. Vous pouvez également extraire les informations de date/Heure de n'importe quel fichier avec date.exe .

Exemples: (dans un cmd-script utiliser %% 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-texte-ŕ 18.55

Command: date.exe +"%m-%d """%H %M %S """"

07-22 "18:55:03"`

information sur la date et l'heure provenant 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 une 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 l'information 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 sa date/heure information:

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 partie des outils libres GNU qui n'ont pas besoin d'installation.

NOTE: copier date.exe dans n'importe quel répertoire qui se trouve dans le chemin de recherche peut entraîner la défaillance d'Autres scripts qui utilisent la commande date intégrée à Windows.

93
répondu Uri Liebeskind 2012-12-01 16:05:45

deux autres façons qui ne dépendent pas des paramètres de temps (Toutes les deux tirées de :comment obtenir des données/temps indépendant de la localisation: ). Et les deux ont aussi le jour de la semaine et aucun d'eux n'a besoin de permissions admin!:

  1. MAKECAB - va fonctionner sur tous les systèmes de Windows (rapide, mais crée un petit fichier temp) (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
    

    Pour en savoir plus 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é à partir du site de microsoft . Mais est intégré dans tout de Windows Vista et au-dessus:

    @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 qui utilisent D'autres langues de script Windows. Ils vous donneront plus de flexibilité par exemple vous pouvez obtenir de la semaine de l'année, le temps en millisecondes et ainsi de suite.

  3. JScript/lot hybride (il faut être enregistré en tant que .bat ). JScript est disponible sur tous les formulaires de système NT et au-dessus, dans le cadre de Windows Script Host ( bien que peut être désactivé par le registre il est 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/LOT hybride ( Est-il possible d'incorporer et d'exécuter VBScript dans un fichier de commandes sans l'aide d'un 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écharger de Microsoft ( v1 , v2 , v3 (seulement pour Windows 7 et supérieur)). Il est installé par défaut sur tout depuis Windows 7 / Windows Server 2008 et au-dessus:

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

    pour l'utiliser à partir d'un fichier de lot:

    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, donc je pense que c'est un assez 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 obtenir de l'an et le jour de la semaine. Il est relativement lent et crée également un fichier temporaire et est basé sur les horodatage que logman met sur ses fichiers journaux. Il fonctionnera sur tout de Windows XP et au-dessus. Il ne sera probablement jamais utilisé par quiconque-y compris moi - mais c'est une façon 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 façon de plus avec WMIC qui donne aussi la semaine de l'année et du jour de la semaine, mais pas des millisecondes (pour des millisecondes, voir 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. utilisant TYPEPERF avec quelques efforts pour être rapide et compatible avec différents paramètres de langue et aussi rapide 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 n ° 3 ci-dessus. Gardez à l'esprit que les propriétés Date object de JavaScript impliquant des valeurs de mois sont numérotées de 0 à 11, Pas 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>
    
73
répondu npocmaka 2017-07-15 17:52:51

voici une variante de l'alt.ms-dos.lot.nt qui fonctionne localement-indépendamment.

mettez 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 obtenir le code de travailler sans Erreur msg à stderr, j'ai dû ajouter les guillemets simples arount les assignations variables pour %%%a, %%b et % % C. Ma locale (PT) causait des erreurs à un moment de la boucle/parsing où des choses comme "set =20" étaient exécutées. Les citations donnent un jeton (bien que vide) pour le côté gauche de l'instruction d'affectation.

l'inconvénient est le désordre des noms de variables locales: 'yy', 'mm' et 'dd'. Mais bon, qui s'en soucie!

42
répondu vMax 2010-07-08 10:50:58

j'utilise ceci (encore une fois pas de la région indépendant (royaume-UNI))

set bklog=%date:~6,4%-%date:~3,2%-%date:~0,2%_%time:~0,2%%time:~3,2%
29
répondu bluish 2012-10-15 08:48:45

malheureusement, cela n'est pas à l'abri des contextes 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 les choses que vous pouvez trouver sur Wikipedia .

22
répondu Mark Ransom 2008-10-14 22:43:39

s'il vous plaît utiliser le script suivant pour obtenir le jour en cours dans la ligne de commande:

echo %Date:~0,3%day
16
répondu sudipto roy 2011-12-12 11:50:42

les quatre premières lignes de ce code vous donnera fiable YY JJ MM YYYY hh Min Sec variables 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
15
répondu foxidrive 2017-07-15 17:58:04

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 tel que déterminé par les contextes régionaux - pas sûr de savoir comment faire pour contourner cela.

14
répondu J c 2008-10-14 22:36:49
"d:\Program Files-Zipz.exe" a -r code_%date:~10,4%-%date:~4,2%-%date:~7,2%.zip
13
répondu DigiP 2010-03-20 11:13:11

ce n'est pas vraiment plus bref mais pourrait être une façon 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
répondu J c 2016-09-23 21:04:48

Voici une façon d'obtenir l'Heure de la date dans une seule ligne:

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

Dans les NOUS ce sera la sortie de "aaaa-mm-jj hhmm". Différents paramètres régionaux donneront des résultats différents en %date%, mais vous pouvez modifier l'ordre des tokens.

si vous voulez un format différent, modifiez la déclaration echo en réarrangeant les tokens ou en utilisant des séparateurs différents (ou non).

9
répondu Matthew Johnson 2010-10-04 20:57:03

courte réponse:

 :: 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
répondu Yordan Georgiev 2018-02-28 12:32:30

et voici un fichier batch similaire pour la partie temporelle.

:: /q/how-do-i-get-current-datetime-on-the-windows-command-line-in-a-suitable-format-for-using-in-a-filename-53145/"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
répondu Jeroen Wiert Pluimers 2011-01-03 13:26:05

j'ai changé la réponse avec le fichier de commandes à partir de vMax de sorte qu'il fonctionne avec la langue néerlandaise.

Les Hollandais - aussi persistants que nous - ont quelques changements dans les %date% , date/t , et date qui cassent le fichier de lot d'origine.

ce serait bien si certaines personnes pouvaient vérifier cela aussi bien par rapport à D'autres fenêtres locales, et rapporter les résultats.

Si le fichier batch échoue à votre emplacement, alors s'il Vous Plaît inclure la sortie de ces deux énoncés sur l'invite de commande:

echo:^|date

date/t

ceci est un échantillon de la sortie que vous devriez obtenir à partir du fichier par lots:

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

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

:: /q/how-do-i-get-current-datetime-on-the-windows-command-line-in-a-suitable-format-for-using-in-a-filename-53145/"%%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
répondu Jeroen Wiert Pluimers 2017-05-23 12:18:21

Matthew Johnson one-liner solution pour obtenir le one-liner date et de l'heure est éloquent et utile.

il faut cependant une simple modification pour fonctionner à partir d'un fichier par lots:

for /f "tokens=2,3,4,5,6 usebackq delims=:/ " %%a in ('%date% %time%') do echo %%c-%%a-%%b %%d%%e
7
répondu John Langstaff 2018-09-14 13:00:36

il suffit d'utiliser cette ligne:

PowerShell -Command "get-date"
6
répondu gdelfino 2014-11-19 08:51:50

une fonction qui est 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

à l'Envers: "151990920 de la" Région autonome. inconvénient: seuls les administrateurs système peuvent exécuter wmic.EXE.

Utilisation:

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

Cela fait écho à une chaîne comme celle-ci:

2014-01-22 12:51:53

notez que les paramètres de fonction sont hors-paramètres - c'est-à-dire que vous devez fournir des noms de variables au lieu de valeurs.

tous les paramètres sont optionnels, donc call:Now Y M est un appel valide si vous voulez seulement obtenir l'année et le mois.

6
répondu Tomalak 2017-07-15 17:55:45

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 voulez d'autres idées pour automatiser les sauvegardes 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
répondu micahwittman 2017-07-15 11:40:29

j'ai eu un problème similaire. J'ai un téléchargement quotidien automatique à partir D'un serveur FTP d'un fichier crypté. Je voulais déchiffrer le fichier en utilisant gpg, renommer le fichier à la date courante (format AAAAMMJJ) et déposer le fichier déchiffré dans un dossier pour le ministère correct.

j'ai passé en revue plusieurs suggestions pour renommer le fichier en fonction de la date et je n'avais aucune chance jusqu'à ce que je tombe sur cette solution simple.

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

It fonctionne parfaitement (i.e., le nom de fichier sort comme "2011-06-14.txt").

(Source)

4
répondu KChiki 2012-10-15 08:49:40

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

regardez à l'intérieur du fichier ZIP pour quelque chose appelé "Date.exe" et le renommer en "DateFormat.exe" (pour éviter les conflits).

mettez-le dans votre dossier windows system32.

Il a beaucoup de "date de sortie".

pour de l'aide, utilisez DateFormat.exe --h

Je ne suis pas sûr comment vous mettriez sa sortie dans un variable d'environnement... l'aide de JEU.

4
répondu Sally 2017-07-15 17:40:27

Régional solution indépendante de générer 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 peuvent être confondus si l'on utilise le format date dans la courte période pendant qu'il est modifié. Ainsi, analyser la sortie selon la chaîne de format existante pourrait être 'plus sûr' - mais sera plus compliqué

3
répondu V15I0N 2011-09-06 12:09:39
:: 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 adolfo.dimare@gmail.com
:: - /q/how-do-i-get-current-datetime-on-the-windows-command-line-in-a-suitable-format-for-using-in-a-filename-53145/"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
1
répondu Adolfo 2017-05-11 15:42:11

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é en fichier, horodatage.bat, voici la sortie:

enter image description here

0
répondu bvj 2016-08-11 20:07:16

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
répondu Frizz1977 2017-03-30 20:40:26

je sais qu'il y a de nombreuses façons déjà mentionnées. Mais ici, c'est ma façon de le décomposer pour comprendre comment il est fait. Heureusement, il est utile pour quelqu'un qui aime la méthode étape par étape.

:: Check your local date format
echo %date%

    :: Output is Mon 08/15/2016

:: get day (start index, number of characters)
::         (index starts with zero)
set myday=%DATE:~0,4%
echo %myday%
    :: output is Mon 

:: get month
set mymonth=%DATE:~4,2%
echo %mymonth%
    :: output is 08

:: get date 
set mydate=%DATE:~7,2% 
echo %mydate%
    :: output is 15

:: get year
set myyear=%DATE:~10,4%
echo %myyear%
    :: output is 2016
-2
répondu Cricrazy 2016-08-15 15:57:00