623 votes

Comment puis-je obtenir la date et l'heure actuelles sur la ligne de commande Windows dans un format approprié pour être utilisé dans un nom de fichier/dossier ?

Mise à jour : Maintenant que nous sommes en 2016, j'utiliserais PowerShell pour cela, à moins qu'il n'y ait une raison de rétrocompatibilité vraiment convaincante, notamment en raison du problème des paramètres régionaux avec l'utilisation de date . Voir @npocmaka's https://stackoverflow.com/a/19799236/8479


Quelle(s) instruction(s) de ligne de commande Windows puis-je utiliser pour obtenir l'heure actuelle dans un format que je peux mettre dans un nom de fichier ?

Je veux avoir 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 . Existe-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, l'idéal étant que ce soit aaaa-mm-jj, mais tout ce qui est simple me convient.

Jusqu'à présent, j'ai obtenu ceci, 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 semble un peu lourd. L'idéal serait qu'elle soit plus brève et qu'elle ait le format mentionné plus haut.

J'utilise Windows Server 2003 et Windows XP Professional. Je ne souhaite pas installer d'utilitaires supplémentaires pour y parvenir (bien que je sache qu'il en existe qui permettent un formatage agréable des dates).

10 votes

Créer une sauvegarde automatique de votre code ? C'est bien ! Nous devrions le faire aussi :)

33 votes

Utiliser les gens de powershell... [datetime]::now.tostring("yyyy-MM-dd")

0 votes

Est-il possible de charger des fichiers avec la date de création en utilisant xp_cmdshell dans SQL Server ? J'ai posé une question sur stackoverflow, veuillez consulter le lien @ stackoverflow.com/q/32293517/3327081

731voto

Jay Points 20373

Ver Fichier batch Windows (.bat) pour obtenir la date du jour au format MMJJAAA :

@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 la suivante :

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 jour/mois de la région, vous pouvez utiliser "WMIC os GET LocalDateTime" comme source, puisqu'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].

4 votes

C'est bon ! Sur mon système, 'time /t' donne '11:58 PM'. Je pourrais ajouter une autre ligne avec "set mytime=%mytime : =_%", ou toute autre astuce que vous pourriez suggérer ?

0 votes

Ajout d'une autre option permettant d'afficher l'heure en 24 heures, ce qui évite d'avoir recours à un indicateur PM/AM.

52 votes

Pour les habitants du Royaume-Uni, vous voudrez For /f "tokens=1-3 delims=/ " %%a in ('date /t') do (set mydate=%%c-%%b-%%a) pour la deuxième ligne.

133voto

npocmaka Points 7794

Deux autres méthodes qui ne dépendent pas des réglages de l'heure (toutes deux tirées de :Comment obtenir des données/temps indépendants de la localisation : ). Et les deux obtiennent également le jour de la semaine et aucun d'entre eux ne nécessite des autorisations d'administrateur !

  1. MAKECAB - fonctionnera sur CHAQUE système Windows (rapide, mais crée un petit fichier temporaire) (le foxidrive script) :

    @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. ROBOCOPY00 - ce n'est pas une commande native pour Windows XP et Windows Server 2003, mais elle peut être téléchargé sur le site de microsoft . Mais il est intégré dans tous les systèmes à 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 moyens qui utilisent 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, etc.

  3. JScript/batch hybride (qui doit être sauvegardé en tant que .bat ). JScript est disponible sur tous les systèmes à partir de la version NT, en tant que partie intégrante de l'application. Windows script Hôte ( bien qu'il puisse être désactivé par le registre, c'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/BATCH hybride ( Est-il possible d'intégrer et d'exécuter un 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 chaque machine équipée de .NET - à télécharger sur le site de Microsoft ( v1 , v2 , v3 (uniquement pour Windows 7 et plus)). Il est installé par défaut sur tous les systèmes à partir de Windows 7/Windows Server 2008 et plus :

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

    Pour l'utiliser à partir d'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 (Je n'ai jamais vu une machine Windows sans .NET, donc je pense que c'est une machine 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 permet pas d'obtenir l'année et le jour de la semaine. Il est comparativement lent et crée également un fichier temporaire et se base sur les horodatages que logman met sur ses fichiers journaux. Il fonctionnera sur tout à partir de Windows XP et plus. Il ne sera probablement jamais utilisé par personne - y compris par moi - mais c'est un moyen supplémentaire...

    @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. Un autre moyen avec WMIC qui donne aussi la semaine de l'année et le jour de la semaine, mais pas les millisecondes (pour les 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. Utilisation de TYPEPERF avec quelques efforts pour être rapide et compatible avec différents paramètres linguistiques 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 point 3 ci-dessus. Gardez à l'esprit que les propriétés de l'objet Date de JavaScript impliquant des valeurs mensuelles 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>

3 votes

For powershell C:\>for /f %%i in ('powershell get-date -format "{yyyyMMdd_HHmmss}"') do set datetime=%%i C:\>echo %datetime%

1 votes

makecab Le système fonctionne en créant un fichier appelé ~.rpt et la recherche d'un string à l'intérieur, en commençant par makecab ce qui donne une ligne comme MakeCAB Report: Tue Sep 02 22:15:57 2014 . pour moi, cette commande n'est pas localisée, elle est indépendante de la locale. Cette astuce s'appuie sur cela. Espérons qu'elle ne le sera jamais, sinon gare à vous !

0 votes

Bonjour, J'ai pu charger des fichiers selon la date de modification en utilisant la commande ci-dessous, ‘z: & forfiles /m *.jpg /s /d 07/16/2015 /c “cmd /c echo @fdate @ftime @path”‘ Mais je veux savoir comment charger les fichiers en fonction de la date de création. Toute aide serait très appréciée. Une question a été posée sur stackoverflow mais pas encore de réponse. Veuillez consulter le lien pour les détails @ stackoverflow.com/q/32293517/3327081

121voto

Uri Liebeskind Points 461

Analyse de la date et de l'heure indépendante de la région

Le format de sortie de %DATE% et de la dir Le commandement est dépendant de la région et n'est donc ni robuste ni intelligent. date.exe (partie de UnxUtils ) fournit toute information sur la date et l'heure dans n'importe quel format imaginable. Vous pouvez également extraire les informations de date et d'heure de n'importe quel fichier à l'aide de la fonction date.exe .

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

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

Les informations sur la date et l'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"

Je l'utilise dans un CMD script 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 CMD script 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 et d'heure de tout 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

Ajout à un fichier de ses informations de date et d'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 fait partie des outils libres GNU qui ne nécessitent aucune installation.

REMARQUE : la copie date.exe dans un répertoire qui se trouve dans le chemin de recherche peut faire échouer d'autres scripts qui utilisent la fonction intégrée de Windows. date commandement.

6 votes

C'est bien mieux que la solution étrangement plus populaire ci-dessus, mais j'ai dû ajouter /t pour éviter l'invite sous Windows 8.1.

6 votes

Windows 8.1 intégré date.exe semble dépendre de la locale. Il retourne la date en dd/MM/yyyy sur mon système, si c'était indépendant de la locale, je m'attendrais à ce que ce soit MM/dd/yyyy ou yyyy-MM-dd. Je ne pense pas que cette réponse parle de date.exe intégré mais d'une version tierce de celui-ci.

1 votes

Il est indépendant de la locale si vous lui fournissez le format désiré sur la ligne de commande.

45voto

vMax Points 261

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

Mettez cela 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 les messages d'erreur sur stderr, j'ai dû ajouter les guillemets simples autour des affectations de variables pour %%a, %%b et %%c. Ma locale (PT) causait des erreurs à un stade de la boucle/de l'analyse où des choses comme "set =20" étaient exécutées. Les guillemets donnent un token (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, on s'en fiche !

3 votes

C'est parfait et c'est l'approche la plus simple et la plus élégante que j'ai vue à ce jour.

2 votes

Voir aussi Améliorations apportées par Jeroen nécessaire, car toutes les langues n'utilisent pas les chaînes de caractères. dd , mm y yy dans la sortie de echo:^|date .

0 votes

Ne fonctionne pas dans toutes les langues. (En allemand date donne Geben Sie das neue Datum ein: (TT-MM-JJ) où le JJ casse votre script (attend YY ))

43voto

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%

0 votes

Voir Variables d'environnement de Cmd.exe avec Colon et Tilde sur cette technique peu connue mais très efficace. (Un pointeur vers une référence faisant autorité chez Microsoft serait apprécié).

1 votes

Cela ne fonctionne pas vraiment pour moi. Peut-être est-ce lié à des paramètres régionaux ? J'obtiens un résultat de "/15/- 1-We_1009" lorsque je l'exécute le mercredi 15 octobre 2014.

0 votes

Il est très précis et exact. Je pense que c'est la meilleure réponse à la question car vous n'avez pas besoin d'ajustements pour l'utiliser comme nom de fichier. Merci pour le partage !

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X