Uso de fecha y hora en un archivo por lotes para crear un nombre de archivo

20

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

Me gustaría que el archivo por lotes cree una copia de seguridad diferente para cada ejecución, para que pueda rastrear.

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

Busqué en Google algunas cosas que decían intentar %DATE:~4%y, %Date.Year%pero recibo un error que diceThe system cannot find the specified path.

Si elimino el intento de sellarlo, la secuencia de comandos funciona bien, pero sobreescribe la copia de seguridad anterior

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

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

guyfromfl
fuente
He vuelto a asociar sus cuentas, ahora debería poder iniciar sesión y comentar sus propias publicaciones y respuestas a sus preguntas.
slhck
slhck, gracias lol Me preguntaba qué estaba pasando entonces recordé que no estaba al desbordamiento de pila lol
guyfromfl
reemplazando% date% por% date: ~ 6,4% -% date: ~ 3,2% -% date: ~ 0,2% trabajado
MagTun

Respuestas:

28

El formato de fecha y hora depende de lo que haya especificado en el subprograma Panel de control de región e idioma .

Ejecute el siguiente archivo por lotes (que supone dd / mm / aaaa y hh: mm: ss ) y modifique la extracción de subcadenas (utilizando 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 obtener más ayuda sobre la extracción de subcadenas, escriba set /?en el símbolo del sistema o consulte esta página .

Karan
fuente
Gracias, creo que entiendo cómo funciona esto ahora. No estoy en la oficina, pero lo intentaré tan pronto como llegue y publique de nuevo. Estamos usando Windows 8 Gracias por la ayuda
guyfromfl
Entendido, tuve que ajustar las ubicaciones de las cadenas de la fecha, probablemente debido a mi ubicación e idioma, ¡pero eso funcionó! ¡Muchas gracias!
guyfromfl
Para obtener una fecha independiente de la configuración regional, use wmic en su lugar
phuclv
Esta solución puede darle resultados diferentes en diferentes máquinas.
Mehdi Dehghani
Creo que algo cambió con la salida de la fecha, puedo > echo yyyy = %DATE:~6,4%producir yyyy = /20/. Sin embargo lo echo yyyy = %DATE:~10,4%es yyyy = 2019.
teeks99
7

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
abbs
fuente
3
¡Bienvenido a Super User! ¿Podría editar su respuesta para incluir alguna explicación de lo que hacen sus comandos?
Excellll
Estás respondiendo la pregunta equivocada. La pregunta del OP pide AAAAMMDD; esta respuesta da MMDDYYYY.
Scott
nada como venir a Stack con una pregunta y tener la respuesta perfecta simplemente sentado allí esperando para salvarme el día. Muchas gracias @abbs y Excelll
clockwiseq
3

Con un pequeño ajuste obtuve 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)

André Verwijs
fuente
¿Cómo difiere esto de las otras respuestas?
sospechosos
@suspectus: esta respuesta difiere de la respuesta de abbs en que abbs asume una región de EE. UU. (es decir, local), donde %DATE%~ Ddd MM/DD/YYYY, mientras que esta asume una región no estadounidense, donde %DATE%~ DD/MM/YYYY(sin el día de la semana). Y esta difiere de la respuesta de Karan en que esta está equivocada : la pregunta pide AAAAMMDD; esta respuesta da DD_MM – AAAA.
Scott
2

Perdón por el retraso ...

La única forma confiable de obtener la fecha adecuada, independientemente de la configuración regional, es la solución de foxidrive @ /programming/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
Eric Ouellet
fuente
1

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

EJ: con la ubicación alemana (de_DE) hay un espacio en blanco a las horas por debajo de 10.

También quería un cero a la hora. "echo -! ^ _ hh! -" da "09" en lugar de solo "9"

entonces rompo el código en dos partes para una mejor lectura. Este ejemplo debería coincidir con más configuraciones regionales.

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

comentario: a veces la HORA necesita escapar, ver 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

le luxe fou
fuente
0

la respuesta más corta (¿más versátil?) es según el siguiente script TimeStamp.cmd que contiene solo tres líneas de código (excluyendo 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%"

Tenga en cuenta la necesidad de usar %% en lugar de% para la variable en una instrucción FOR en un archivo por lotes

... rendimientos de ejecución (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"
Nick Rogers
fuente