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


20

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

J'aimerais que le fichier de commandes crée une sauvegarde différente pour chaque exécution, afin que je puisse revenir en arrière.

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

J'ai googlé quelques choses qui ont dit essayer %DATE:~4%et %Date.Year%mais je reçois une erreur qui ditThe 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?


J'ai réassocié vos comptes, vous devriez pouvoir vous connecter et commenter vos propres messages et réponses à vos questions maintenant.
slhck

slhck, lol merci je me demandais ce qui se passait alors je me suis souvenu que je n'étais pas au débordement de pile lol
guyfromfl

remplacement de% date% par% date: ~ 6,4% -% date: ~ 3,2% -% date: ~ 0,2% travaillé
MagTun

Réponses:


28

Le format de date et d'heure dépend de ce que vous avez spécifié dans l' applet du panneau de configuration de la région et de la 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 (en utilisant les caractères: et ~) comme requis pour obtenir les pièces appropriées 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 sous-chaîne, tapez set /?à l'invite de commande ou consultez cette page .


Merci, je pense que je comprends comment cela fonctionne maintenant. Je ne suis pas au bureau, mais j'essaierai cela dès mon arrivée et je posterai. Nous utilisons Windows 8 Merci pour l'aide
guyfromfl

J'ai compris, j'ai dû modifier les emplacements des chaînes de la date, probablement à cause de mon emplacement et de ma langue, mais cela a fait l'affaire! Merci beaucoup!
guyfromfl

Pour obtenir l' utilisation de la date locale indépendante wmic au lieu
phuclv

Cette solution peut vous donner des résultats différents sur différentes machines.
Mehdi Dehghani

Je pense que quelque chose a changé avec la sortie de la date, je peux > echo yyyy = %DATE:~6,4%produire yyyy = /20/. Mais echo yyyy = %DATE:~10,4%c'est yyyy = 2019.
teeks99

7

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
Bienvenue sur Super User! Pourriez-vous modifier votre réponse pour inclure une explication de ce que font vos commandes?
Excellll

Vous répondez à la mauvaise question. La question du PO demande YYYYMMDD; cette réponse donne MMDDYYYY.
Scott

rien de tel que de venir à Stack avec une question et d'avoir la réponse parfaite juste assis là en attendant de sauver la journée pour moi. Merci @abbs tant et Excelll
clockwiseq

3

Avec un petit ajustement, 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)


En quoi cela diffère-t-il des autres réponses?
suspectus

@suspectus: Cette réponse diffère de la réponse d'abbs dans la mesure où abbs suppose une région américaine (c'est-à-dire locale), où %DATE%~ Ddd MM/DD/YYYY, tandis que celle-ci suppose une région non américaine, où %DATE%~ DD/MM/YYYY(sans le jour de la semaine). Et celui-ci diffère de la réponse de Karan en ce que celui-ci est faux - la question demande YYYYMMDD; cette réponse donne DD_MM – YYYY.
Scott

2

Désolé pour le retard ...

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

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 de premier plan aux heures en dessous de 10.

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

donc je casse le code en deux morceaux pour une meilleure lecture. cet exemple devrait correspondre à plus de paramètres régionaux.

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

remarque: parfois l'HEURE doit être échappée, voir 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

la réponse la plus courte (la plus polyvalente?) est conforme au script TimeStamp.cmd suivant contenant seulement 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"
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.