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?
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 .
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
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)
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
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
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"