web-dev-qa-db-fra.com

Générer un nom de fichier unique avec un horodatage dans un script batch

Dans mon fichier .bat, je souhaite générer un nom unique pour les fichiers/répertoires en fonction de la date et de l'heure.

par exemple.

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

Le problème est que %TIME% ne le fera pas car il contient des caractères non autorisés dans le nom du fichier (par exemple :).

Y at-il quelque chose comme tr dans les fichiers de commandes?

D'autres idées sur la façon de résoudre ce problème (qui ne nécessitent pas d'utilitaires de ligne de commande supplémentaires en dehors de l'interpréteur de lot)?

36
Assaf Lavie

EDIT: Une meilleure méthode consiste à utiliser une chaîne de date/heure ayant un format défini et immuable, au lieu d’utiliser celles définies par les paramètres régionaux à partir de %date% et %time%. Vous pouvez utiliser ce qui suit pour l'obtenir:

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

Cela donne quelque chose comme 20120730203126.530000+120 et vous pouvez l'utiliser pour construire vos noms de fichiers.


(Ancienne réponse ci-dessous)

Vous pouvez simplement remplacer le caractère incriminé par 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 le signe égal, alors str1 est simplement supprimé.

Dans votre cas spécifique, je pense que vous voudriez 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 méthode plus brute-force au cas où vous ne savez pas si les deux points sont utilisés (mais l'ordre du temps serait le même):

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

Cependant, toutes les choses précédentes supposent que vous utilisez le format de date standard ISO 8601, i. e. 2009-10-29. Je suppose que c'est tout simplement normal, mais certaines personnes utilisent d'autres formats, alors faites attention. Mais puisque vous n'avez pas demandé de date, je supposais que vous n'y aviez pas rencontré de problème.

41
Joey

Suivi des réponses de @ Joey et @Kees pour les rendre immédiatement 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 http://stackoverflow.com/q/1642677/1143274
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%

Exemple de sortie:

2014-10-21_16-28-52
17
Evgeni Sergeev

J'utilise ceci 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

Je devais ajouter la ligne

set mytime=%mytime: =0%

comme j’avais le même problème où un blanc était entré avant 10 heures, je reçois maintenant 09 au lieu de 9. Je réutilise également les variables% mydate% et% mytime% pour d’autres fichiers que je crée avec ce script, afin qu’ils aient tous le même horodatage.

3
Ben

Cette routine, qui ne contient en réalité qu’une ligne, fonctionne sur tous les systèmes configurés avec n’importe quel format de date ou d’heure.
La sortie de la ligne 1 est au format 20140725095527.710000 + 120

Le format de date/heure dont vous avez besoin est déterminé à la ligne 2. Vous pouvez le formater comme vous le souhaitez.
Ajoutez simplement la variable DateTime résultante à votre nom de fichier, par exemple. Nom de fichier_% 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
Kees

J'ai créé cette fonction universelle qui fonctionnera dans tous les environnements où le format de date peut être différent.

echo off
if not exist "C:\SWLOG\" mkdir C:\SWLOG
cd C:\SWLOG\
cmd /c "powershell get-date -format ^"{yyyyMMdd-HHmmss}^""> result.txt
REM echo %time% > result.txt
type result.txt > result1.txt
set /p filename=<result1.txt
echo %filename%
del C:\SWLOG\result.txt
del C:\SWLOG\result1.txt
2
Ariful Huq

Pour que le code de l'exemple précédent fonctionne, je devais m'ajuster légèrement. Je suppose que c'est parce que mon PC utilise un format de date britannique. Pour revenir "2014-04-19" dans ma date il me fallait:

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

Ci-dessous, j'ai collé mon script total 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 

J'espère que cela t'aides!

1
Stewart

Si vous pouvez garantir qu'une version spécifique de Python est installée sur l'ordinateur et qu'elle est accessible dans la variable PATH du système, 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%

Ceci placera la représentation locale actuelle de ISO-8601 (ish) dans une variable %TIMESTAMP% et le renverra, comme suit:

2017-05-25T14:54:37

J'ai mis replace(':', '-') après la isoformat() pour que la chaîne résultante puisse ê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
Colin Basnett