web-dev-qa-db-fra.com

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 portant le nom du fichier

 yyyy-MM-dd.log

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

Je cherche fondamentalement un équivalent de cette commande Unix:

cp source.log `date +%F`.log
75
Eoin Campbell
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 this answer , 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
94
opello

Cela a fonctionné pour moi et était une solution sûre pour les noms de fichiers (bien qu'elle génère un format MM-jj-AAAA):

C:\ set SAVESTAMP=%DATE:/=-%@%TIME::=-%
C:\ set SAVESTAMP=%SAVESTAMP: =%
C:\ set SAVESTAMP=%SAVESTAMP:,=.%.jpg
C:\ echo %SAVESTAMP%
[email protected]

La première commande prend une DATE et remplace / par -, prend TIME, remplace : par - et les combine au format DATE @ TIME. La deuxième instruction set supprime tous les espaces et la troisième set remplace , par . et ajoute l'extension .jpg.

Le code ci-dessus est utilisé dans un petit script qui extrait les images d'une caméra de sécurité IP pour un traitement ultérieur:

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

Pour Langue française (France) SEULEMENT , soyez prudent, car / apparaît dans la date:

echo %DATE%
08/09/2013

Pour notre problème de fichier journal, voici ma proposition pour Langue française UNIQUEMENT :

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%
15
Aubin

Voici une solution indépendante des paramètres régionaux (copie dans 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%

Je mets tous mes scripts .cmd dans le même dossier (% SCRIPTROOT%); tout script nécessitant des valeurs de date/heure appellera 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. Masquer le script d'analyse du temps dans son propre fichier SetDateTimeComponents.cmd est un bon moyen de masquer les détails laids et, plus important encore, d'éviter les fautes de frappe.

10
totorocat

Cela garantira que la sortie est une valeur à 2 chiffres ... vous pouvez réorganiser la sortie à votre guise et tester en commentant la section de diagnostic. Prendre plaisir!

(J'ai emprunté beaucoup de cela à d'autres forums ...)

:: ------------------ Date and Time Modifier ------------------------

@echo off
setlocal

:: THIS CODE WILL DISPLAY A 2-DIGIT TIMESTAMP FOR USE IN APPENDING FILENAMES

:: CREATE VARIABLE %TIMESTAMP%

for /f "tokens=1-8 delims=.:/-, " %%i in ('echo exit^|cmd /q /k"Prompt $D $T"') do (
   for /f "tokens=2-4 skip=1 delims=/-,()" %%a in ('echo.^|date') do (
set dow=%%i
set %%a=%%j
set %%b=%%k
set %%c=%%l
set hh=%%m
set min=%%n
set sec=%%o
set hsec=%%p
)
)

:: ensure that hour is always 2 digits

if %hh%==0 set hh=00
if %hh%==1 set hh=01
if %hh%==2 set hh=02
if %hh%==3 set hh=03
if %hh%==4 set hh=04
if %hh%==5 set hh=05
if %hh%==6 set hh=06
if %hh%==7 set hh=07
if %hh%==8 set hh=08
if %hh%==9 set hh=09


:: --------- TIME STAMP DIAGNOSTICS -------------------------

:: Un-comment these lines to test output

:: echo dayOfWeek = %dow%
:: echo year = %yy%
:: echo month = %mm%
:: echo day = %dd%
:: echo hour = %hh%
:: echo minute = %min%
:: echo second = %sec%
:: echo hundredthsSecond = %hsec%
:: echo.
:: echo Hello! 
:: echo Today is %dow%, %mm%/%dd%. 
:: echo.
:: echo. 
:: echo.
:: echo.
:: pause

:: --------- END TIME STAMP DIAGNOSTICS ----------------------

:: assign timeStamp:
:: Add the date and time parameters as necessary - " yy-mm-dd-dow-min-sec-hsec "

endlocal & set timeStamp=%yy%%mm%%dd%_%hh%-%min%-%sec%
echo %timeStamp%
6
Rick Rubino

Je l'utilise fréquemment et mets tout dans une seule commande de copie. Les copies suivantes exemple.txt comme exemple_AAAAMMJJ_HHMMSS.txt et vous pouvez bien sûr le modifier pour l'adapter à votre format préféré. Les guillemets ne sont nécessaires que s'il y a des espaces dans la spécification de fichier. Si vous souhaitez réutiliser exactement la même date/horodatage, vous devez le stocker dans une variable.

copy "{path}\example.txt" "{path}\_%date:~10,4%%date:~4,2%%date:~7,2%_%time:~0,2%%time:~3,2%%time:~6,2%.txt"
5
BeConcise

Parce que l'idée de séparer %DATE% et %TIME% et de les réduire en purée semble fragile au mieux, voici une solution de rechange utilisant un stylet PowerShell:

for /f %i in ('powershell -c "get-date -format yyyy-MM-dd--HH-mm-ss"') do @set DATETIME=%i
set LOGFILE=my-script-%DATETIME%.txt

La référence pour get-date est ici , avec les options de format pour les styles .NET et UNIX.

3
tboz203

Créez un fichier avec la date actuelle comme nom de fichier (ex. 2008-11-08.dat)

echo hello > %date%.dat    

Avec la date actuelle mais sans le "-" (ex. 20081108.dat)

echo hello > %date:-=%.dat   
2
RealHowTo

Je sais que ceci est un ancien post, mais il existe une réponse plus simple (bien que cela ne fonctionne peut-être que dans les versions les plus récentes de Windows). Utilisez simplement le paramètre/t pour les commandes DATE et TIME dos pour n’afficher que la date ou l’heure et non pour vous demander de le définir, comme ceci:

@echo off
echo Starting test batch file > testlog.txt
date /t >> testlog.txt
time /t >> testlog.txt
2
Dean

Vous pouvez simplement détecter le format local actuel et obtenir la date dans votre format, par exemple:

::for 30.10.2016 dd.MM.yyyy
if %date:~2,1%==. set d=%date:~-4%%date:~3,2%%date:~,2%
::for 10/30/2016 MM/dd/yyyy
if %date:~2,1%==/ set d=%date:~-4%%date:~,2%%date:~3,2%
::for 2016-10-30 yyyy-MM-dd
if %date:~4,1%==- set d=%date:~,4%%date:~5,2%%date:~-2%
::variable %d% have now value: 2016103 (yyyyMMdd)
set t=%time::=%
set t=%t:,=%
::variable %t% have now time without delimiters
cp source.log %d%_%t%.log
2
Adam Silenko

J'ai mis en place un petit programme en C pour imprimer l'horodatage actuel (respect de la locale, pas de mauvais caractères ...). Ensuite, j'utilise la commande FOR pour enregistrer le résultat dans une variable d'environnement:

:: Get the timestamp
for /f %%x in ('@timestamp') do set TIMESTAMP=%%x

:: Use it to generate a filename
for /r %%x in (.\processed\*) do move "%%~x" ".\archived\%%~nx-%TIMESTAMP%%%~xx"

Voici un lien:

https://github.com/HarryPehkonen/dos-timestamp

2
Harry Pehkonen

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

1) Vous pouvez télécharger GNU coreutils qui est livré avec la date GNU

2) vous pouvez utiliser VBScript , ce qui facilite la manipulation de la date sous Windows:

Set objFS = CreateObject("Scripting.FileSystemObject")
strFolder = "c:\test"
Set objFolder = objFS.GetFolder(strFolder)
current = Now
mth = Month(current)
d = Day(current)
yr = Year(current)
If Len(mth) <2 Then
    mth="0"&mth
End If
If Len(d) < 2 Then
    d = "0"&d
End If
timestamp=yr & "-" & mth &"-"& d
For Each strFile In objFolder.Files
    strFileName = strFile.Name
    If InStr(strFileName,"file_name_here") > 0 Then
        BaseName = objFS.GetBaseName(strFileName)
        Extension = objFS.GetExtensionName(strFileName)
        NewName = BaseName & "-" & timestamp & "." & Extension
        strFile.Name = NewName
    End If
Next

Exécutez le script en tant que:

c:\test> cscript /nologo myscript.vbs
1
ghostdog74

Je sais que ce fil est vieux, mais je veux juste ajouter ceci ici parce que cela m'a beaucoup aidé à essayer de comprendre tout cela et de le nettoyer. La bonne chose à ce sujet est que vous pouvez le mettre en boucle pour un fichier de commandes qui est toujours en cours d'exécution. Journal de disponibilité du serveur ou quelque chose du genre. C'est ce que je l'utilise de toute façon. J'espère que cela aidera quelqu'un un jour.

@setlocal enableextensions enabledelayedexpansion
@echo off

call :timestamp freshtime freshdate
echo %freshdate% - %freshtime% - Some data >> "%freshdate - Somelog.log"

:timestamp
set hour=%time:~0,2%
if "%hour:~0,1%" == " " set hour=0%hour:~1,1%
set min=%time:~3,2%
if "%min:~0,1%" == " " set min=0%min:~1,1%
set secs=%time:~6,2%
if "%secs:~0,1%" == " " set secs=0%secs:~1,1%
set FreshTime=%hour%:%min%:%secs%

set year=%date:~-4%
set month=%date:~4,2%
if "%month:~0,1%" == " " set month=0%month:~1,1%
set day=%date:~7,2%
if "%day:~0,1%" == " " set day=0%day:~1,1%
set FreshDate=%month%.%day%.%year%
1
Haxslie

Pour les gros fichiers Zip à déployer, j'utilise un quart d'heure. Personne d'autre sur cette page ne l'avait mentionné auparavant, alors je vais mettre mon petit script ici:

set /a "quarter_hours=%time:~0,2%*4 + %time:~3,2% / 15"
set "Zip_file=release_%DATE:~-4%.%DATE:~4,2%.%DATE:~7,2%.%quarter_hours%.Zip"

Il n’a pas encore réglé le quart horaire des patins de minuit à 5 heures du matin, mais il permet tout de même d’avoir une sortie estampillée plusieurs fois par jour avec peu de collisions.

J'espère que cela pourra aider.

0
phyatt

Cela fonctionne bien avec (mes) paramètres régionaux allemands, il devrait être possible de l'adapter à vos besoins ...

forfiles /p *PATH* /m *filepattern* /c "cmd /c ren @file 
%DATE:~6,4%%DATE:~3,2%%DATE:~0,2%_@file"
0
Martin