Você pode substituir símbolos em variáveis usando:
set _date=%DATE:/=-%
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?
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.
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).
zip some_options "archive_%date:/=-%.zip"
o /=-
substitui o /
por um sinal de menos.
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.
Como sua pergunta é marcada como Windows, eu encontrei essa solução que funciona nos arquivos .bat antigos:
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 MMDDYYYYFOR /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%
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>
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
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
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
.
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.
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
não tenho certeza se combina com você, mas meu código é
@ECHO OFF
set ldt=%date% %time%
echo %ldt%>> logs.txt