Filename timestamp sous Windows CMD batch script
j'ai un script batch qui sort un fichier, et j'essaye de m'assurer que chaque fois que le script est exécuté, aucun fichier existant n'est écrasé, donc j'essaye de mettre une estampille temporelle dessus.
Actuellement j'ai ceci:
set stamp=%DATE:/=-%_%TIME::=-%
mais si l'heure est 1-9 AM, il 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 'short date' est set pour afficher 3-lettre mois):
03-Sep-12 9:06:21.54
Edit: j'utilise le timestamp suivant depuis un bon moment maintenant, fonctionne bien.
set timestamp=%DATE:/=-%_%TIME::=-%
set timestamp=%timestamp: =%
Il a produit un timestamp de la forme: 18-03-2013_13-37-43.26
, en remplaçant /
et :
%TIME%
et %DATE%
, puis décapage de l'espace blanc. L'espace blanc était le problème dans ma question originale, vraiment.
8 réponses
Les quatre premières lignes de ce code vous donneront des variables fiables YYJ MM YYYY HH Min Sec dans XP Pro et plus, en utilisant 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 Débordement de Pile question comment obtenir le datetime actuel sur la ligne de commande Windows, dans un format approprié pour l'utilisation dans un nom de fichier?.
Créer 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écuter date.bat
:
C:\>date.bat
2012-06-14_12-47-PM
mise à 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 de fournée que j'ai fait pour retourner un timestamp. Un premier argument optionnel peut être fourni pour être utilisé comme délimiteur de champ. Par exemple:
c:\sys\tmp > timestamp.chauve-souris
20160404_144741
c:\sys\tmp > timestamp.chauve-souris -
2016-04-04_14-45-25
c:\sys\tmp > timestamp.chauve-souris :
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%
Il veut tout le temps dans DD-MM-YYYY_HH-MM-SS.TT
où TT est la tique. L'exception, dit-il.
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: selon bryce non standard specs heure/date. (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
merci à une réponse à Débordement de Pile quesion Création d'un nom de fichier comme un timestamp dans un lot de travail, j'ai trouvé que c'était un espace qui terminait le nom du fichier.
Dans le passé, j'ai utilisé un .cmd script que j'ai trouvé sur Internet. Je déteste la façon dont la localisation gâche les rendez-vous. Chaque fois que vous avez des dates dans les noms de fichiers (ou n'importe où ailleurs, si je peux être si gras) je me figure que vous les voulez dans le 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 parce qu'il est texte.
Je ne sais pas où j'ai eu ça .cmd script, mais il peut avoir été http://ss64.com/nt/syntax-getdate.html, qui fonctionne à merveille sur mon AAAA-MM-JJ Windows 8.1 et sur un M/D/YYYY vanille installation de Windows 7. Les deux donnent le même format:
2015-02-09 04: 43
nom du fichier Windows batch log en 2018-02-08_14.32.06.34.format du journal:
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