2012-06-14 23 views
12

Tengo un script por lotes que muestra un archivo, y estoy tratando de garantizar que cada vez que se ejecuta el script, no se sobrescriban los archivos existentes, así que estoy tratando de poner una marca de tiempo en eso.Marca de tiempo de nombre de archivo en Windows CMD script por lotes

Actualmente tengo unas pocas cosas:

set stamp=%DATE:/=-%_%TIME::=-% 

Pero si el tiempo es 1-9   AM, se da algo así como:

13-06-2012_ instead of a full 13-06-2012_12-39-37.28 

¿Cómo puedo solucionar este problema?

Estoy utilizando Windows 7  , y la salida de echo %date% %time% en una ventana de línea de comandos es (mi formato de reloj para la 'fecha corta' está configurado para mostrar de 3 letras meses):

03-Sep-12 9:06:21.54 

Editar: He estado usando la siguiente marca de tiempo por un buen tiempo ahora, funciona bien.

set timestamp=%DATE:/=-%_%TIME::=-% 
set timestamp=%timestamp: =% 

Se produce una marca de tiempo como: 18-03-2013_13-37-43.26, mediante la sustitución de / y : en %TIME% y %DATE%, a continuación, extracción de espacio en blanco. El espacio en blanco era el problema en mi pregunta original, realmente.

Respuesta

0

Quiere el tiempo completo en DD-MM-YYYY_HH-MM-SS.TT donde TT es los ticks. La excepción lo dice todo.

9

Ver la pila   Pregunta de desbordamiento How to get current datetime on Windows command line, in a suitable format for using in a filename?.

Crear un archivo, date.bat:

@echo off 
For /f "tokens=2-4 delims=/ " %%a in ('date /t') do (set mydate=%%c-%%a-%%b) 
For /f "tokens=1-3 delims=/:/ " %%a in ('time /t') do (set mytime=%%a-%%b-%%c) 
set mytime=%mytime: =% 
echo %mydate%_%mytime% 

Run date.bat:

C:\>date.bat 
2012-06-14_12-47-PM 

ACTUALIZACIÓN:

También puede hacerlo con una línea como la siguiente:

for /f "tokens=2-8 delims=.:/ " %%a in ("%date% %time%") do set DateNtime=%%c-%%a-%%b_%%d-%%e-%%f.%%g

+1

perdón que parece devolver una fecha no válida también, tengo '-06-2012_01' – bryc

+0

He hecho una edición. Esto debería arreglarlo para que sea 2012-06-14_12-47-PM –

+2

¿Por qué no hacerlo todo en una sola línea? 'for/f" tokens = 2-8 delims =.:/"%% a in ("% date%% time% ") do set DateNtime = %% c - %% a - %% b _ %% d-% % e - %% f. %% g' Este ejemplo utiliza el reloj de 24 horas en lugar de 12 horas + AM/PM e incluye los milisegundos. Si no quiere los milisegundos, simplemente no use '%% g'. –

0
for /f "tokens=2-8 delims=.:/ " %%a in ("%date% %time: =0%") do set DateNtime=%%c-%%a-%%b_%%d-%%e-%%f.%%g 
echo %DateNtime% 

O bien, desde la línea de comandos:

for /f "tokens=2-8 delims=.:/ " %a in ("%date% %time: =0%") do echo %c-%a-%b_%d-%e-%f.%g 

EDIT: De acuerdo con las especificaciones no estándar hora/fecha de Bryce.(03-Sep-12 9:06:21.54)

@echo off 
setlocal enabledelayedexpansion 
for /f "tokens=1-7 delims=.:/- " %%a in ("%date% %time%") do (
    if "%%b"=="Jan" set MM=01 
    if "%%b"=="Feb" set MM=02 
    if "%%b"=="Mar" set MM=03 
    if "%%b"=="Apr" set MM=04 
    if "%%b"=="May" set MM=05 
    if "%%b"=="Jun" set MM=06 
    if "%%b"=="Jul" set MM=07 
    if "%%b"=="Aug" set MM=08 
    if "%%b"=="Sep" set MM=09 
    if "%%b"=="Oct" set MM=10 
    if "%%b"=="Nov" set MM=11 
    if "%%b"=="Dec" set MM=12 
    set HH=0%%d 
    set HH=!HH:~-2! 
    echo 20%%c-!MM!-%%a_!HH!-%%e-%%f.%%g 
) 
endlocal 
12

Las primeras cuatro líneas de este código le dará las variables fiables YY DD MM AAAA HH MIN SEC en XP Pro y superior, utilizando WMIC.

@echo off 
for /f "tokens=2 delims==" %%a in ('wmic OS Get localdatetime /value') do set "dt=%%a" 
set "YY=%dt:~2,2%" & set "YYYY=%dt:~0,4%" & set "MM=%dt:~4,2%" & set "DD=%dt:~6,2%" 
set "HH=%dt:~8,2%" & set "Min=%dt:~10,2%" & set "Sec=%dt:~12,2%" 

set "datestamp=%YYYY%%MM%%DD%" & set "timestamp=%HH%%Min%%Sec%" 
set "fullstamp=%YYYY%-%MM%-%DD%_%HH%-%Min%-%Sec%" 
echo datestamp: "%datestamp%" 
echo timestamp: "%timestamp%" 
echo fullstamp: "%fullstamp%" 
pause 
0

En el pasado, he utilizado un script .cmd que encontré en Internet. Odio la forma en que la localización normalmente complica las fechas. Cada vez que tienes las fechas en nombres de archivo (o en cualquier otro lugar, si me permite el atrevimiento) Calculo que los quiere en formato ISO 8601:

2015-02-19T14: 54: 51Z

u otra cosa que tiene YMDHM en ese orden, como

2015-02-19 14:54

porque fija el/la ambigüedad DMY MDY y porque es clasificable como texto.

No sé de dónde obtuve el script .cmd, pero puede haber sido http://ss64.com/nt/syntax-getdate.html, que funciona muy bien en mi YYYY-MM-DD Windows 8.1 y en una instalación vainilla M/D/YYYY de Windows 7. Ambos dan el mismo formato:

2015-02-09 04:43

2

Aquí es un script por lotes que hice para devolver una marca de tiempo. Se puede proporcionar un primer argumento opcional para ser utilizado como un delimitador de campo. Por ejemplo:

c: \ sys \ tmp> timestamp.bat
20160404_144741
c: \ sys \ tmp> timestamp.bat -
2016-04-04_14-45-25
c: \ sys \ tmp> timestamp.bat:
2016: 04: 04_14: 45: 29

@echo off 
SETLOCAL ENABLEDELAYEDEXPANSION 
:: put your desired field delimiter here. 
:: for example, setting DELIMITER to a hyphen will separate fields like so: 
:: yyyy-MM-dd_hh-mm-ss 
:: 
:: setting DELIMITER to nothing will output like so: 
:: yyyyMMdd_hhmmss 
:: 
SET DELIMITER=%1 

SET DATESTRING=%date:~-4,4%%DELIMITER%%date:~-7,2%%DELIMITER%%date:~-10,2% 
SET TIMESTRING=%TIME% 
::TRIM OFF the LAST 3 characters of TIMESTRING, which is the decimal point and hundredths of a second 
set TIMESTRING=%TIMESTRING:~0,-3% 

:: Replace colons from TIMESTRING with DELIMITER 
SET TIMESTRING=%TIMESTRING::=!DELIMITER!% 

:: if there is a preceeding space substitute with a zero 
echo %DATESTRING%_%TIMESTRING: =0% 
0

serie de Windows nombre de archivo de registro en formato 2018-02-08_14.32.06.34.log:

setlocal 
set d=%DATE:~-4%-%DATE:~4,2%-%DATE:~7,2% 
set t=%time::=.% 
set t=%t: =% 
set logfile="%d%_%t%.log" 

ping localhost -n 11>%1/%logfile% 
endlocal 
Cuestiones relacionadas