Utilizzo di data e ora in un file batch per creare un nome file


20

Sto eseguendo un programma da un file batch, che al termine esegue un backup automatico del mio database MySQL.

Vorrei che il file batch creasse un backup diverso per ogni esecuzione, in modo da poter tornare indietro.

Il nome file desiderato sarebbe gnucash_shockwave-20121128210344.sql (formato data AAAA-MM-GG-HH-MM-SS)

Ho cercato su google alcune cose che dicevano provare %DATE:~4%e %Date.Year%ma ho un errore che diceThe system cannot find the specified path.

Se rimuovo il tentativo di timestamp, lo script funziona bene, ma sovrascrive il backup precedente

Ecco la sezione di codice di cui sto parlando:

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

Eventuali suggerimenti?


Ho riassociato i tuoi account, dovresti essere in grado di accedere e commentare i tuoi post e rispondere alle tue domande ora.
slhck,

slhck, lol grazie mi stavo chiedendo cosa stesse succedendo poi mi sono ricordato che non ero allo stack overflow lol
guyfromfl

sostituendo% data% con% data: ~ 6,4% -% data: ~ 3,2% -% data: ~ 0,2% lavorato
MagTun

Risposte:


28

Il formato di data e ora dipende da ciò che hai specificato in pannello di controllo della lingua e regione .

Eseguire il seguente file batch (che assume gg / mm / aaaa e hh: mm: ss ) e modificare l'estrazione della sottostringa (utilizzando i caratteri: e ~) come richiesto per ottenere le parti appropriate da entrambe le stringhe di data e ora:

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

Per ulteriori informazioni sull'estrazione della sottostringa, digitare set /?al prompt dei comandi o vedere questa pagina .


Grazie, penso di capire come funziona ora. Non sono in ufficio, ma ci proverò non appena arrivo e rispondo. Stiamo usando Windows 8 Grazie per l'aiuto
guyfromfl

Capito, ho dovuto modificare le posizioni delle stringhe della data, probabilmente a causa della mia posizione e lingua ma quello ha funzionato! Grazie mille!
guyfromfl

Per ottenere una data indipendente dalla locale usa invece wmic
phuclv,

Questa soluzione può dare risultati diversi su macchine diverse.
Mehdi Dehghani,

Penso che qualcosa sia cambiato con l'output della data, riesco > echo yyyy = %DATE:~6,4%a produrre yyyy = /20/. Comunque lo echo yyyy = %DATE:~10,4%è yyyy = 2019.
teeks99,

7

Ecco cosa ha funzionato per me.

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
Benvenuto in Super User! Potresti modificare la tua risposta per includere una spiegazione di ciò che fanno i tuoi comandi?
Eccellente il

Stai rispondendo alla domanda sbagliata. La domanda del PO richiede AAAAMMGG; questa risposta dà MMDDYYYY.
Scott,

niente come venire a Stack con una domanda e avere la risposta perfetta semplicemente seduto lì in attesa di salvarmi la giornata. Grazie mille @abbs ed Excelll
clockwiseq

3

Con un po 'di modifiche ho capito

@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


Risultato:

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


In che modo differisce dalle altre risposte?
suspectus,

@suspectus: questa risposta differisce dalla risposta di abbs in quanto abbs assume una regione degli Stati Uniti (cioè, locale), dove %DATE%~ Ddd MM/DD/YYYY, mentre questa assume una regione non statunitense, dove %DATE%~ DD/MM/YYYY(senza il giorno della settimana). E questo differisce dalla risposta di Karan in quanto questo è sbagliato - la domanda chiede AAAAMMGG; questa risposta fornisce GG_MM – AAAA.
Scott,

2

Ci scusiamo per il ritardo ...

L'unico modo affidabile per ottenere la data appropriata indipendentemente dall'impostazione regionale è la soluzione di 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

1

penso che questo possa migliorare un po 'la risposta di @Nick Rogers.

ES: con la localizzazione tedesca (de_DE) c'è uno spazio bianco iniziale a ore inferiori a 10.

volevo anche uno zero iniziale all'ora. "echo -! ^ _ hh! -" indica "09" anziché solo "9"

quindi rompo il codice in due pezzi per una migliore lettura. questo esempio dovrebbe corrispondere a più locali.

+ bonus: _ms = millisecondi o qualunque siano le ultime due cifre (-;

osservazione: a volte l'ORA deve essere sfuggita, vedere il codice 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

uscite: eco fullTime = 15062018-10182821


0

la risposta più breve (la più versatile?) è secondo il seguente script TimeStamp.cmd contenente solo tre righe di codice (esclusi i commenti ecc.) ...

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

Si noti la necessità di utilizzare %% anziché% per la variabile in un'istruzione FOR in un file batch

... rendimenti di esecuzione (righe vuote e commenti rimossi) ...

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"
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.