Usando Data e Hora em um arquivo em lotes para criar um nome de arquivo

20

Estou executando um programa a partir de um arquivo em lotes que, quando concluído, executa um backup automático do meu banco de dados MySQL.

Gostaria que o arquivo em lotes criasse um backup diferente para cada execução, para que eu possa voltar atrás.

O nome do arquivo desejado seria gnucash_shockwave-20121128210344.sql (formato da data AAAA-MM-DD-HH-MM-SS)

Eu pesquisei algumas coisas que diziam tentar %DATE:~4%e %Date.Year%mas recebo um erro que dizThe system cannot find the specified path.

Se eu remover a tentativa de registrar o carimbo de data e hora, o script funcionará bem, mas substitui o backup anterior

Aqui está a seção de código que estou falando:

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

Alguma sugestão?

guyfromfl
fonte
Reassociei suas contas. Agora, você poderá fazer login e comentar suas próprias postagens e respostas às suas perguntas.
slhck
slhck, lol graças Eu queria saber o que estava acontecendo, então eu lembrei que não estava em estouro de pilha lol
guyfromfl
substituindo% date% por% date: ~ 6,4% -% date: ~ 3,2% -% date: ~ 0,2% trabalhado
MagTun 27/11/15

Respostas:

28

O formato Data e hora depende do que você especificou no miniaplicativo Região e idioma do Painel de controle.

Execute o seguinte arquivo em lotes (que assume dd / mm / aaaa e hh: mm: ss ) e modifique a extração de substring (usando os caracteres: e ~) conforme necessário para obter as peças apropriadas das seqüências de data e 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 obter mais ajuda sobre a extração de substring, digite set /?no prompt de comando ou consulte esta página .

Karan
fonte
Obrigado, acho que entendo como isso está funcionando agora. Não estou no escritório, mas tentarei isso assim que chegar e postar de volta. Estamos usando o Windows 8 Obrigado pela ajuda.
guyfromfl
Entendi, tive que ajustar os locais das strings da data, provavelmente por causa da minha localização e idioma, mas isso fez o truque! Muito obrigado!
guyfromfl
Para começar a usar data locale-independente wmic vez
phuclv
Esta solução pode fornecer resultados diferentes em máquinas diferentes.
Mehdi Dehghani
Eu acho que algo mudou com a saída da data, eu consegui > echo yyyy = %DATE:~6,4%produzir yyyy = /20/. No entanto echo yyyy = %DATE:~10,4%é yyyy = 2019.
teeks99
7

Aqui está o que funcionou para mim.

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
fonte
3
Bem-vindo ao Super Usuário! Você poderia editar sua resposta para incluir uma explicação sobre o que seus comandos fazem?
Excellll
Você está respondendo a pergunta errada. A pergunta do OP pede AAAAMMDD; esta resposta fornece MMDDYYYY.
Scott
nada como vir ao Stack com uma pergunta e ter a resposta perfeita esperando para salvar o dia para mim. Graças à muito @abbs e Excelll
clockwiseq
3

Com um pouco de ajustes, eu consegui isso

@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
fonte
Como isso difere das outras respostas?
usar o seguinte
@suspectus: Essa resposta difere da resposta da abbs, pois a abbs assume uma região dos EUA (localidade), onde %DATE%~ Ddd MM/DD/YYYY, enquanto essa assume uma região que não é dos EUA, onde %DATE%~ DD/MM/YYYY(sem o dia da semana). E este difere da resposta de Karan, pois esta está errada - a pergunta pede AAAAMMDD; esta resposta fornece DD_MM – AAAA.
Scott
2

Desculpe pelo atraso ...

A única maneira confiável de obter uma data apropriada, independentemente da configuração regional, é a solução do 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
fonte
1

Eu acho que isso melhora @ Rick Rogers responder um pouco.

EX: com a localização alemã (de_DE), há um espaço em branco à esquerda abaixo das 10 horas.

também eu queria um zero à esquerda na hora. "eco -! ^ _ hh! -" dá "09" em vez de apenas "9"

então eu quebro o código em duas partes para uma melhor leitura. este exemplo deve corresponder a mais localidades.

+ bônus: _ms = milissegundos ou quaisquer que sejam os dois últimos dígitos (-;

observação: às vezes a HORA precisa ser escapada, veja o 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

saídas: eco fullTime = 15062018-10182821

le luxe fou
fonte
0

a resposta mais curta (mais versátil?) é conforme o seguinte script TimeStamp.cmd que contém apenas três linhas de código (excluindo comentários 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%"

Observe a necessidade de usar %% em vez de% para a variável em uma instrução FOR em um arquivo em lotes

... rendimentos de execução (linhas em branco e comentários removidos) ...

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
fonte