Linha de comando do Windows: crie um arquivo com a data atual em seu nome

19

Estou tentando criar um arquivo zip de um script em lote. Eu preciso que ele seja chamado como archive_.zip

Infelizmente, isso não funciona em sistemas com a data formatada como y / m / d por causa das barras:

zip some_options "archive_%DATE%.zip"

A variável %DATE% se expande para algo como

Mon 09/28/2009

Eu tenho acesso ao pacote gnuwin32, então eu poderia usar, digamos, sed para substituir espaços e barras por traços. O problema é, como eu usaria a saída de sed para criar o nome do arquivo zip?

No Unix (bash), pode-se usar aspas para avaliar no local um comando e usar sua saída em outro comando, algo como:

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

Existe algo semelhante disponível no Windows?

Ou talvez haja uma maneira de definir uma variável com o valor retornado de sed e usá-la para construir o nome do arquivo?

    
por Cristi Diaconescu 28.09.2009 / 13:31

13 respostas

27

Você pode substituir símbolos em variáveis usando:

set _date=%DATE:/=-%
    
por 28.09.2009 / 13:39
5

Eu sempre uso:

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

Em seguida, o CDate será Sat02182012. Se você quiser torná-lo mais classificável, configure o CDate para %% d - %% b - %% c então será 2012-02-18

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

Para tornar a data e a hora compatíveis com pastas / arquivos.

    
por 28.09.2009 / 14:49
4

Eu postei uma resposta para uma pergunta muito semelhante aqui . A divisão da data nos campos é feita em 1 linha, em vez de várias linhas na resposta de harrymc.

A parte interessante é:

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

E o aviso ainda é relevante:

Warning: the format of the date (yyyymmdd=%%k%%j%%i) depends on your regional settings. Because I use the French date format (dd/mm/yyyy), I have to use "%%k%%j%%i" as the format (%%i = day, %%j = month, %%j = year).

If your regional settings are set to US style (mm/dd/yyyy), you should use "%%k%%i%%j" (%%i = month, %%j = day, %%j = year).

    
por 28.09.2009 / 14:25
3
zip some_options "archive_%date:/=-%.zip"

o /=- substitui o / por um sinal de menos.

    
por 18.02.2013 / 11:32
2

Esse código horrível deve fazer algo parecido com o que você quer

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

Se você alterar o nome do arquivo adequadamente.

    
por 28.09.2009 / 13:37
2

Como sua pergunta é marcada como Windows, eu encontrei essa solução que funciona nos arquivos .bat antigos: " Arquivo de lote do Windows (.bat) para obter a data atual no formato MMDDAAAY ", e provavelmente ser adaptado ao seu caso:

echo on
@REM Seamonkey’s quick date batch (MMDDYYYY format)
@REM Setups %date variable
@REM First parses month, day, and year into mm , dd, yyyy formats and then combines to be 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 yyyy=%%Bv vSET date=%mm%%dd%%yyyy%

isso não faz nada além de configurar a variável% date para ser a data de hoje no formato MMDDAAA, de modo que possa ser chamada posteriormente no script.

Editar
Encontrei uma sintaxe melhor. Dado que a minha data é hoje "seg 28/09/2009":
set day =% Date: ~ 0,2%
set month =% Date: ~ 7,2%
set year =% Date: ~ 10,4%

    
por 28.09.2009 / 14:01
2

versão cmd.exe pura em combinação com o gnuwin32-'date ':

%> for /F "usebackq" %d in ( 'date.exe +"%y%m%d"' ) do zip archive_%d.zip <folder>
    
por 28.09.2009 / 15:38
1

e o uso de cscript + vbasic:

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

ligue via

cscript /nologo zip_it.vbs
    
por 28.09.2009 / 15:16
1

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

@echo data =% CDate%

Isso é no dia do mês do ano que é mais comum hoje em dia

    
por 15.10.2009 / 01:18
1

Qualquer solução que use %DATE% ou a saída de date /t provavelmente será interrompida se o usuário tiver modificado suas configurações regionais. Por exemplo, defini meu formato de "data abreviada" como "yyyy-MM-dd" , então tenho %DATE% igual a "2012-02-18" e date /t produz a mesma saída. (Isto é para o Windows 7; presumo que seja o mesmo para versões anteriores do Windows.)

Crie um arquivo em lotes e execute-o.

Como você tem o comando GNU date disponível, você pode fazer algo assim:

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

tmp.bat conterá algo como:

zip some_options archive_2012-02-18.zip

Observe que isso cria tmp.bat no diretório atual, o que pode ser um problema; talvez seja melhor criar %TEMP%\tmp.bat . Eu também não removi o arquivo depois; isso é fácil de fazer.

date +FORMAT permite especificar o formato de saída do comando date , semelhante a uma string printf format; consulte a documentação da data do coreutils para obter detalhes. O formato pode incluir texto arbitrário, portanto, neste caso, você nem precisa usar sed .

    
por 18.02.2012 / 12:40
1

Eu acho que, se você juntar todos os pedaços, você tem algo que funciona para você. Isso está em um sistema Windows 2003 para me fornecer um instantâneo dos processos em execução em resposta a um acionador do monitor de desempenho:

@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

O arquivo de saída é nomeado em uma string sem delimitadores.

    
por 05.12.2014 / 15:22
0
zip [...] archive_'echo %DATE% | tr / -'.zip

Deve funcionar.

Por outro lado - talvez você tenha o comando date disponível (não sei o Windows). Se sim, faça o seguinte:

zip [...] archive_'date +'%Y-%m-%d''.zip
    
por 28.09.2009 / 13:57
-1

não tenho certeza se combina com você, mas meu código é

@ECHO OFF
set ldt=%date% %time%
echo %ldt%>> logs.txt
    
por 02.12.2014 / 09:53