web-dev-qa-db-fra.com

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

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

Je souhaite que le fichier de commandes crée une sauvegarde différente pour chaque exécution, afin que je puisse effectuer une trace arrière.

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

J'ai cherché dans Google quelques choses qui disaient essayer %DATE:~4% et %Date.Year% mais je reçois une erreur qui dit The system cannot find the specified path.

Si je supprime la tentative d'horodatage, le script fonctionne correctement mais écrase la sauvegarde précédente.

Voici la section de 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!

Aucune suggestion?

18
guyfromfl

Le format de date et heure dépend de ce que vous avez spécifié dans l’applet du panneau de configuration Région et langue .

Exécutez le fichier de commandes suivant (qui suppose jj/mm/aaaa et hh: mm: ss ) et modifiez l'extraction de la sous-chaîne (à l'aide de: et ~ caractères) au besoin pour obtenir les pièces appropriées des chaînes Date et 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 sous-chaînes, tapez set /? dans la commande Invite ou consultez cette page .

28
Karan

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
7
abbs

Avec un peu de peaufinage j'ai eu 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
André Verwijs

Désolé pour le retard ...

Le seul moyen fiable d'obtenir la date appropriée, quel que soit le paramètre régional choisi, est la solution 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
Eric Ouellet

je pense que cela améliore @ Nick Rogers répond un peu.

EX: avec l'allemand localiser (de_DE), il y a un espace blanc de début à des heures inférieures à 10.

aussi je voulais un zéro à l’heure. "echo -! ^ _ hh! -" donne "09" au lieu de "9"

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

+ bonus: _ms = millisecondes ou quels que soient les deux derniers chiffres ((-;

remarque: parfois il faut échapper à l'HEURE, voir code interne

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
le luxe fou

la réponse la plus courte (la plus polyvalente?) correspond au script TimeStamp.cmd suivant, ne contenant que trois lignes de code (à l'exclusion des 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 dans une instruction FOR dans un fichier de commandes

... rendements d'exécution (lignes vierges 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"
0
Nick Rogers