2009-10-29 23 views
33

En mi archivo .bat, quiero generar un nombre único para archivos/directorios en función de la fecha y hora.Generar un nombre de archivo único con marca de tiempo en la secuencia de comandos por lotes

p. Ej.

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

El problema es que% TIEMPO% no lo hará porque contiene caracteres que son ilegales en nombre de archivo (por ejemplo, ':').

¿Hay algo así como 'tr' en los archivos por lotes?

¿Alguna otra idea sobre cómo solucionar esto (que no requiere utilidades de línea de comandos adicionales aparte del intérprete de proceso por lotes)?

Respuesta

41

EDITAR: Una forma mejor de hacerlo es tomar una cadena de fecha y hora que tiene un formato definido e inmutable en lugar de utilizar las definidas por el entorno local de %date% y %time%. Se puede utilizar el siguiente conseguirlo:

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

Se produce algo así como 20120730203126.530000+120 y se puede utilizar para construir que los nombres de archivo.


(vieja respuesta más abajo)

Usted puede simplemente reemplazar el carácter infractor con una cadena vacía:

echo %time::=% 

La sintaxis %var:str1=str2% toma la variable de entorno (o pseudo-variable en caso de %TIME% y reemplaza str1 por str2. Si nada sigue después del signo igual entonces str1 simplemente se elimina.

En su caso concreto creo que desearía lo siguiente:

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

Una forma más de fuerza bruta en caso de que no sabe si se utilizan dos puntos (pero el orden del tiempo serían el mismo):

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

Sin embargo, todas las cosas anteriores asumen que usted usa el formato de fecha ISO 8601 estándar, i. mi. 2009-10-29. Supongo que esto es simplemente normal, pero algunas personas usan otros formatos, así que ten cuidado. Pero como no preguntaste sobre la fecha en la que asumía, no tuviste ningún problema allí.

+1

Maldita sea, es un truco elegante. :) genial –

+0

No es tan poderoso como 'tr', quizás, pero suficiente para muchas necesidades. – Joey

+0

% tiempo: ~ 0,2% -% tiempo: ~ 3,2% -% tiempo: ~ 6,2% crea una cadena con espacios en blanco antes de las 10:00 AM! – mcbainpc

3

Utilizo esto para crear un nombre de archivo único para la ejecución del archivo por lotes.

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 

he tenido que añadir la línea

set mytime=%mytime: =0% 

porque tenía el mismo problema en el que se está introduciendo un espacio en blanco antes de las 10 de la mañana, ahora tengo 09 en lugar de 9. También reutilizar el mydate% % y% mytime% variable para otros archivos que creo con este script para que todos tengan el mismo sello de fecha y hora.

1

Para que el código del ejemplo anterior funcionara, necesitaba ajustarlo ligeramente. Supongo que esto se debe a que mi PC usa un formato de fecha del Reino Unido.Para volver "19/04/2014" en mydate que necesitaba:

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

A continuación he pegado mi guión totales, e incluyó un ejemplo de cómo utilizar el nombre del archivo

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 

Esperanza esta ayuda!

2

Esta rutina, en realidad solo una línea, funciona en todos los sistemas configurados en cualquier formato de fecha u hora.
La salida de la línea 1 está en formato 20140725095527.710000 + 120

El formato de fecha/hora real que necesita se determina en la línea 2. Puede formatearlo como lo desee.
Simplemente agregue la variable DateTime resultante a su nombre de archivo, es decir. Fichero por% 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 
14

seguimiento a @ de respuestas @Kees' Joey y para que sean inmediatamente utilizable.

En la línea de comandos:

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% 

En un archivo 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% 

Ejemplo de salida:

2014-10-21_16-28-52 
0

Si puede garantía que la máquina tiene una específica versión de Python instalada en él y accesible en el 01 del sistema, puede utilizar esta solución:

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% 

Esto hará que la representación actual ISO-8601 (más o menos) fecha local en una variable %TIMESTAMP% y el eco a cabo, de este modo:

2017-05-25T14:54:37 

He puesto replace(':', '-') después del isoformat() para que la cadena resultante se pueda utilizar en un nombre de archivo o directorio, ya que : es un carácter prohibido en el sistema de archivos de Windows.

Cuestiones relacionadas