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

Utilizzando Data e ora in un file batch per creare un nome file

Eseguo 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 eseguire il backtrace.

Il nome del file desiderato sarebbe gnucash_shockwave-20121128210344. sql (formato data YYYYY-MM-MM-DDD-HH-MM-MM-SS)

Ho cercato su Google alcune cose che dicevano prova %DATE:~4% e %Date.Year% ma ho ottenuto un errore che dice The 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 parlo:

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

Qualche suggerimento?

Risposte (6)

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

Il formato di data e ora dipende da quanto specificato nell'applet Regione e lingua del pannello di controllo.

Eseguire il seguente file batch (che assume dd/mm/yyyyy e hh:mm:ss) e modificare l'estrazione della sottostringa (usando i caratteri : e ~) come richiesto per ottenere le parti corrette 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 ulteriore aiuto sull'estrazione della sottostringa, digitare set /? al prompt dei comandi o vedere questa pagina .

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

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
3
3
2015-06-25 20:25:48 +0000

Con un piccolo ritocco ho ottenuto questo

@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
``` &001 


Risultato: 


`"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

Ci scusiamo per il ritardo…

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

Credo che questo migliori un po’ la risposta di @Nick Rogers.

EX: con la localizzazione tedesca (de_DE) c'è uno spazio bianco di testa alle ore sotto le 10.

anch'io volevo uno zero di testa all'ora. “eco - !^_hh! -” dà “09” invece di 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, vedi 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: echo fullTime = 15062018-10182821

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

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 %% piuttosto che % 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"