yyyy variable print ddmmyyyy batch bat and windows datetime formatting batch-file

variable - print date windows



Formatee la fecha y la hora en una secuencia de comandos por lotes de Windows (30)

En una secuencia de comandos por lotes de Windows (Windows XP) necesito formatear la fecha y la hora actuales para utilizarlas posteriormente en nombres de archivos, etc.

Es similar a la pregunta de desbordamiento de pila Cómo agregar una fecha en archivos de proceso por lotes , pero también con tiempo.

Tengo esto hasta ahora:

echo %DATE% echo %TIME% set datetimef=%date:~-4%_%date:~3,2%_%date:~0,2%__%time:~0,2%_%time:~3,2%_%time:~6,2% echo %datetimef%

lo que da:

28/07/2009 8:35:31.01 2009_07_28__ 8_36_01

¿Hay alguna forma de permitir una hora de un solo dígito en% TIME%, así puedo obtener lo siguiente?

2009_07_28__08_36_01


¿Lo siguiente puede no ser una respuesta directa sino una respuesta cercana?

set hour=%time:~0,2% if "%hour:~0,1%" == " " set datetimef=%date:~-4%_%date:~3,2%_%date:~0,2%__0%time:~1,2%_%time:~3,2%_%time:~6,2% else set datetimef=%date:~-4%_%date:~3,2%_%date:~0,2%__%time:~0,2%_%time:~3,2%_%time:~6,2%

Al menos puede ser inspirador.


Aquí es cómo genero un nombre de archivo de registro (basado en http://ss64.com/nt/syntax-getdate.html ):

@ECHO OFF :: Check WMIC is available WMIC.EXE Alias /? >NUL 2>&1 || GOTO s_error :: Use WMIC to retrieve date and time FOR /F "skip=1 tokens=1-6" %%G IN (''WMIC Path Win32_LocalTime Get Day^,Hour^,Minute^,Month^,Second^,Year /Format:table'') DO ( IF "%%~L"=="" goto s_done Set _yyyy=%%L Set _mm=00%%J Set _dd=00%%G Set _hour=00%%H SET _minute=00%%I SET _second=00%%K ) :s_done :: Pad digits with leading zeros Set _mm=%_mm:~-2% Set _dd=%_dd:~-2% Set _hour=%_hour:~-2% Set _minute=%_minute:~-2% Set _second=%_second:~-2% Set logtimestamp=%_yyyy%-%_mm%-%_dd%_%_hour%_%_minute%_%_second% goto make_dump :s_error echo WMIC is not available, using default log filename Set logtimestamp=_ :make_dump set FILENAME=database_dump_%logtimestamp%.sql ...


Como se ha señalado, analizar la fecha y la hora solo es útil si conoce el formato que está utilizando el usuario actual (por ejemplo, MM / dd / aa o dd-MM-aaaa solo para nombrar dos). Esto podría determinarse, pero para el momento en que haga todo el análisis y el análisis, todavía terminará con una situación en la que se utiliza un formato inesperado, y se necesitarán más ajustes.

También puede usar algún programa externo que devolverá una fecha en su formato preferido, pero tiene la desventaja de tener que distribuir el programa de utilidad con su secuencia de comandos / lote.

También hay trucos por lotes usando el reloj CMOS de una manera bastante cruda, pero eso es demasiado parecido a los cables pelados para la mayoría de las personas, y tampoco es siempre el lugar preferido para recuperar la fecha / hora.

A continuación hay una solución que evita los problemas anteriores. Sí, presenta algunos otros problemas, pero para mis propósitos, encontré que esta es la solución más fácil, clara y portátil para crear una marca de fecha en archivos .bat para sistemas Windows modernos. Esto es solo un ejemplo, pero creo que verá cómo modificar otros formatos de fecha y / o hora, etc.

reg copy "HKCU/Control Panel/International" "HKCU/Control Panel/International-Temp" /f reg add "HKCU/Control Panel/International" /v sShortDate /d "yyMMdd" /f @REM reg query "HKCU/Control Panel/International" /v sShortDate set LogDate=%date% reg copy "HKCU/Control Panel/International-Temp" "HKCU/Control Panel/International" /f


Cree un archivo llamado "search_files.bat" y coloque los contenidos a continuación en el archivo. Luego haz doble clic en él. La variable temporal% THH% se puso en su lugar para manejar el AM adecuadamente. Si hay un 0 en los primeros 2 dígitos del tiempo, Windows ignora el resto del nombre del archivo LOG.

CD . SET THH=%time:~0,2% SET THH=%THH: =0% dir /s /b *.* > %date:~10,4%-%date:~4,2%-%date:~7,2%@%THH%.%time:~3,2%.%time:~6,2%.LOG


Dividir los resultados del comando de fecha por barra inclinada, luego puede mover cada uno de los tokens a las variables apropiadas.

FOR /F "tokens=1-3 delims=/" %%a IN ("%date:~4%") DO ( SET _Month=%%a SET _Day=%%b SET _Year=%%c ) ECHO Month %_Month% ECHO Day %_Day% ECHO Year %_Year%


El offset:length formato de offset:length compatible con el comando SET en Windows no le permitirá rellenar el 0 ya que parece estar interesado.

Sin embargo, puede codificar un script BATCH para verificar que la hora sea inferior a 10 y
almohadilla de acuerdo con una cadena de echo diferente.

Encontrará información sobre el comando SET en este enlace .

También puede cambiar a otros métodos de programación para obtener aquí.

Es bastante simple en Unix bash (disponible con Cygwin en Windows) decir,

date +%Y_%m_%d__%H_%M_%S

Y, siempre se ajusta correctamente.


En situaciones como esta, utilice un enfoque de programación simple y estándar: en lugar de gastar un gran esfuerzo analizando una entidad desconocida, simplemente guarde la configuración actual, reiníciela a un estado conocido, extraiga la información y luego restaure el estado original. Use solo recursos estándar de Windows.

Específicamente, los formatos de fecha y hora se almacenan bajo la clave de registro HKCU / Control Panel / International / en "valores" de [MS definition]: "sTimeFormat" y "sShortDate". Reg es el editor de registro de consola incluido con todas las versiones de Windows. No se requieren privilegios elevados para modificar la clave HKCU

Prompt $N:$D $T$G ::Save current config to a temporary (unique name) subkey, Exit if copy fails Set DateTime= Set ran=%Random% Reg copy "HKCU/Control Panel/International" "HKCU/Control Panel/International-Temp%ran%" /f If ErrorLevel 1 GoTO :EOF ::Reset the date format to your desired output format (take effect immediately) ::Resetting the time format is useless as it only affect subsequent console windows ::Reg add "HKCU/Control Panel/International" /v sTimeFormat /d "HH_mm_ss" /f Reg add "HKCU/Control Panel/International" /v sShortDate /d "yyyy_MM_dd" /f ::Concatenate the time and (reformatted) date strings, replace any embedded blanks with zeros Set DateTime=%date%__%time:~0,2%_%time:~3,2%_%time:~6,2% Set DateTime=%DateTime: =0% ::Restore the original config and delete the temp subkey, Exit if restore fails Reg copy "HKCU/Control Panel/International-Temp%ran%" "HKCU/Control Panel/International" /f If ErrorLevel 1 GoTO :EOF Reg delete "HKCU/Control Panel/International-Temp%ran%" /f

Simple, directo y debería funcionar para todas las regiones.

Por razones que no entiendo, restablecer el valor "sShortDate" surte efecto inmediatamente en una ventana de la consola, pero restablecer el valor "sTimeFormat" muy similar NO entrará en vigencia hasta que se abra una nueva ventana de la consola. Sin embargo, lo único que se puede cambiar es el delimitador: las posiciones de los dígitos son fijas. Del mismo modo, se supone que el token de tiempo "HH" antecede a los ceros a la izquierda, pero no es así. Afortunadamente, las soluciones son fáciles.


Este archivo bat (guardar como datetimestr.bat) produce la cadena de fecha y hora 3 veces: (1) cadena de fecha y hora larga con día de semana y segundos, (2) cadena de fecha y hora corta sin ellos y (3) versión corta del código.

@echo off REM "%date: =0%" replaces spaces with zeros set d=%date: =0% REM "set yyyy=%d:~-4%" pulls the last 4 characters set yyyy=%d:~-4% set mm=%d:~4,2% set dd=%d:~7,2% set dow=%d:~0,3% set d=%yyyy%-%mm%-%dd%_%dow% set t=%TIME: =0% REM "%t::=%" removes semi-colons REM Instead of above, you could use "%t::=-%" to REM replace semi-colons with hyphens (or any REM non-special character) set t=%t::=% set t=%t:.=% set datetimestr=%d%_%t% @echo Long date time str = %datetimestr% set d=%d:~0,10% set t=%t:~0,4% set datetimestr=%d%_%t% @echo Short date time str = %datetimestr% @REM Short version of the code above set d=%date: =0% set t=%TIME: =0% set datetimestr=%d:~-4%-%d:~4,2%-%d:~7,2%_%d:~0,3%_%t:~0,2%%t:~3,2%%t:~6,2%%t:~9,2% @echo Datetimestr = %datetimestr% pause

Para dar el crédito adecuado, fusioné los conceptos de Peter Mortensen (18 de junio de 14 a 21:02) y opello (25 de agosto de 2011 a las 14:27).

Puedes escribir esto mucho más corto, pero esta versión larga facilita la lectura y comprensión del código.


Este script por lotes hará exactamente lo que el OP quiere (probado en Windows XP SP3).

También usé ese astuto truco de registro descrito anteriormente por "jph", que en mi humilde opinión es la forma más sencilla de obtener un formato 100% coherente de la fecha en "yyyy_MM_dd" en cualquier sistema Windows nuevo o antiguo. El cambio a un valor de Registro para hacer esto es instantáneo temporal y trivial; solo dura unos pocos milisegundos antes de que se revierte inmediatamente.

Haga doble clic en este archivo por lotes para una demostración instantánea, aparecerá la ventana del símbolo del sistema y mostrará su marca de tiempo. . . . .

@ECHO OFF SETLOCAL & MODE CON:COLS=80 LINES=15 & COLOR 0A TITLE GENERATE A CUSTOM FORMATTED TIMESTAMP USING %%DATE%% AND %%TIME%% COMMANDS :: --- CHANGE THE COMPUTER DATE FORMAT TEMPORARILY TO MY PREFERENCE "yyyy_MM_dd", REG COPY "HKCU/Control Panel/International" "HKCU/Control Panel/International-Temp" /f 2>nul >nul REG ADD "HKCU/Control Panel/International" /v sShortDate /d "yyyy_MM_dd" /f 2>nul >nul SET MYDATE=%date% :: --- REVERT COMPUTER DATE BACK TO SYSTEM PREFERENCE REG COPY "HKCU/Control Panel/International-Temp" "HKCU/Control Panel/International" /f 2>nul >nul REG DELETE "HKCU/Control Panel/International-Temp" /f 2>nul >nul :: --- SPLIT THE TIME DIGITS TO THREE BLOCKS [H] [MM] [SS.SS] FOR /F "tokens=1-3 delims=:" %%A IN (''echo %time%'') DO SET HOUR=%%A& SET MINUTES=%%B& SET SECONDS=%%C :: --- YOUR CHOICE - FOR 4 DIGIT SECONDS - REMOVES THE DOT FROM THE SECONDS BLOCK [SS.SS] :: SET SECONDS=%SECONDS:.=% :: --- YOUR CHOICE - FOR 2 DIGIT SECONDS - GETS THE FIRST TWO DIGITS FROM THE SECONDS BLOCK [SS.SS] SET SECONDS=%SECONDS:~0,2% :: --- GET THE "AM PM" STRING TO CHECK THE HOUR BLOCK FOR /F "tokens=1,2 delims= " %%A IN (''time /t'') DO SET AM_PM=%%B :: --- CONVERT THE HOUR BLOCK [H] TO "24 HOUR" FORMAT [HH] IF %AM_PM%==PM ( IF %HOUR%==01 (SET HOUR=13) IF %HOUR%==02 (SET HOUR=14) IF %HOUR%==03 (SET HOUR=15) IF %HOUR%==04 (SET HOUR=16) IF %HOUR%==05 (SET HOUR=17) IF %HOUR%==06 (SET HOUR=18) IF %HOUR%==07 (SET HOUR=19) IF %HOUR%==08 (SET HOUR=20) IF %HOUR%==09 (SET HOUR=21) IF %HOUR%==10 (SET HOUR=22) IF %HOUR%==11 (SET HOUR=23) ) ELSE ( IF %HOUR%==12 (SET HOUR=00) IF %HOUR%==1 (SET HOUR=01) IF %HOUR%==2 (SET HOUR=02) IF %HOUR%==3 (SET HOUR=03) IF %HOUR%==4 (SET HOUR=04) IF %HOUR%==5 (SET HOUR=05) IF %HOUR%==6 (SET HOUR=06) IF %HOUR%==7 (SET HOUR=07) IF %HOUR%==8 (SET HOUR=08) IF %HOUR%==9 (SET HOUR=09) ) :: --- GENERATE OUR WANTED TIMESTAMP ECHO. & ECHO. SET TIMESTAMP=%MYDATE%__%HOUR%_%MINUTES%_%SECONDS% ECHO Your timestamp is: %TIMESTAMP% :: --- WAIT - VIEW THE RESULT IN THE CONSOLE SCREEN ECHO. & ECHO. ECHO Job is done. Press any key to exit . . . PAUSE > NUL EXIT


Estos son mis 2 centavos por una datetime string y datetime string . En sistemas MM DD YYYY , cambie la primera y la segunda %DATE:~ entradas.

REM ==================================================================================== REM CREATE UNIQUE DATETIME STRING FOR ADDING TO FILENAME REM ==================================================================================== REM Can handle dd DDxMMxYYYY and DDxMMxYYYY > CREATES YYYYMMDDHHMMSS (x= any character) REM ==================================================================================== REM CHECK for SHORTDATE dd DDxMMxYYYY IF "%DATE:~0,1%" GTR "3" ( SET DATETIME=%DATE:~9,4%%DATE:~6,2%%DATE:~3,2%%TIME:~0,2%%TIME:~3,2%%TIME:~6,2% ) ELSE ( REM ASSUMES SHORTDATE DDxMMxYYYY SET DATETIME=%DATE:~6,4%%DATE:~3,2%%DATE:~0,2%%TIME:~0,2%%TIME:~3,2%%TIME:~6,2% ) REM CORRECT FOR HOURS BELOW 10 IF %DATETIME:~8,2% LSS 10 SET DATETIME=%DATETIME:~0,8%0%DATETIME:~9,5% ECHO %DATETIME%


Hay otra manera fácil de hacerlo:

set HH=%time:~0,2% if %HH% LEQ 9 ( set HH=%time:~1,1% )


Hoy me encontré con este problema y lo resolví con:

SET LOGTIME=%TIME: =0%

Reemplaza los espacios con 0 y básicamente con cero almohadillas la hora.

Después de algunas búsquedas rápidas, no averigüé si requería extensiones de comando (todavía funcionaba con SETLOCAL DISABLEEXTENSIONS).


Intenté la respuesta aceptada y funciona bastante bien. Desafortunadamente, el formato de hora de EE. UU. Parece ser H: MM: SS.CS, y el 0 faltante en el frente estaba causando problemas de análisis antes de las 10 a. M. Para superar este obstáculo y también permitir el análisis de la mayoría de los formatos de tiempo del mundo, se me ocurrió esta sencilla rutina que parece funcionar bastante bien.

:ParseTime rem The format of %%TIME%% is H:MM:SS.CS or (HH:MM:SS,CS) for example 0:01:23.45 or 23:59:59,99 FOR /F "tokens=1,2,3,4 delims=:.," %%a IN ("%1") DO SET /A "%2=(%%a * 360000) + (%%b * 6000) + (%%c * 100) + %%d" GOTO :EOF

Lo bueno de esta rutina es que pasa la cadena de tiempo como el primer parámetro y el nombre de la variable de entorno que desea que contenga el tiempo (en centisegundos) como el segundo parámetro. Por ejemplo:

CALL :ParseTime %START_TIME% START_CS CALL :ParseTime %TIME% END_CS SET /A DURATION=%END_CS% - %START_CS%

(* Chris *)


Lo hice de esta manera:

REM Generate FileName from date and time in format YYYYMMTTHHMM Time /T > Time.dat set /P ftime= < Time.dat set FileName=LogFile%date:~6%%date:~3,2%%date:~0,2%%ftime:~0,2%%ftime:~3,2%.log echo %FileName%

LogFile201310170928.log


Me gusta la versión corta sobre @Lorax, pero para otras configuraciones de idioma podría ser ligeramente diferente.

Por ejemplo, en la configuración del idioma alemán (con formato de fecha natural: dd.mm.aaaa), la consulta del mes debe modificarse de 4,2 a 3,2:

@ECHO OFF : Sets the proper date and time stamp with 24h time for log file naming convention i.e. SET HOUR=%time:~0,2% SET dtStamp9=%date:~-4%%date:~3,2%%date:~7,2%_0%time:~1,1%%time:~3,2%%time:~6,2% SET dtStamp24=%date:~-4%%date:~3,2%%date:~7,2%_%time:~0,2%%time:~3,2%%time:~6,2% if "%HOUR:~0,1%" == " " (SET dtStamp=%dtStamp9%) else (SET dtStamp=%dtStamp24%) ECHO %dtStamp% : Outputs= 20160727_081040 : (format: YYYYMMDD_HHmmss; e.g.: the date-output of this post timestamp) PAUSE


Normalmente lo hago de esta manera cada vez que necesito una cadena de fecha / hora:

set dt=%DATE:~6,4%_%DATE:~3,2%_%DATE:~0,2%__%TIME:~0,2%_%TIME:~3,2%_%TIME:~6,2% set dt=%dt: =0%

Esto es para el formato alemán de fecha / hora (dd.mm.aaaa hh: mm: ss). Básicamente, concateno las subcadenas y finalmente reemplazo todos los espacios por ceros.

Breve explicación de cómo funcionan las subcadenas:

%VARIABLE:~num_chars_to_skip,num_chars_to_keep%

Para obtener solo el año de una fecha como "29.03.2018", use:

%DATE:~6,4% ^-----skip 6 characters ^---keep 4 characters


Para generar una marca de tiempo YYYY-MM-DD hh:mm:ss (24 horas) utilizo:

SET CURRENTTIME=%TIME% IF "%CURRENTTIME:~0,1%"==" " (SET CURRENTTIME=0%CURRENTTIME:~1%) FOR /F "tokens=2-4 delims=/ " %%A IN (''DATE /T'') DO (SET TIMESTAMP=%%C-%%A-%%B %CURRENTTIME%)


Para una solución muy simple para la fecha numérica para su uso en nombres de archivos, use el siguiente código:

set month=%date:~4,2% set day=%date:~7,2% set curTimestamp=%month%%day%%year% rem then the you can add a prefix and a file extension easily like this echo updates%curTimestamp%.txt


Si PowerShell está instalado, puede obtener la fecha / hora de manera fácil y confiable en el formato que desee, por ejemplo:

for /f %%a in (''powershell -Command "Get-Date -format yyyy_MM_dd__HH_mm_ss"'') do set datetime=%%a move "%oldfile%" "backup-%datetime%"

Por supuesto, hoy en día PowerShell siempre está instalado, pero en Windows XP probablemente solo quiera utilizar esta técnica si su script por lotes se usa en un entorno conocido donde sabe que PS está disponible (o controle su archivo por lotes si PowerShell está disponible) ...)

Puede preguntar razonablemente: ¿por qué usar un archivo por lotes si puede usar PowerShell para obtener la fecha / hora, pero creo que algunas razones obvias son: (a) no está familiarizado con PowerShell y aún prefiere hacer más cosas a la antigua usanza con archivos de proceso por lotes o (b) está actualizando un script antiguo y no quiere portarlo todo en PS.


Si no necesita exactamente este formato:

2009_07_28__08_36_01

Entonces podría usar las siguientes 3 líneas de código que usa% date% y% time%:

set mydate=%date:/=% set mytime=%time::=% set mytimestamp=%mydate: =_%_%mytime:.=_%

Nota: Los caracteres / y : se eliminan y el personaje . y el espacio se reemplaza con un guion bajo.

Ejemplo de salida (tomada el miércoles 5/8/15 a las 12:49 p.m. con 50 segundos y 93 milisegundos):

echo %mytimestamp% Wed_08052015_124950_93


Tal vez algo como esto:

@call:DateTime @for %%? in ( "Year :Y" "Month :M" "Day :D" "Hour :H" "Minutes:I" "Seconds:S" ) do @for /f "tokens=1-2 delims=:" %%# in (%%?) do @for /f "delims=" %%_ in (''echo %%_DT_%%$_%%'') do @echo %%# : _DT_%%$_ : %%_ :: OUTPUT :: Year : _DT_Y_ : 2014 :: Month : _DT_M_ : 12 :: Day : _DT_D_ : 17 :: Hour : _DT_H_ : 09 :: Minutes : _DT_I_ : 04 :: Seconds : _DT_S_ : 35 @pause>nul @goto:eof :DateTime @verify errorlevel 2>nul & @wmics Alias /? >nul 2>&1 @if not errorlevel 1 ( @for /f "skip=1 tokens=1-6" %%a in (''wmic path win32_localtime get day^,hour^,minute^,month^,second^,year /format:table'') do @if not "%%f"=="" ( set "_DT_D_=%%a" & set "_DT_H_=%%b" & set "_DT_I_=%%c" & set "_DT_M_=%%d" & set "_DT_S_=%%e" & set "_DT_Y_=%%f" ) ) else ( @set "_DT_T_=1234567890 " ) @if errorlevel 1 ( @for %%? in ("iDate" "sDate" "iTime" "sTime" "F" "Y" "M" "D" "H" "I" "S") do @set "_DT_%%~?_=%%~?" @for %%? in ("Date" "Time") do @for /f "skip=2 tokens=1,3" %%a in (''reg query "HKCU/Control Panel/International" /v ?%%~? 2^>nul'') do @for /f %%x in (''echo:%%_DT_%%a_%%'') do @if "%%x"=="%%a" set "_DT_%%a_=%%b" @for /f "tokens=1-3 delims=%_DT_T_%" %%a in ("%time%") do @set "_DT_T_=%%a%%b%%c" ) @if errorlevel 1 ( @if "%_DT_iDate_%"=="0" (set "_DT_F_=_DT_D_ _DT_Y_ _DT_M_") else if "%_DT_iDate_%"=="1" (set "_DT_F_=_DT_D_ _DT_M_ _DT_Y_") else if "%_DT_iDate_%"=="2" (set "_DT_F_=_DT_Y_ _DT_M_ _DT_D_") @for /f "tokens=1-4* delims=%_DT_sDate_%" %%a in (''date/t'') do @for /f "tokens=1-3" %%x in (''echo:%%_DT_F_%%'') do @set "%%x=%%a" & set "%%y=%%b" & set "%%z=%%c" @for /f "tokens=1-3 delims=%_DT_T_%" %%a in ("%time%") do @set "_DT_H_=%%a" & set "_DT_I_=%%b" & set "_DT_S_=%%c" @for %%? in ("iDate" "sDate" "iTime" "sTime" "F" "T") do @set "_DT_%%~?_=" ) @for %%i in ("Y" ) do @for /f %%j in (''echo:"%%_DT_%%~i_%%"'') do @set /a _DT_%%~i_+= 0 & @for /f %%k in (''echo:"%%_DT_%%~i_:~-4%%"'') do @set "_DT_%%~i_=%%~k" @for %%i in ("M" "D" "H" "I" "S") do @for /f %%j in (''echo:"%%_DT_%%~i_%%"'') do @set /a _DT_%%~i_+=100 & @for /f %%k in (''echo:"%%_DT_%%~i_:~-2%%"'') do @set "_DT_%%~i_=%%~k" @exit/b


Terminé con este script:

set hour=%time:~0,2% if "%hour:~0,1%" == " " set hour=0%hour:~1,1% echo hour=%hour% set min=%time:~3,2% if "%min:~0,1%" == " " set min=0%min:~1,1% echo min=%min% set secs=%time:~6,2% if "%secs:~0,1%" == " " set secs=0%secs:~1,1% echo secs=%secs% set year=%date:~-4% echo year=%year%

:: En WIN2008R2, por ejemplo, tuve que hacer tu ''set month =% date: ~ 3,2%'' como below :: de lo contrario 00 aparece para MONTH

set month=%date:~4,2% if "%month:~0,1%" == " " set month=0%month:~1,1% echo month=%month% set day=%date:~0,2% if "%day:~0,1%" == " " set day=0%day:~1,1% echo day=%day% set datetimef=%year%%month%%day%_%hour%%min%%secs% echo datetimef=%datetimef%


Usando%, se ejecutará un error de operación hexadecimal cuando el valor de tiempo es 7-9. Para evitar esto, use los valores de DelayedExpansion y agarrar tiempo con! Min: ~ 1!

Un método alternativo, si tiene PowerShell es llamarlo:

for /F "usebackq delims=Z" %%i IN (`powershell Get-Date -format u`) do (set server-time=%%i)


Use REG para guardar / modificar / restaurar los valores que sean más útiles para su archivo bat. Esto es Windows 7, para otras versiones puede necesitar un nombre de clave diferente.

reg save "HKEY_CURRENT_USER/Control Panel/International" _tmp.reg /y reg add "HKEY_CURRENT_USER/Control Panel/International" /v sShortDate /d "yyyy-MM-dd" /f set file=%DATE%-%TIME: =0% reg restore "HKEY_CURRENT_USER/Control Panel/International" _tmp.reg set file=%file::=-% set file=%file:.=-% set file


soy realmente nuevo en los archivos por lotes y este es mi código !! (No estoy seguro por qué, pero no pude combinar date / t y time / t y no pude usar % date% y % time% directamente sin variable ...)

@ECHO OFF set ldt=%date% %time% echo %ldt%>> logs.txt EXIT

un poco reutilizado de otros (la pregunta era obtener un formato de fecha y hora para usar como nombre de archivo)


:: ============================================================= :: Batch file to display Date and Time seprated by undescore. :: ============================================================= :: Read the system date. :: ============================================================= @SET MyDate=%DATE% @SET MyDate=%MyDate:/=:% @SET MyDate=%MyDate:-=:% @SET MyDate=%MyDate: =:% @SET MyDate=%MyDate:/=:% @SET MyDate=%MyDate::=_% :: ============================================================= :: Read the system time. :: ============================================================= @SET MyTime=%TIME% @SET MyTime=%MyTime: =0% @SET MyTime=%MyTime:.=:% @SET MyTime=%MyTime::=_% :: ============================================================= :: Build the DateTime string. :: ============================================================= @SET DateTime=%MyDate%_%MyTime% :: ============================================================= :: Display the Date and Time as it is now. :: ============================================================= @ECHO MyDate="%MyDate%" MyTime="%MyTime%" DateTime="%DateTime%" :: ============================================================= :: Wait before close. :: ============================================================= @PAUSE :: =============================================================


::======================================================================== ::== CREATE UNIQUE DATETIME STRING IN FORMAT YYYYMMDD-HHMMSS ::======= ================================================================ FOR /f %%a IN (''WMIC OS GET LocalDateTime ^| FIND "."'') DO SET DTS=%%a SET DATETIME=%DTS:~0,8%-%DTS:~8,6%

La primera línea siempre da salida en este formato con respecto a la zona horaria:
20150515150941.077000 + 120
Esto te deja simplemente formateando la salida para que se ajuste a tus deseos.


@ECHO OFF : Sets the proper date and time stamp with 24Hr Time for log file naming : convention SET HOUR=%time:~0,2% SET dtStamp9=%date:~-4%%date:~4,2%%date:~7,2%_0%time:~1,1%%time:~3,2%%time:~6,2% SET dtStamp24=%date:~-4%%date:~4,2%%date:~7,2%_%time:~0,2%%time:~3,2%%time:~6,2% if "%HOUR:~0,1%" == " " (SET dtStamp=%dtStamp9%) else (SET dtStamp=%dtStamp24%) ECHO %dtStamp% PAUSE


REM Assumes UK style date format for date environment variable (DD/MM/YYYY). REM Assumes times before 10:00:00 (10am) displayed padded with a space instead of a zero. REM If first character of time is a space (less than 1) then set DATETIME to: REM YYYY-MM-DD-0h-mm-ss REM Otherwise, set DATETIME to: REM YYYY-MM-DD-HH-mm-ss REM Year, month, day format provides better filename sorting (otherwise, days grouped REM together when sorted alphabetically). IF "%time:~0,1%" LSS "1" ( SET DATETIME=%date:~6,4%-%date:~3,2%-%date:~0,2%-0%time:~1,1%-%time:~3,2%-%time:~6,2% ) ELSE ( SET DATETIME=%date:~6,4%-%date:~3,2%-%date:~0,2%-%time:~0,2%-%time:~3,2%-%time:~6,2% ) ECHO %DATETIME%


set hourstr = %time:~0,2% if "%time:~0,1%"==" " (set hourstr=0%time:~1,1%) set datetimestr=%date:~0,4%%date:~5,2%%date:~8,2%-%hourstr%%time:~3,2%%time:~6,2%