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

Utilisation de la date et de l'heure dans un fichier batch pour créer un nom de fichier

J'exécute un programme à partir d'un fichier batch, qui, lorsqu'il est terminé, effectue une sauvegarde automatique de ma base de données MySQL.

Je voudrais que le fichier batch crée une sauvegarde différente pour chaque exécution, afin de pouvoir effectuer un backtrace.

Le nom de fichier souhaité serait gnucash_shockwave-20121128210344. sql (Format de date YYYY-MM-DD-HH-MM-SS)

J'ai googlé quelques trucs qui disaient try %DATE:~4% et %Date.Year% mais j'obtiens une erreur qui dit The system cannot find the specified path.

Si je supprime la tentative d'horodatage, le script fonctionne bien, mais réécrit la sauvegarde précédente

Voici la section du code dont je parle :

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

Des suggestions ?

Réponses (6)

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

Le format de la date et de l'heure dépend de ce que vous avez spécifié dans l'applet Région et langue du panneau de contrôle.

Exécutez le fichier batch suivant (qui suppose jj/mm/aaaa et hhh:mm:ss) et modifiez l'extraction de la sous-chaîne (en utilisant les caractères : et ~) comme requis pour obtenir les bonnes parties des chaînes de date et d'heure :

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

Pour plus d'aide sur l'extraction de la sous-chaîne, tapez set /? à l'invite de commande ou voir cette page .

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

Voici ce qui a fonctionné pour moi.

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

Avec une petite modification, j'ai obtenu ceci :

@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

Résultat :

"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

Désolé pour le retard…

Le seul moyen fiable d'obtenir une date appropriée, quel que soit le contexte régional, est la solution 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

Je pense que cela améliore un peu la réponse de Nick Rogers.

EX : avec la localisation allemande (de_DE) il y a un espace blanc en tête à des heures en dessous de 10.

aussi je voulais un zéro en tête à l'heure. “echo - !^_hhh ! -” donne “09” au lieu de seulement “9”

donc je casse le code en deux morceaux pour une meilleure lecture. cet exemple devrait correspondre à plus de lieux.

+bonus : _ms = millisecondes ou quel que soit les deux derniers chiffres (- ;

remarque : parfois l'HEURE doit être échappée, voir le code intérieur

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

sorties : echo fullTime = 15062018-10182821

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

la réponse la plus courte (la plus polyvalente ?) est celle du script TimeStamp.cmd suivant, qui ne contient que trois lignes de code (sans les commentaires, 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%"

Notez la nécessité d'utiliser %% plutôt que % pour la variable d'une instruction FOR dans un fichier batch

…rendements d'exécution (lignes blanches et commentaires supprimés)…

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"