Línea de comandos de Windows: cree un archivo con la fecha actual en su nombre

19

Estoy tratando de crear un archivo zip a partir de un script por lotes. Necesito que se nombre como archive_.zip

Desafortunadamente, esto no funciona en sistemas con la fecha formateada como y / m / d debido a las barras:

zip some_options "archive_%DATE%.zip"

La %DATE%variable se expande a algo como

Mon 09/28/2009

Tengo acceso al paquete gnuwin32, por lo que podría usar, por ejemplo, sedpara reemplazar espacios y barras por guiones. El problema es, ¿cómo usaría la salida de sedpara crear el nombre de archivo del archivo zip?

En Unix (bash), uno puede usar comillas inversas para evaluar un comando en el lugar y usar su salida en otro comando, algo como:

zip [...] archive_`echo %DATE% | sed -e s/.../.../`.zip

¿Hay algo similar disponible en Windows?

¿O tal vez hay una manera de establecer una variable para el valor devuelto sedy usarla para construir el nombre del archivo?

Cristi Diaconescu
fuente

Respuestas:

27

Puede reemplazar símbolos en variables usando:

set _date=%DATE:/=-%
Christopher
fuente
1
Este es un buen truco!
Cristi Diaconescu
PD: ¿Existe una forma de una sola línea para deshacerse de los espacios u otros personajes desagradables también? (en lugar de tener una 3a ... enésima variable temporal para cada personaje a reemplazar)
Cristi Diaconescu
No lo siento. Parece que no hay tal cosa. Tienes que recurrir a la sintaxis for para hacer eso. NB: Esta es una buena referencia para la programación por lotes: robvanderwoude.com/batchfiles.php
Christopher
55
esto es incluso más rápido que %date:~-10,2%-%date:~-7,2%-%date:~-4,4% :!
Jess Stone
¡Cómo nadie ha hecho +1 en tu respuesta, Jess Stone! +1 de mi parte !!!
Arvo Bowen
5

Yo siempre uso:

For /f "tokens=1,2,3,4,5 delims=/. " %%a in ('date/T') do set CDate=%%a%%b%%c%%d

Entonces CDate será Sat02182012. Si desea hacerlo más ordenable, configure CDate en %% d - %% b - %% c para que sea 2012-02-18

For /f "tokens=1,2 delims=:" %%f in ('time /t') do set CTime=%%f%%g

Para hacer la carpeta de fecha / hora / archivo amigable.

vago
fuente
4

He publicado una respuesta a una pregunta muy similar aquí . La división de la fecha en los campos se realiza en 1 línea, en lugar de varias líneas en la respuesta de harrymc.

La parte interesante es:

@echo off
for /F "tokens=2-4 delims=/ " %%i in ('date /t') do set yyyymmdd=%%k%%j%%i
echo Date: %yyyymmdd%

Y la advertencia sigue siendo relevante:

Advertencia : el formato de la fecha (aaaammdd = k %% %% j %% i) depende de la configuración regional. Debido a que uso el formato de fecha francés (dd / mm / aaaa), tengo que usar "%% k %% j %% i" como formato (%% i = día, %% j = mes, %% j = año).

Si su configuración regional está establecida en estilo estadounidense (mm / dd / aaaa), debe usar "%% k %% i %% j" (%% i = mes, %% j = día, %% j = año) .

Snark
fuente
3
zip some_options "archive_%date:/=-%.zip"

el /=-sustituye el /con un signo menos.

Theo
fuente
2

Este código bastante horrible debería hacer algo como lo que quieres

move "Filename.txt" "Filename%date:~6,4%%date:~3,2%%date:~0,2%_%Time:~0,2%%Time:~3,2%%Time:~6,2%.txt"

Si cambia el nombre del archivo adecuadamente.

Columna
fuente
1
¿Te importaría explicar la monstruosidad? :)
Cristi Diaconescu
Básicamente, está cortando bits de la fecha y alimentándolo en el medio del nombre del archivo, puede probarlo haciendo eco y luego partes del horror en la línea de comando, por lo que si hace eco% date: ~ 6,4% le da el año. Solo está subcadenando la fecha y la hora.
Col
Interesante. No muy portátil por desgracia ...
Cristi Diaconescu
Desafortunadamente, el problema con el uso de subcadenas es que se basa en un cierto formato de fecha y explota cuando es diferente. echo %date:~6,4%%date:~3,2%%date:~0,2%regresa 9-289-20a mi máquina ya que tengo la fecha establecida para usar aaaa-MM-dd (así que hoy es 28-09-2009).
Joshua
Es cierto, solo uso esta solución en una máquina, por lo que no es un gran problema.
Col
2

Dado que su pregunta está etiquetada como Windows, encontré esta solución que funciona en los viejos y buenos archivos .bat:
"Windows Batch File (.bat) para obtener la fecha actual en formato MMDDYYYY" ,
y probablemente pueda adaptarse a su caso:

echo en
el lote de fechas rápidas de @REM Seamonkey (formato
MMDDYYYY ) @REM Configura la variable de fecha
@REM Primero analiza el mes, día y año en formatos mm, dd, aaaa y luego se combina para ser MMDDYYYY

FOR / F “TOKENS = 1 * DELIMS =” %% A IN ('DATE / T') DO SET CDATE = %% B
FOR / F “TOKENS = 1,2 eol = / DELIMS = /” %% A IN ( 'DATE / T') DO SET mm = %% B
FOR / F “TOKENS = 1,2 DELIMS = / eol = /” %% A IN ('echo% CDATE%') DO SET dd = %% B
FOR / F “TOKENS = 2,3 DELIMS = /” %% A IN ('echo% CDATE%') DO SET aaaa = %% Bv vSET fecha =% mm %% dd %% aaaa%

esto no hace más que configurar la variable% date para que sea la fecha de hoy en formato MMDDYYYY para que pueda llamarse más adelante en el script.

Editar
Encontrado una mejor sintaxis. Dado que mi fecha es hoy "Lun 28/09/2009":
establecer día =% Fecha: ~ 0,2%
establecer mes =% Fecha: ~ 7,2%
establecer año =% Fecha: ~ 10,4%

harrymc
fuente
2

versión cmd.exe pura en combinación con gnuwin32-'date ':

%> for /F "usebackq" %d in ( `date.exe +"%y%m%d"` ) do zip archive_%d.zip <folder>
akira
fuente
¡Entonces puede hacer sustituciones en el lugar! Si me preguntas, el comando 'para' tiene una sintaxis extraña ...
Cristi Diaconescu
no dije que no podía :) todo el asunto del 'cmd' es una locura de todos modos, quien sea que haya diseñado eso fue una especie de mal sueño. el cmd 'for' en realidad crea líneas (también conocido como 'desenrolla' el 'bucle') en la primera pasada y luego ejecuta el script tan 'creado'.
akira
1

¿Qué pasa con el uso de cscript + vbasic:

WScript.shell.run "zip archive_" & DatePart("yyyy", Now) & "_" & DatePart("m", Now) & "_" & DatePart("d", Now) & ".zip " & WScript.arguments(0)

llámalo a través de

cscript /nologo zip_it.vbs
akira
fuente
1

Para / f "tokens = 1,2,3,4,5 delims = /." %% a in ('date / T') establezca CDate = %% d - %% b - %% c

@echo data =% CDate%

Esto es en el año-mes-día que es más común ahora días


fuente
1

Es probable que cualquier solución que use cualquiera de %DATE%los resultados date /tse rompa si el usuario ha modificado su configuración regional. Por ejemplo, configuré mi formato de "fecha corta" "yyyy-MM-dd", así que tengo %DATE%igual a "2012-02-18", y date /tproduce el mismo resultado. (Esto es para Windows 7; supongo que es lo mismo para versiones anteriores de Windows).

Cree un archivo por lotes y luego ejecútelo.

Como tiene datedisponible el comando GNU , puede hacer algo como esto:

C:\path\to\gnu\date "+zip some_options archive_%Y-%m-%d.zip" > tmp.bat
call .\tmp.bat

tmp.bat contendrá algo como:

zip some_options archive_2012-02-18.zip

Tenga en cuenta que esto crea tmp.baten el directorio actual, lo que podría ser un problema; podría ser mejor crear %TEMP%\tmp.bat. Tampoco eliminé el archivo después; Eso es bastante fácil de hacer.

date +FORMATle permite especificar el formato de salida del datecomando, similar a una printfcadena de formato; Consulte la documentación de la fecha de Coreutils para más detalles. El formato puede incluir texto arbitrario, por lo que en este caso ni siquiera necesita usarlo sed.

Keith Thompson
fuente
1

Supongo que si juntas todos los elementos, obtienes algo que funciona para ti. Esto está en un sistema Windows 2003 para darme una instantánea de los procesos en ejecución en respuesta a un disparador del monitor de rendimiento:

@echo off
For /f "tokens=1,2,3,4,5 delims=/. " %%i in ('date /t') do set CDate=%%k%%j%%i
For /f "tokens=1,2 delims=:" %%f in ('time /t') do set CTime=%%f%%g
tasklist /fo table >tasklist%CDate%%CTime%.txt

El archivo de salida se nombra en una cadena sin delimitadores.

Anton Liebscher
fuente
0
zip [...] archive_`echo %DATE% | tr / -`.zip

Deberia trabajar.

Por otro lado, tal vez tenga un datecomando disponible (no conozco Windows). En caso afirmativo, solo haz:

zip [...] archive_`date +'%Y-%m-%d'`.zip

fuente
El truco de backtick no funciona en cmd.exe. Y el comando 'fecha' de Windows no puede manejar el formato :(
Cristi Diaconescu
-1

no estoy seguro si te conviene, pero mi código es

@ECHO OFF
set ldt=%date% %time%
echo %ldt%>> logs.txt
Kelly
fuente
El OP quiere un archivo con la fecha actual en el nombre del archivo , no en el contenido
Jan Doggen