web-dev-qa-db-fra.com

Horodatage du nom de fichier dans le script de lot Windows CMD

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.

17
bryc

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.

0
bryc

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
15
foxidrive

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

10
Nicholas DiPiazza

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%
2
kapu

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
1
beloblotskiy

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

0
Mathieu K.

Il veut le temps complet dans DD-MM-YYYY_HH-MM-SS.TT où TT est la graduation. L'exception dit tout.

0
Cole Johnson
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
0
James K