101 votes

Création d'un nom de fichier en tant qu'horodatage dans un travail par lots

Nous avons un travail par lots qui s'exécute tous les jours et copie un fichier dans un dossier de collecte. Je veux aussi prendre une copie de ce fichier et le déposer dans un dossier d’archive avec le nom du fichier

  yyyy-MM-dd.log
 

Quelle est la façon la plus simple de procéder dans un travail par lots DOS?

Je cherche fondamentalement un équivalent de cette commande Unix:

 cp source.log `date +%F`.log
 

120voto

opello Points 1497
 CP source.log %DATE:~-4%-%DATE:~4,2%-%DATE:~7,2%.log
 

Mais cela dépend des paramètres régionaux. Je ne sais pas si %DATE% est localisé ou dépend du format spécifié pour la date courte dans Windows.

Voici un moyen indépendant de la localisation pour extraire la date actuelle de cette réponse , mais cela dépend de WMIC et FOR /F :

 FOR /F %%A IN ('WMIC OS GET LocalDateTime ^| FINDSTR \.') DO @SET B=%%A
CP source.log %B:~0,4%-%B:~4,2%-%B:~6,2%.log
 

53voto

Daniel Sokolowski Points 2207

Paramètres régionaux indépendants et le nom de fichier solution de sécurité:

C:\ set SAVESTAMP=%DATE:/=-%@%TIME::=-%
C:\ set SAVESTAMP=%SAVESTAMP: =%.jpg
C:\ echo %SAVESTAMP%
11-04-2012@20-52-42.79.jpg

La première commande prend une DATE et remplace / avec -, prend le TEMPS et remplace : avec - et regroupe à ce JOUR@format de l'HEURE. La deuxième instruction set supprime tous les espaces et ajoute .jpg extension.

Le code ci-dessus est utilisé dans un petit script qui extrait des images à partir d'une sécurité d'Appareil-photo d'IP pour la suite du traitement:

:while
set SAVESTAMP=%DATE:/=-%@%TIME::=-%.jpg
set SAVESTAMP=%SAVESTAMP: =%
wget-1.10.2.exe --tries=0 -O %SAVESTAMP% http://admin:<password>@<ip address>:<port>/snapshot.cgi
timeout 1
GOTO while

18voto

Aubin Points 6990

Pour les utilisateurs français, soyez prudent car / apparaissent dans la date:

 echo %DATE%
08/09/2013
 

Pour notre problème de fichier journal, voici ma proposition:

 SETLOCAL
set LOGFILE_DATE=%DATE:~6,4%.%DATE:~3,2%.%DATE:~0,2%
set LOGFILE_TIME=%TIME:~0,2%.%TIME:~3,2%
set LOGFILE=log-%LOGFILE_DATE%-%LOGFILE_TIME%.txt
rem log-2014.05.19-22.18.txt
command > %LOGFILE%
 

10voto

totorocat Points 301

Ici est un lieu indépendant de la solution (copie d'un fichier nommé SetDateTimeComponents.cmd):

@echo off
REM This script taken from the following URL:
REM http://www.winnetmag.com/windowsscripting/article/articleid/9177/windowsscripting_9177.html

REM Create the date and time elements.
for /f "tokens=1-7 delims=:/-, " %%i in ('echo exit^|cmd /q /k"prompt $d $t"') do (
   for /f "tokens=2-4 delims=/-,() skip=1" %%a in ('echo.^|date') do (
      set dow=%%i
      set %%a=%%j
      set %%b=%%k
      set %%c=%%l
      set hh=%%m
      set min=%%n
      set ss=%%o
   )
)

REM Let's see the result.
echo %dow% %yy%-%mm%-%dd% @ %hh%:%min%:%ss%

J'ai mis tous mes .cmd scripts dans le même dossier (%SCRIPTROOT%); aucun script, qui doit les valeurs date/heure d'appel seront SetDateTimeComponents.cmd comme dans l'exemple suivant:

setlocal

@echo Initializing...
set SCRIPTROOT=%~dp0
set ERRLOG=C:\Oopsies.err

:: Log start time
call "%SCRIPTROOT%\SetDateTimeComponents.cmd" >nul
@echo === %dow% %yy%-%mm%-%dd% @ %hh%:%min%:%ss% : Start === >> %ERRLOG%

:: Perform some long running action and log errors to ERRLOG.

:: Log end time
call "%SCRIPTROOT%\SetDateTimeComponents.cmd" >nul
@echo === %dow% %yy%-%mm%-%dd% @ %hh%:%min%:%ss% : End === >> %ERRLOG%

Comme le montre l'exemple, vous pouvez appeler SetDateTimeComponents.cmd chaque fois que vous devez mettre à jour les valeurs de date/heure. Cacher le temps d'analyse de script dans son propre SetDateTimeComponents.fichier cmd est une belle façon de cacher le vilain détails, et, plus important encore, éviter les fautes de frappe.

2voto

Secko Points 2054

Peut-être que cela peut aider:

 echo off
@prompt set date=$d$_ set time=$t$h$h$h
echo some log >> %date% %time%.log
exit
 

ou

 echo off
set v=%date%.log
echo some log >> %v%
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X