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

19

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

Infelizmente, isso não funciona em sistemas com a data formatada como y / m / d devido às barras:

zip some_options "archive_%DATE%.zip"

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

Mon 09/28/2009

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

No Unix (bash), pode-se usar aspas para avaliar um comando no local 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 para o valor retornado sede usá-lo para construir o nome do arquivo?

Cristi Diaconescu
fonte

Respostas:

27

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

set _date=%DATE:/=-%
Christopher
fonte
1
Este é um truque legal!
Cristi Diaconescu
PS Existe uma maneira 'one-liner' de se livrar de espaços ou de outros personagens desagradáveis ​​também? (em oposição a ter uma 3ª ... variável TEMP enésimo para cada personagem para substituir)
Cristi Diaconescu
Desculpe. Parece não haver tal coisa. Você precisa recorrer à sintaxe for para fazer isso. NB: Esta é uma boa referência para batch-programação: robvanderwoude.com/batchfiles.php
Christopher
5
isso é ainda mais rápido que %date:~-10,2%-%date:~-7,2%-%date:~-4,4% :!
Jess Stone
Como ninguém marcou +1 na sua resposta Jess Stone! +1 de mim !!!
Arvo Bowen
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, defina CDate como %% d - %% b - %% c para que seja 18/02/2012

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

Para tornar a pasta / arquivo de data e hora amigáveis.

släcker
fonte
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 do 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:

Aviso : o formato da data (aaaammdd = %% k %% j %% i) depende das suas configurações regionais. Como eu uso o formato de data em francês (dd / mm / aaaa), tenho que usar "%% k %% j %% i" como o formato (%% i = dia, %% j = mês, %% j = ano).

Se suas configurações regionais estiverem definidas no estilo dos EUA (mm / dd / aaaa), você deverá usar "%% k %% i %% j" (%% i = mês, %% j = dia, %% j = ano) .

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

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

Theo
fonte
2

Esse pedaço horrível de código deve fazer algo como o que você deseja

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.

Col
fonte
1
Importa-se de explicar a monstruosidade? :)
Cristi Diaconescu
É basicamente cortar bits fora da data e alimentá-lo no meio do nome do arquivo, você pode testá-lo fazendo eco, em seguida, partes do horror na linha de comando; portanto, se você fizer eco do% date: ~ 6,4%, ano. É apenas substringing a data e hora.
Col
Interessante. Não muito portátil, infelizmente ...
Cristi Diaconescu
Infelizmente, o problema com o uso de substrings é que ele depende de um determinado formato de data e explode quando é diferente. echo %date:~6,4%%date:~3,2%%date:~0,2%retorna 9-289-20na minha máquina desde que eu tenho a data definida para usar aaaa-MM-dd (hoje é 28/09/2009).
Joshua Joshua
É verdade que eu só uso esta solução em uma máquina, portanto não é um problema demais.
Col
2

Desde a sua pergunta é marcado como Windows, eu encontrei esta solução que obras nos bons velhos .bat:
"o Windows arquivo de lote (.bat) para obter a data atual em formato MMDDAAAA" ,
e, provavelmente, pode ser adaptado ao seu caso:

eco no
lote de datas rápidas do @REM Seamonkey (formato MMDDYYYY)
@REM Configura a variável% date
@REM Primeiro analisa o mês, o dia e o ano nos formatos mm, dd e aaaa e depois combina para ser MMDDYYYY

FOR / F "TOKENS = 1 * DELIMS =" %% A IN ('DATA / 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 ('eco% CDATE%') DO SET dd = %% B
FOR / F “TOKENS = 2,3 DELIMS = /” %% A IN ('eco% CDATE%') DEFINIR aaaa = %% Bv data do vSET =% mm %% dd %% aaaa%

isso não faz nada, mas configura a variável% date para a data de hoje no formato MMDDYYYY, para que possa ser chamada posteriormente no script.

Editar
Encontrou uma sintaxe melhor. Dado que minha data é hoje "Seg 28/09/2009":
definir dia =% Data: ~ 0,2%
definir mês =% Data: ~ 7,2%
definir ano =% Data: ~ 10,4%

harrymc
fonte
2

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

%> for /F "usebackq" %d in ( `date.exe +"%y%m%d"` ) do zip archive_%d.zip <folder>
akira
fonte
Portanto, ele pode fazer substituições no local! Se você me perguntar, o comando 'para' tem uma sintaxe estranho ...
Cristi Diaconescu
eu não afirmei que não podia :) todo o material 'cmd' é louco de qualquer maneira, quem quer que tenha criado isso foi um tipo de pesadelo. o cmd 'for' na verdade cria linhas (também conhecido como 'desenrola' o 'loop') na primeira passagem e, em seguida, executa o script assim 'criado'.
akira
1

que tal usar cscript + vbasic:

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

chame-o via

cscript /nologo zip_it.vbs
akira
fonte
1

Para / f "tokens = 1,2,3,4,5 delimitações = /." %% a em ('data / T') configure CDate = %% d - %% b - %% c

@echo data =% CDate%

Isso ocorre no ano-mês-dia que é mais comum nos dias de hoje


fonte
1

Qualquer solução que use uma %DATE%ou a saída de date /tprovavelmente será interrompida se o usuário tiver modificado suas configurações regionais. Por exemplo, eu configurei meu formato "data curta" para "yyyy-MM-dd", então eu tenho %DATE%igual a "2012-02-18", e date /tproduz a mesma saída. (Isso é 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 datecomando GNU 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.batno diretório atual, o que pode ser um problema; pode ser melhor criar %TEMP%\tmp.bat. Também não removi o arquivo depois; isso é fácil de fazer.

date +FORMATpermite especificar o formato de saída do datecomando, semelhante a uma printfstring de formato; 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.

Keith Thompson
fonte
1

Eu acho que, se você juntar as partes de todos, conseguirá algo que funcione para você. Este é um sistema Windows 2003 para fornecer uma captura instantânea dos processos em execução em resposta a um gatilho 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 sequência sem delimitadores.

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

Deveria trabalhar.

Por outro lado - talvez você tenha um datecomando disponível (não conheço o Windows). Se sim, faça:

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

fonte
O truque de backtick não funciona no cmd.exe. E o comando 'date' do Windows não pode manipular a formatação :(
Cristi Diaconescu
-1

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

@ECHO OFF
set ldt=%date% %time%
echo %ldt%>> logs.txt
Kelly
fonte
O OP quer um arquivo com a data atual no nome do arquivo , e não nos conteúdos de arquivo
Jan Doggen