Générer un nom de fichier unique avec timestamp dans le script de traitement par lots

Dans mon .fichier bat je veux générer un nom unique pour les fichiers/répertoires basés sur la date-heure.

p.ex.

Build-2009-10-29-10-59-00

le problème est que %TIME% ne va pas parce qu'il contient des caractères qui sont illégaux dans le nom de fichier (par ex. : ).

y a-t-il quelque chose comme tr dans les fichiers de lots?

toutes autres idées cela (qui ne nécessite pas d'Utilités supplémentaires en ligne de commande en dehors de l'interpréteur batch)?

35
demandé sur Nae 2009-10-29 13:09:16

6 réponses

EDIT: une meilleure façon de faire ceci est de prendre une chaîne date/heure qui a un format défini et immuable au lieu d'utiliser ceux définis par les locales de %date% et %time% . Vous pouvez utiliser ce qui suit:

for /f "skip=1" %%x in ('wmic os get localdatetime') do if not defined mydate set mydate=%%x

il donne quelque chose comme 20120730203126.530000+120 et vous pouvez utiliser cela pour construire vos noms de fichier.


(ancienne réponse ci-dessous)

vous pouvez simplement remplacer le caractère offensant avec une chaîne vide:

echo %time::=%

la syntaxe %var:str1=str2% prend la variable d'environnement (ou pseudo-variable dans le cas de %TIME% et remplace str1 par str2 . Si rien ne suit après le signe égal, alors str1 est tout simplement supprimé.

dans votre cas particulier, je pense que vous voulez ce qui suit:

rem cut off fractional seconds
set t=%time:~0,8%
rem replace colons with dashes
set t=%t::=-%
set FileName=Build-%date%-%t%

une façon plus brutale au cas où vous ne savez pas si les colons sont utilisés (mais l'ordre de l'époque serait le même):

set FileName=Build-%date%-%time:~0,2%-%time:~3,2%-%time:~6,2%

toutes les choses précédentes, cependant, supposons que vous utilisez le format de date standard ISO 8601, I. E. 2009-10-29. Je dirais que c'est tout simplement normal, mais certaines personnes utilisent d'autres formats, alors faites attention. Mais puisque tu n'as pas demandé pour la date, je pensais que tu n'avais pas de problème là-bas.

41
répondu Joey 2012-07-30 18:34:03

suit les réponses de @Joey et de @Kees pour les rendre instantanément utilisables.

sur la ligne de commande:

FOR /f %a IN ('WMIC OS GET LocalDateTime ^| FIND "."') DO SET DTS=%a
SET DateTime=%DTS:~0,4%-%DTS:~4,2%-%DTS:~6,2%_%DTS:~8,2%-%DTS:~10,2%-%DTS:~12,2%
echo %DateTime%

dans un fichier BAT:

@echo off
REM See /q/generate-unique-file-name-with-timestamp-in-batch-script-33460/"."') DO SET DTS=%%a
SET DateTime=%DTS:~0,4%-%DTS:~4,2%-%DTS:~6,2%_%DTS:~8,2%-%DTS:~10,2%-%DTS:~12,2%
echo %DateTime%

exemple de sortie:

2014-10-21_16-28-52
16
répondu Evgeni Sergeev 2014-10-21 05:29:34

je l'utiliser pour créer un nom de fichier unique pour l'exécution du fichier de commandes.

REM ****Set up Logging ****
For /f "tokens=2-4 delims=/ " %%a in ('date /t') do (set mydate=%%c-%%a-%%b)
For /f "tokens=1-2 delims=/:" %%a in ("%TIME%") do (set mytime=%%a%%b)
set mytime=%mytime: =0%

set Logname="PCCU_%mydate%_%mytime%.log"
Echo.  >>%Logname% 2>>&1
Echo.=================== >>%Logname% 2>>&1

j'ai dû ajouter la ligne

set mytime=%mytime: =0%

parce que j'ai eu le même problème où un blanc était entré avant 10 heures, maintenant j'ai 09 au lieu de 9. Je réutilise également la variable %mydate% et %mytime% pour les autres fichiers que je crée avec ce script afin qu'ils aient tous la même date de date.

3
répondu Ben 2013-11-08 16:29:04

cette routine, en fait une seule ligne, fonctionne sur chaque système réglé à n'importe quelle date ou format d'heure.

La sortie de la ligne 1 est au format 20140725095527.710000+120

le format date/heure réel dont vous avez besoin est déterminé à la ligne 2. Vous pouvez le formater comme vous voulez.

Il suffit d'ajouter la variable DateTime résultante à votre nom de fichier ie. Filename_%DateTime%.log

::=======================================================================
::== CREATE UNIQUE DateTime STRING IN FORMAT YYYYMMDD-HHMMSS
::=======================================================================
FOR /f %%a IN ('WMIC OS GET LocalDateTime ^| FIND "."') DO SET DTS=%%a

SET DateTime=%DTS:~0,8%-%DTS:~8,6% | REM OUTPUT = 20140725-095527
2
répondu Kees 2014-07-25 08:17:00

pour faire fonctionner le code de l'exemple précédent, il fallait que je m'ajuste légèrement. Je présume que c'est parce que mon PC utilise un format de date britannique. Pour revenir "2014-04-19" dans mydate j'avais besoin de:

For /f "tokens=1-3 delims=/ " %%a in ('date /t') do (set mydate=%%c-%%b-%%a)

ci-dessous, j'ai collé tout mon script, et inclus un exemple d'utilisation du nom de fichier

For /f "tokens=1-3 delims=/ " %%a in ('date /t') do (set mydate=%%c-%%b-%%a)
For /f "tokens=1-2 delims=/:" %%a in ("%TIME%") do (set mytime=%%a%%b)
set mytime=%mytime: =0%

set Logname="c:\temp\LogFiles\MyLogFile_%mydate%_%mytime%.log"
Robocopy  \sourceserver\Music H:\MyBackups\Music /MIR /FFT /Z /XA:H /W:5 /np /fp /dcopy:T /unilog:%Logname% /tee 

Espérons que cette aide!

1
répondu Stewart 2014-04-19 09:42:44

si vous pouvez garantir que la machine dispose d'une version spécifique de Python installée sur elle et accessible dans le système PATH , vous pouvez utiliser cette solution:

FOR /F "tokens=* USEBACKQ" %%F IN (`python -c "import datetime; print 
datetime.datetime.now().replace(microsecond=0).isoformat().replace(':', '-')"`) DO (
SET TIMESTAMP=%%F
)
ECHO %TIMESTAMP%

cela placera l'actuelle représentation de date locale ISO-8601 (ish) dans une variable %TIMESTAMP% et l'afficher comme suit:

2017-05-25T14:54:37

j'ai mis replace(':', '-') après le isoformat() , de sorte que le la chaîne résultante peut être utilisée dans un nom de fichier ou un répertoire, puisque : est un caractère interdit dans le système de fichiers Windows.

0
répondu Colin Basnett 2017-05-25 21:56:28