J'ai un script batch qui génère un fichier et j'essaie de m'assurer que chaque fois que le script est exécuté, aucun fichier existant n'est écrasé. J'essaie donc de lui attribuer un horodatage.
Actuellement j'ai ceci:
set stamp=%DATE:/=-%_%TIME::=-%
Mais si le temps est 1-9 AM, cela donne quelque chose comme:
13-06-2012_ instead of a full 13-06-2012_12-39-37.28
Comment puis-je réparer cela?
J'utilise Windows 7 et la sortie de echo %date% %time%
dans une fenêtre de ligne de commande est (mon format d'horloge pour "date courte" est configuré pour afficher les mois de 3 lettres):
03-Sep-12 9:06:21.54
Edit: Cela fait un bon moment que j'utilise l'horodatage suivant, ça marche bien.
set timestamp=%DATE:/=-%_%TIME::=-%
set timestamp=%timestamp: =%
Il a produit un horodatage du type: 18-03-2013_13-37-43.26
, en remplaçant /
et :
dans %TIME%
et %DATE%
, puis en supprimant les espaces. Les espaces blancs étaient le problème dans ma question initiale, vraiment.
Grâce à une réponse à la question de Stack Overflow Création d'un nom de fichier comme horodatage dans un travail par lots , j'ai découvert qu'il s'agissait d'un espace terminant le nom du fichier.
Les quatre premières lignes de ce code vous donneront des variables AAAA JJ MM AAAA AA HH Min Sec dans XP Pro et versions supérieures, à l'aide de WMIC.
@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
Voir la question relative au débordement de pile Comment obtenir l'heure actuelle sur la ligne de commande Windows, dans un format approprié pour l'utilisation dans un nom de fichier?.
Créez un fichier, date.bat
:
@echo off
For /f "tokens=2-4 delims=/ " %%a in ('date /t') do (set mydate=%%c-%%a-%%b)
For /f "tokens=1-3 delims=/:/ " %%a in ('time /t') do (set mytime=%%a-%%b-%%c)
set mytime=%mytime: =%
echo %mydate%_%mytime%
Exécutez date.bat
:
C:\>date.bat
2012-06-14_12-47-PM
METTRE À JOUR:
Vous pouvez aussi le faire avec une ligne comme ceci:
for /f "tokens=2-8 delims=.:/ " %%a in ("%date% %time%") do set DateNtime=%%c-%%a-%%b_%%d-%%e-%%f.%%g
Voici un script que j'ai créé pour renvoyer un horodatage. Un premier argument facultatif peut être fourni pour être utilisé en tant que délimiteur de champ . Par exemple:
c:\sys\tmp> timestamp.bat
20160404_144741
c:\sys\tmp> timestamp.bat -
2016-04-04_14-45-25
c:\sys\tmp> timestamp.bat:
2016: 04: 04_14: 45: 29
@echo off
SETLOCAL ENABLEDELAYEDEXPANSION
:: put your desired field delimiter here.
:: for example, setting DELIMITER to a hyphen will separate fields like so:
:: yyyy-MM-dd_hh-mm-ss
::
:: setting DELIMITER to nothing will output like so:
:: yyyyMMdd_hhmmss
::
SET DELIMITER=%1
SET DATESTRING=%date:~-4,4%%DELIMITER%%date:~-7,2%%DELIMITER%%date:~-10,2%
SET TIMESTRING=%TIME%
::TRIM OFF the LAST 3 characters of TIMESTRING, which is the decimal point and hundredths of a second
set TIMESTRING=%TIMESTRING:~0,-3%
:: Replace colons from TIMESTRING with DELIMITER
SET TIMESTRING=%TIMESTRING::=!DELIMITER!%
:: if there is a preceeding space substitute with a zero
echo %DATESTRING%_%TIMESTRING: =0%
Nom du fichier journal par lots Windows au format 2018-02-08_14.32.06.34.log:
setlocal
set d=%DATE:~-4%-%DATE:~4,2%-%DATE:~7,2%
set t=%time::=.%
set t=%t: =%
set logfile="%d%_%t%.log"
ping localhost -n 11>%1/%logfile%
endlocal
Dans le passé, j'ai utilisé un script .cmd trouvé sur Internet. Je déteste la façon dont la localisation dérange normalement avec les dates. Chaque fois que vous avez des dates dans les noms de fichiers (ou n'importe où ailleurs, si je peux être si audacieux), je suppose que vous les voulez au format ISO 8601:
2015-02-19T14: 54: 51Z
ou quelque chose d'autre qui a Y M D H M dans cet ordre, tel que
2015-02-19 14:54
parce qu’il corrige l’ambiguïté MDY/DMY et qu’il peut être trié sous forme de texte.
Je ne sais pas où j'ai obtenu ce script .cmd, mais c'est peut-être http://ss64.com/nt/syntax-getdate.html , qui fonctionne à merveille sous mon AAAA-MM-DD Windows 8.1 et sur une installation M/D/YYYY Vanilla de Windows 7. Les deux donnent le même format:
2015-02-09 04:43
Il veut le temps complet dans DD-MM-YYYY_HH-MM-SS.TT
où TT est la graduation. L'exception dit tout.
for /f "tokens=2-8 delims=.:/ " %%a in ("%date% %time: =0%") do set DateNtime=%%c-%%a-%%b_%%d-%%e-%%f.%%g
echo %DateNtime%
Ou, à partir de la ligne de commande:
for /f "tokens=2-8 delims=.:/ " %a in ("%date% %time: =0%") do echo %c-%a-%b_%d-%e-%f.%g
EDIT: Conformément aux spécifications d'heure/date non standard de bryce. (03-Sep-12 9:06:21.54
)
@echo off
setlocal enabledelayedexpansion
for /f "tokens=1-7 delims=.:/- " %%a in ("%date% %time%") do (
if "%%b"=="Jan" set MM=01
if "%%b"=="Feb" set MM=02
if "%%b"=="Mar" set MM=03
if "%%b"=="Apr" set MM=04
if "%%b"=="May" set MM=05
if "%%b"=="Jun" set MM=06
if "%%b"=="Jul" set MM=07
if "%%b"=="Aug" set MM=08
if "%%b"=="Sep" set MM=09
if "%%b"=="Oct" set MM=10
if "%%b"=="Nov" set MM=11
if "%%b"=="Dec" set MM=12
set HH=0%%d
set HH=!HH:~-2!
echo 20%%c-!MM!-%%a_!HH!-%%e-%%f.%%g
)
endlocal