¿Cómo obtengo la fecha / hora actual en la línea de comandos de Windows en un formato adecuado para usar en un nombre de archivo / carpeta?

540

Actualización: ahora que es 2016, usaría PowerShell para esto a menos que haya una razón realmente convincente compatible con versiones anteriores, particularmente debido al problema de configuración regional con el uso date. Ver https://stackoverflow.com/a/19799236/8479 de @ npocmaka


¿Qué es una (s) declaración (s) de línea de comando de Windows que puedo usar para obtener la fecha y hora actual en un formato que puedo poner en un nombre de archivo?

Quiero tener un archivo .bat que comprima un directorio en un archivo con la fecha y hora actuales como parte del nombre, por ejemplo Code_2008-10-14_2257.zip. ¿Hay alguna manera fácil de hacer esto, independientemente de la configuración regional de la máquina?

Realmente no me importa el formato de fecha, idealmente sería aaaa-mm-dd, pero cualquier cosa simple está bien.

Hasta ahora tengo esto, que en mi máquina me da 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

Puedo vivir con esto, pero parece un poco torpe. Idealmente, sería más breve y tendría el formato mencionado anteriormente.

Estoy usando Windows Server 2003 y Windows XP Professional. No quiero instalar utilidades adicionales para lograr esto (aunque me doy cuenta de que hay algunas que harán un buen formato de fecha).

Rory
fuente
77
¿Crear una copia de seguridad automatizada para su código? ¡Bien por usted! Deberíamos hacer esto también :)
Andrei Rînea
24
use powershell people ...[datetime]::now.tostring("yyyy-MM-dd")
Nacht - Reinstate a Monica el
¿Es posible cargar archivos con fecha creada usando xp_cmdshell en SQL Server? He hecho una pregunta sobre stackoverflow, por favor, consulte el enlace @ stackoverflow.com/q/32293517/3327081
kolunar

Respuestas:

667

Consulte Windows Batch File (.bat) para obtener la fecha actual en formato 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 prefiere la hora en formato militar / de 24 horas, puede reemplazar la segunda línea FOR con esto:

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

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

Si desea la fecha independientemente del orden de día / mes de la región, puede usar "WMIC os GET LocalDateTime" como fuente, ya que está en orden 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 fecha local es [2012-06-19 10: 23: 47.048]

Arrendajo
fuente
44
Para la gente del Reino Unido, querrás For /f "tokens=1-3 delims=/ " %%a in ('date /t') do (set mydate=%%c-%%b-%%a)la segunda línea.
Rory
17
Esta solución depende de la configuración regional, Rory dio el ejemplo para el Reino Unido para otras configuraciones regionales donde la fecha viene como 22-02-2012 necesita reemplazar delims = / con delims = -
Nuno Furtado
25
En mi sistema,% TIME% devuelve valores como "0:01:15" y "3:15:12" y el código %% a %% b en la respuesta da un espacio inicial como "001" y "315". Para obtener un hhmm de cuatro dígitos use esto: For /f "tokens=1-2 delims=/: " %%a in ("%TIME%") do (if %%a LSS 10 (set mytime=0%%a%%b) else (set mytime=%%a%%b))Eso devuelve valores como "0001" y "0315" que prefiero en mis nombres de archivo.
twamley
10
Buena versión del wmiccomando! Hasta ahora solo he visto WMIC Path Win32_LocalTime Get Day,Hour,Minute,Month,Second,Year /Format:table. Del mismo modo, para llegar 20120623-1619a mi zona horaria local de Amsterdam, en una línea:for /f %%a in ('wmic os get LocalDateTime ^| findstr ^[0-9]') do (set ts=%%a) & set datetime=%ts:~0,8%-%ts:~8,4%
Arjan
55
Para mí dice%%a was unexpected at this time.
Scott zuz22 Blacklock
109

Análisis de fecha y hora regionalmente independiente

El formato de salida de %DATE%y del dircomando depende de la región y, por lo tanto, no es robusto ni inteligente. date.exe (parte de UnxUtils ) entrega cualquier información de fecha y hora en cualquier formato imaginable. También puede extraer la información de fecha / hora de cualquier archivo con date.exe.

Ejemplos: (en un cmd-script use %% en lugar 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: Cualquier texto

date.exe +"Text: %y/%m/%d-any text-%H.%M"
Texto: 09/12/22-cualquier texto-18.55

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

La información de fecha / hora de un archivo de referencia:
date.exe -r c:\file.txt +"The timestamp of file.txt is: %Y-%m-%d %H:%M:%S"

Utilizándolo en un script CMD para obtener información de año, mes, día y hora:

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

Utilizándolo en un script CMD para obtener una marca de tiempo en cualquier formato requerido:

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

Extraer la información de fecha / hora de cualquier archivo de referencia.

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

Agregar a un archivo su información de fecha / hora:

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 es parte de las herramientas gratuitas de GNU que no necesitan instalación.

NOTA: Copiar date.exeen cualquier directorio que se encuentre en la ruta de búsqueda puede provocar que otros scripts fallen al usar el datecomando incorporado de Windows .

Uri Liebeskind
fuente
44
Mucho mejor que la solución extrañamente más popular anterior, pero tuve que agregar / t para evitar el aviso en Windows 8.1
rainabba
66
Windows 8.1 incorporado date.exeparece depender de la configuración regional. Devuelve la fecha en dd / MM / aaaa en mi sistema, si fuera independiente de la ubicación, esperaría MM / dd / aaaa o aaaa-MM-dd. No creo que esta respuesta esté hablando del date.exe incorporado, sino de alguna versión de terceros.
SSS
1
es independiente de la configuración regional si le proporciona el formato deseado en la línea de comando
terrinecold
3
Tenga en cuenta que date.exe (parte de UnxUtils) no es lo mismo que el comando de fecha de compilación. Entonces, si tiene que agregar / t, se ejecuta el comando de fecha de Windows. Si funciona algo como date.exe + "% Y-% m-% d", ha instalado los UnxUtils correctamente. :-)
just.do.it
¿Es posible cargar archivos con fecha creada usando xp_cmdshell en SQL Server? He intentado el comando "forfiles" pero fue en vano. He hecho una pregunta sobre stackoverflow, consulte el enlace @ stackoverflow.com/q/32293517/3327081
kolunar
105

Dos formas más que no dependen de la configuración de tiempo (ambas tomadas de : Cómo obtener datos / tiempo independientemente de la localización:) . ¡Y ambos también obtienen el día de la semana y ninguno de ellos requiere permisos de administrador !:

  1. MAKECAB : funcionará en CADA sistema de Windows (rápido, pero crea un pequeño archivo temporal) (el 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
    

    Más información sobre la función get-date .

  2. ROBOCOPIA : no es un comando nativo para Windows XP y Windows Server 2003, pero se puede descargar desde el sitio de Microsoft . Pero está integrado en todo, desde Windows Vista y superior:

    @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
    

    Y tres formas más que usan otros lenguajes de script de Windows. Le darán más flexibilidad, por ejemplo, puede obtener la semana del año, el tiempo en milisegundos, etc.

  3. JScript / lote híbrido (debe guardarse como .bat). JScript está disponible en todos los sistemas NT y superiores, como parte de Windows Script Host ( aunque puede deshabilitarse a través del registro, es un caso raro ):

    @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. Híbrido VSCRIPT / BATCH ( ¿Es posible incrustar y ejecutar VBScript dentro de un archivo por lotes sin usar un archivo temporal? ) El mismo caso que JScript, pero la hibridación no es tan perfecta:

    :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 : se puede instalar en todas las máquinas que tienen .NET: descárguelo de Microsoft ( v1 , v2 , v3 (solo para Windows 7 y superior)). Se instala de manera predeterminada en todo, desde Windows 7 / Windows Server 2008 y superior:

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

    Para usarlo desde un archivo por lotes:

    for /f "delims=" %%# in ('powershell get-date -format "{dd-MMM-yyyy HH:mm}"') do @set _date=%%#
    
  6. Jscript.net/batch autocompilado (nunca he visto una máquina Windows sin .NET, por lo que creo que es bastante portátil):

    @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 Esto no puede obtener el año y el día de la semana. Es relativamente lento y también crea un archivo temporal y se basa en las marcas de tiempo que logman coloca en sus archivos de registro. Funcionará en todo, desde Windows XP y superior. Probablemente nunca será utilizado por nadie, incluido yo, pero es una forma más ...

    @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. Una forma más con WMIC que también proporciona la semana del año y el día de la semana, pero no los milisegundos (para milisegundos, verifique la respuesta 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. Usando TYPEPERF con algunos esfuerzos para ser rápido y compatible con diferentes configuraciones de idioma y lo más rápido posible:

    @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 permite llamar a métodos JavaScript similares al método JScript demostrado en el n. ° 3 anterior. Tenga en cuenta que las propiedades del objeto Fecha de JavaScript que incluyen valores de mes están numeradas del 0 al 11, no del 1 al 12. Por lo tanto, un valor de 9 significa octubre.

    <!-- : 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>
    
npocmaka
fuente
2
para powershell C: \> para / f %% i in ('powershell get-date -format "{aaaaMMdd_HHmmss}"') configure datetime = %% i C: \> echo% datetime%
Samuel
1
makecab: esto funciona creando un archivo llamado ~.rpty buscando stringdentro de él, comenzando con makecab, que es una línea como MakeCAB Report: Tue Sep 02 22:15:57 2014. para mí este comando no está localizado, es independiente de la configuración regional. Este truco se basa en eso. ¡Esperemos que nunca lo sea, o ten cuidado!
n611x007
10
Me gusta el texto de apertura "Dos más ..." seguido de 8 soluciones.
Adam Smith
1
¿Qué, no mshtahíbrido? :) ¿Te importa si edito tu respuesta y agrego una? Esta parece ser la mejor colección de soluciones esotéricas, y parece que mshtapertenece aquí.
rojo
1
La solución aceptada no funcionaría para mí sin importar lo que intentara. Varias de estas soluciones me funcionaron. (Lote y Powershell).
Brett Espere
44

Aquí hay una variante de alt.msdos.batch.nt que funciona localmente de forma independiente.

Ponga esto en un archivo de texto, por ejemplo 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<-------------

Para que el código funcione sin msg de error en stderr, tuve que agregar las comillas simples alrededor de las asignaciones de variables para %% a, %% by %% c. Mi configuración regional (PT) estaba causando errores en una etapa del bucle / análisis donde se ejecutaban cosas como "set = 20". Las comillas producen un token (aunque vacío) para el lado izquierdo de la declaración de asignación.

La desventaja son los nombres de variables locales desordenadas: 'aa', 'mm' y 'dd'. Pero oye, a quién le importa!

vMax
fuente
3
Esto es perfecto y es el enfoque más simple y elegante que he visto hasta la fecha.
Doug
2
Ver también mejoras de Jeroen , necesarios ya que no todas las cadenas regionales usan dd, mmy yyen la salida de echo:^|date.
Arjan
no funciona en todas las configuraciones regionales. (En alemán dateda Geben Sie das neue Datum ein: (TT-MM-JJ), donde JJrompe el guión (espera YY))
Stephan
35

Yo uso esto (de nuevo, no es independiente de la región (Reino Unido))

set bklog=%date:~6,4%-%date:~3,2%-%date:~0,2%_%time:~0,2%%time:~3,2%
azulado
fuente
Vea Cmd.exe Variables de entorno con Colon y Tilde en esta técnica poco conocida pero muy eficiente. (Se agradecería un puntero a una referencia autorizada de Microsoft.)
DavidRR
Aquí está la referencia de archivos por lotes de Microsoft para Windows XP . Esa referencia incluye el uso de parámetros por lotes . Desafortunadamente, no hay discusión sobre la técnica de 'corte'.
DavidRR
Esto no funciona para mí. ¿Quizás tenga algo que ver con la configuración regional? Obtengo una salida de "/ 15 / - 1-We_1009" cuando lo ejecuto el miércoles 15 de octubre de 2014.
Joel B
26

Las primeras cuatro líneas de este código le proporcionarán variables fiables YY DD MM YYYY HH Min Sec en Windows XP Professional y superior.

@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
Foxidrive
fuente
Perfecto, esta es la mejor solución para mí, ya que llamar a PS dará como resultado que el texto del cmd se vea divertido.
Ste
25

Lamentablemente, esto no es inmune a la configuración regional, pero hace lo que desea.

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%

Increíble lo que puedes encontrar en Wikipedia .

Mark Ransom
fuente
1
Mark : se encontraron las variables de entorno Cmd.exe con Colon y Tilde, que describe la técnica de 'corte' variable que se muestra en su respuesta. Ya no encuentro esa información en el artículo de Wikipedia. Me gustaría encontrar una referencia autorizada de Microsoft.
DavidRR
1
Aquí está la referencia de archivos por lotes de Microsoft para Windows XP . Esa referencia incluye el uso de parámetros por lotes . Desafortunadamente, no hay discusión sobre la técnica de 'corte'.
DavidRR
18

Utilice el siguiente script para obtener el día actual en la línea de comando:

echo %Date:~0,3%day
sudipto roy
fuente
8
Jugué un poco con esto, es el más corto que encontré para obtener Fecha y hora: echo% date
%%
15

Otra forma ( crédito ):

@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%

Tenga en cuenta que mis dos respuestas aquí todavía dependen del orden del día y el mes según lo determinado por la configuración regional; no estoy seguro de cómo solucionarlo.

J c
fuente
14
"d:\Program Files\7-Zip\7z.exe" a -r code_%date:~10,4%-%date:~4,2%-%date:~7,2%.zip
DigiP
fuente
http://www.dotnetperls.com/7-zip-examplesTiene algunos puntos buenos que pueden ser útiles para alguien en el futuro.
Saravanan
13

Esto no es realmente más breve, pero podría ser una forma más flexible ( crédito ):

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%
J c
fuente
10

Aquí hay una manera de obtener la hora de la fecha en una sola línea:

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

En los Estados Unidos esto generará "aaaa-mm-dd hhmm". La configuración regional diferente dará como resultado diferentes salidas de% date%, pero puede modificar el orden del token.

Si desea un formato diferente, modifique la declaración de eco reorganizando los tokens o usando separadores diferentes (o no).

Matthew Johnson
fuente
¿Hay alguna manera de obtener la hora en un formato de 12 horas y también para mostrar información de AM o PM?
Sangli
9

Solo usa esta línea:

PowerShell -Command "get-date"
gdelfino
fuente
9

Respuesta corta :

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

Respuesta larga

    @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
Yordan Georgiev
fuente
:: en cmd para / f% i in ('PowerShell -Command "get-date" -format "aaaaMMdd"') configure yyyyMMdd =% i :: en script de cmd para / f %% i in ('PowerShell -Command "get-date" -format "aaaaMMdd" ') establezca aaaaMMdd = %% i
Yordan Georgiev
8

La solución de una línea de Matthew Johnson para obtener la fecha y hora de una línea es elocuente y útil.

Sin embargo, necesita una modificación simple para funcionar desde un archivo por lotes:

for /f "tokens=2,3,4,5,6 usebackq delims=:/ " %%a in ('%date% %time%') do echo %%c-%%a-%%b %%d%%e
John Langstaff
fuente
1
No funciona en CMD (%% a era inesperado en este momento) o en PowerShell (Falta la apertura '(' después de la palabra clave para) en Windows 8.1
rainabba
3
Rainabba, ese es exactamente el error que obtienes cuando ese comando se emite desde la línea CMD . Sin embargo, " desde dentro de un archivo por lotes ", el comando devuelve "2014-01-30 1324".
John Langstaff
1
o mucho más simple sería sin el ciclo forecho %date:/=-%%time::=-%
Gerhard Barnard
7

Y aquí hay un archivo por lotes similar para la porción de tiempo.

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

Jeroen Wiert Pluimers
fuente
Hola, pude cargar archivos de acuerdo con la fecha de modificación utilizando un comando a continuación, z: & forfiles /m *.jpg /s /d 07/16/2015 /c “cmd /c echo @fdate @ftime @path” pero quiero saber cómo cargar archivos de acuerdo con la fecha de creación. Cualquier ayuda será muy apreciada. Se ha hecho una pregunta en stackoverflow pero aún no hay respuesta. Por favor, eche un vistazo al enlace para ver los detalles stackoverflow.com/q/32293517/3327081
kolunar
1
Haga una nueva pregunta sobre eso. Nunca lo he usado forfiles.
Jeroen Wiert Pluimers
7

Cambié la respuesta con el archivo por lotes de vMax para que también funcione con el idioma holandés.
Los holandeses - persistente como somos - tenemos algunos cambios en el %date%, date/tydate que rompen el lote archivo original.

Sería bueno si algunas personas pueden verificar esto también con otras configuraciones regionales de Windows e informar los resultados.
Si el archivo por lotes falla en su ubicación, incluya el resultado de estas dos declaraciones en el símbolo del sistema:
echo:^|date
date/t

Esta es una muestra del resultado que debe obtener del archivo por lotes:

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

Aquí está el código revisado con comentarios sobre por qué:

:: /programming/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

Jeroen Wiert Pluimers
fuente
2
Algunos sí usan años primero, o carecen de ceros a la izquierda; vea el formato de fecha de Wikipedia por país . Los franceses podrían usar jj-mm-aaaapara jour, mois, annee? Los italianos tal vez gg/mm/aaaapor giorno, mese, anno? ¿Alemanes tt.mm.jjjjpara Tag, Monat, Jahr? Pero entonces: supongo que en la mayoría de los países solo se usan unos pocos idiomas. Al igual que en los Países Bajos, Windows suele ser inglés u holandés, no mucho más. Suficientemente bueno para mi.
Arjan
2
Por otro lado: otra versión en las características ocultas de los archivos por lotes de Windows es menos perfecta (necesita la solución para los holandeses jjy no exige un año de 4 dígitos), pero se usa shiftpara descartar el día como Mono ma. Sólo diferente.
Arjan
44
Se rompe en un sistema alemán. El año y el mes funcionan, pero el día falla porque "día" comienza con una "T" en alemán ("Etiqueta"), no una "d". La cadena de formato en la solicitud es (TT-MM-JJ), la date/tsalida es 23.06.2012. / cc @Arjan
balpha
2
Otro aparte: también se puede obtener el pedido del registro , utilizando reg query "HKCU\Control Panel\International" /vShortDate. Tenga cuidado durante las pruebas: para un comando de apertura rápida, el cambio que la fijación de panel de control también cambia el formato utilizado para mostrar la fecha (por tanto date, y date /te echo %date%), pero en Windows 7 no cambia el formato de la nueva fecha! Como cambiar mi formato de fecha corta en YY/MM/dd, me molesta: The current date is: 12/06/23 Enter the new date: (mm-dd-yy). Abrir un nuevo símbolo del sistema corrige eso.
Arjan
2
@ Arjan esto debería ser reg query "HKCU\Control Panel\International" /v sShortDate.
tricasse
6

Esto es lo que he usado:

::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 desea más ideas para automatizar las copias de seguridad en archivos 7-Zip, tengo un proyecto gratuito / abierto que puede usar o revisar para obtener ideas: http://wittman.org/ziparcy/

micahwittman
fuente
En mi sistema,% date% contiene "Tue 14/10/2008". Por lo tanto, aún tendrá que cortar (o tratar con) el "Tue" y el carácter de espacio.
BoltBait
Hola @micahwittman. ¿Es posible cargar archivos con fecha creada usando xp_cmdshell en SQL Server? He intentado el comando "forfiles" pero fue en vano. He hecho una pregunta sobre stackoverflow, por favor, consulte el enlace @ stackoverflow.com/q/32293517/3327081
kolunar
5

Tuve un problema similar. Tengo una descarga diaria automática desde un servidor FTP de un archivo encriptado. Quería descifrar el archivo usando gpg, cambiar el nombre del archivo a la fecha actual (formato AAAAMMDD) y soltar el archivo descifrado en una carpeta para el departamento correcto.

Revisé varias sugerencias para cambiar el nombre del archivo según la fecha y no tuve suerte hasta que me topé con esta solución simple.

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

Funcionó perfectamente (es decir, el nombre del archivo aparece como "2011-06-14.txt").

(Fuente)

KChiki
fuente
5

Una función que se basa en 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

Al revés: Región independiente. Abajo: solo los administradores del sistema pueden ejecutar wmic.exe.

Uso:

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

Esto hace eco de una cadena como esta:

2014-01-22 12:51:53

Tenga en cuenta que los parámetros de la función están fuera de los parámetros, es decir, debe proporcionar nombres de variables en lugar de valores.

Todos los parámetros son opcionales, por lo que call:Now Y Mes una llamada válida si solo desea obtener año y mes.

Tomalak
fuente
4

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

Busque dentro del archivo ZIP algo llamado "Date.exe" y cámbiele el nombre por "DateFormat.exe" (para evitar conflictos).

Póngalo en su carpeta system32 de Windows.

Tiene muchas opciones de "salida de fecha".

Para obtener ayuda, use DateFormat.exe --h

No estoy seguro de cómo colocaría su salida en una variable de entorno ... usando SET.

Salida
fuente
1
Gracias, aunque esta pregunta es específicamente para hacerlo sin descargar herramientas adicionales.
Rory el
3

Solución regional independiente que genera el formato de fecha 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:

Lo que aún podría optimizarse: otros procesos pueden confundirse si se usa el formato de fecha en el período corto mientras se modifica. Por lo tanto, analizar la salida de acuerdo con la cadena de formato existente podría ser 'más seguro', pero será más complicado

V15I0N
fuente
puede consultar iDate ( technet.microsoft.com/en-us/library/cc978637.aspx ) y continuar condicionalmente (3 valores posibles según technet), aunque todavía no lo he intentado.
Vincent De Smet
2
:: 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
Adolfo
fuente
0

Dada una localidad conocida, para referencia en forma funcional. La ECHOTIMESTAMPllamada muestra cómo obtener la marca de tiempo en una variable ( DTSen este ejemplo).

@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

Y guardado en el archivo, timestamp.bat, aquí está el resultado:

ingrese la descripción de la imagen aquí

bvj
fuente
Parece que esto viene con el problema regional: esto no funciona en todas las máquinas en inglés.
No me sorprende, @SteveFest. Si fuera posible establecer temporalmente la configuración regional, eso podría ayudar a proporcionar una solución global, pero parece que es necesario conocer de antemano la región. ¿Su ubicación es en EE. UU. O en algún otro lugar?
bvj
@SteveFest Supongo que sería posible construir una lista de configuraciones regionales donde cada una incluye expresiones de fecha / hora con una muestra para validar. Estoy súper ocupado, pero intentaré actualizar mi respuesta para ilustrar. ¿Podría mostrarme muestras de las salidas de hora / fecha de HK? Puedo suponer tontamente que zh-HK imprime dígitos en desplazamientos fijos.
bvj
zh-HK: (yy)yy年m月d日 hh:mm- sin ceros a la izquierda. (aa) podría ignorarse ya que tenemos un año de 2 dígitos o un año de 4 dígitos. Pero tenga en cuenta una cosa: el formato de fecha y hora se puede cambiar por máquina.
Gracias @SteveFest, haré un seguimiento dentro de unas semanas. Corre systeminfoen la CLI y déjame saber lo que ves System Locale. El programa tarda en ejecutarse, pero tal vez el resultado de la configuración regional podría almacenarse en caché y posteriormente utilizarse para indexar un formato de marca de tiempo.
bvj
0

Con Windows 7, este código funciona para mí:

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%
Frizz1977
fuente
Y otra vez. Es bueno que funcione en su máquina, pero se perdió el puntoindependent of the regional settings of the machine
jeb
-1

Observo que la o / p no solicitó una solución independiente de la región. Sin embargo, mi solución es para el Reino Unido.

Esta es la solución más simple posible, una solución de 1 línea, para usar en un archivo Batch:

FOR /F "tokens=1-3 delims=/" %%A IN ("%date%") DO (SET today=%%C-%%B-%%A)
echo %today%
Ed999
fuente
2
Mencionó una solución independiente de la región ...particularly because of the regional settings issue with using date. Por cierto. Su solución es la misma que las otras veinte respuestas.
jeb
Sí, pero el mío en realidad podría (opcionalmente) usarse en la línea de comando. ¿Cuál es el mérito de publicar 35 líneas de código, si una línea de código proporcionará la misma solución?
Ed999
No puedo ver ninguna diferencia relevante con las viejas respuestas de @Matthew Johnson, 2010 o @KChiki, 2011
jeb
a pesar de que esta respuesta es incorrecta, para comentar sobre la respuesta real, no se necesita un bucle for aquí cuando podría simplemente haberlo hechoecho %date:/=-%
Gerhard Barnard
No. Si omite el bucle FOR, no se pueden crear variables y la fecha que se tomó la molestia de extraer sigue siendo inútil. Con el bucle FOR, las variables creadas por el bucle están disponibles para usar en otras partes del script. Deprecio fuertemente el uso de docenas de líneas de código para crear el bucle FOR, cuando solo se requiere 1 línea. Y desapruebo la publicación de soluciones que no sean de línea de comando, donde la o / p solicitó específicamente una solución de una línea para usar en la línea de comando.
Ed999
-3

Sé que ya hay muchas maneras mencionadas. Pero aquí está mi manera de desglosarlo para comprender cómo se hace. Con suerte, es útil para alguien a quien le guste el método paso a paso.

:: 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
Gifcrazy
fuente
3
Te perdiste el puntoindependent of the regional settings of the machine
jeb