2012-11-29 02:49:32 +0000 2012-11-29 02:49:32 +0000
21
21

Usando Fecha y Hora en un archivo por lotes para crear un nombre de archivo

Estoy ejecutando un programa desde un archivo por lotes, que cuando termina realiza una copia de seguridad automática de mi base de datos MySQL.

Me gustaría que el archivo por lotes creara una copia de seguridad diferente para cada ejecución, para poder hacer un backtrace.

El nombre de archivo deseado sería gnucash_shockwave-20121128210344. sql (Formato de fecha AAAA-MM-DD-HH-MM-SS)

He buscado en Google algunas cosas que decían “try %DATE:~4%” y “%Date.Year%” pero me da un error que dice The system cannot find the specified path.

Si quito el intento de marcar la hora, el script funciona bien, pero sobreescribe la copia de seguridad anterior

Aquí está la sección de código de la que hablo:

@REM ***EXECUTION***
echo. Starting backup...
SET timestamp %DATE:~-4%%DATE:~4,2%%DATE:~7,2%%TIME%
%mysqldir%\mysqldump -u %mysqluser% -p%mysqlpassword% -h %mysqlhost% -P %mysqlport% --databases --routines --verbose gnucash_shockwave > %BackupDir%\gnucash_shockwave-%timestamp%.sql

echo.------------------------------------------------------
echo. Backup complete!

¿Alguna sugerencia?

Respuestas (6)

28
28
28
2012-11-29 18:00:07 +0000

El formato de la fecha y la hora depende de lo que hayas especificado en el applet del panel de control de Región e Idioma.

Ejecute el siguiente archivo por lotes (que asume dd/mm/aaaa y hh:mm:ss) y modifique la extracción de la subcadena (usando los caracteres : y ~) según sea necesario para obtener las partes adecuadas de las cadenas de Fecha y Hora:

@echo off
cls
echo Date format = %date%
echo dd = %date:~0,2%
echo mm = %date:~3,2%
echo yyyy = %date:~6,4%
echo.
echo Time format = %time%
echo hh = %time:~0,2%
echo mm = %time:~3,2%
echo ss = %time:~6,2%
echo.
echo Timestamp = %date:~6,4%-%date:~3,2%-%date:~0,2%-%time:~0,2%-%time:~3,2%-%time:~6,2%

Para más ayuda sobre la extracción de la subcadena, escriba set /? en la línea de comandos o vea esta página .

8
8
8
2015-03-05 20:56:02 +0000

Esto es lo que funcionó para mí.

Format - mmddyyyy_HHMMSS

echo %DATE% %TIME%

Date format = Thu 03/05/2015 15:48:26.22

echo mm = %date:~4,2%

echo dd = %date:~7,2%

echo yyyy = %date:~10,4%

echo Timestamp = %date:~4,2%%date:~7,2%%date:~10,4%_%time:~0,2%%time:~3,2%%time:~6,2%

Timestamp - 03052015_154013
3
3
3
2015-06-25 20:25:48 +0000

Con un pequeño ajuste conseguí esto

@echo off
cls
echo Date format = %date%
echo dd = %date:~0,2%
echo mm = %date:~3,2%
echo yyyy = %date:~6,8%
echo.
echo Time format = %time%
echo hh = %time:~0,2%
echo mm = %time:~3,2%
echo ss = %time:~6,2%
echo.
echo Timestamp = %date:~0,2%_%date:~3,2%_%date:~6,8%-%time:~0,2%_%time:~3,2%_%time:~6,2%
ECHO "TEST..." > test-%date:~0,2%_%date:~3,2%_%date:~6,8%-%time:~0,2%_%time:~3,2%_%time:~6,2%.txt

Resultado:

"test-do_25_06-2015-22_21_51.txt" (Thursday_25th_June_2015-22:21.51)

2
2
2
2019-03-28 17:59:29 +0000

Lo siento por el retraso…

La única manera confiable de obtener la fecha apropiada cualquiera que sea el escenario regional es la solución de foxidrive @ https://stackoverflow.com/questions/11037831/filename-timestamp-in-windows-cmd-batch-script

@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
1
1
1
2018-06-15 08:44:00 +0000

Creo que esto mejora un poco la respuesta de Nick Rogers.

EX: con la localización alemana (de_DE) hay un espacio blanco líder a horas por debajo de las 10.

también quería un cero líder a horas. “Eco”… -“ da "09” en lugar de sólo “9”

así que rompí el código en dos partes para una mejor lectura. este ejemplo debería coincidir con más locales.

+bono: _ms = milisegundos o lo que sean los dos últimos dígitos (-;

observación: a veces la HORA necesita ser escapada, ver el código interno

SETLOCAL
SETLOCAL EnableExtensions
SETLOCAL EnableDelayedExpansion
@ECHO ON
@rem use FOR /F to 'break out' the components of %DATE% and %TIME%, assuming 'yyyy/mm/dd' format date i.e.
@rem works also with german standard format dd.mm.yyyy

echo ----- date -----
    echo _%date%_
    for /F "tokens=1-3 delims=.-/" %%i IN ("%date%") DO Set "_Y=%%i"& Set "_M=%%j"& Set "_D=%%k"
    @rem Switch the year and day if appropriate
    IF "xx%_D:~2%" == "xx" Set "_Y=%_D%"& Set "_D=%_Y%"
    set __date=%_Y%%_M%%_D%
    echo _%__date%_
echo ----- date -----

echo ----- time -----
    echo _%time%_
    for /F "tokens=1-4 delims=:," %%l IN ("%time%") DO Set "_tmp_hh=%%l"& Set "_mm=%%m"& Set "_ss=%%n"& Set "_ms=%%o"
    @rem add leading zero to hour if necessary
    if %_tmp_hh% LSS 10 (set _hh=^0%_tmp_hh:~1,1%) ELSE (set _hh=%time:~0,2%)
    @rem sometimes the HOUR needs to be escaped, like this
    echo - !^_hh! -
    set __time=%_hh%%_mm%%_ss%%_ms%
    echo _%__time%_
echo ----- time -----

    Set fullTime=%_Y%%_M%%_D%-%_hh%%_mm%%_ss%%_ms%
    echo _%fullTime%_
pause

salidas: echo fullTime = 15062018-10182821

0
0
0
2018-03-02 11:24:58 +0000

la respuesta más corta (¿más versátil?) es según el siguiente script TimeStamp.cmd que contiene sólo tres líneas de código (excluyendo los comentarios, etc.)…

@ECHO ON
@REM use FOR /F to 'break out' the components of %DATE% and %TIME%, assuming 'yyyy/mm/dd' format date i.e.

    for /F "tokens=1-6* delims=.:-/ " %%i IN ("%DATE% %TIME%") DO Set "YYYY=%%i"& Set "MM=%%j"& Set "DD=%%k"& Set "HH=%%l"& Set "MI=%%m"& Set "SS=%%n"

@REM Switch the year and day if appropriate

    IF NOT "X%DD:~2%" == "X" Set "YYYY=%DD%"& Set "DD=%YYYY%"

    Set "TimeStamp=%YYYY%%MM%%DD%%HH%%MI%%SS%"

Nota la necesidad de usar %% en lugar de % para la variable en una declaración FOR en un archivo por lotes

…la ejecución rinde (líneas en blanco y comentarios eliminados)…

C:\>timestamp.cmd
C:\>for /F "tokens=1-6* delims=.:-/ " %i IN ("2018/03/02 11:17:43.35") DO Set "YYYY=%i" & Set "MM=%j" & Set "DD=%k" & Set "HH=%l" & Set "MI=%m" & Set "SS=%n"
C:\>Set "YYYY=2018" & Set "MM=03" & Set "DD=02" & Set "HH=11" & Set "MI=17" & Set "SS=43"
C:\>IF NOT "X" == "X" Set "YYYY=02" & Set "DD=2018"
C:\>Set "TimeStamp=20180302111743"