Pergunta

No meu arquivo .bat Eu quero gerar um nome exclusivo para arquivos / diretórios com base na data de tempo.

por exemplo.

Build-2009-10-29-10-59-00

O problema é que %TIME% não vai fazer porque contém caracteres que são ilegais no nome do arquivo (por exemplo, : ).

Existe algo como tr em arquivos em lote?

Quaisquer outras ideias de como resolver isso (que não necessitam de utilitários de linha de comando extras além do intérprete lote)?

Foi útil?

Solução

EDIT: A melhor maneira de fazer isso é dar uma seqüência de data / hora que tem um formato definido e imutável em vez de usar os definidos pelo localidade de %date% e %time%. Você pode usar o seguinte para obtê-lo:

for /f "skip=1" %%x in ('wmic os get localdatetime') do if not defined mydate set mydate=%%x

Ela produz algo como 20120730203126.530000+120 e você pode usar isso para construir seus nomes de arquivo.


(velha resposta abaixo)

Você pode simplesmente substituir o caractere ofender com uma string vazia:

echo %time::=%

O %var:str1=str2% sintaxe leva a variável de ambiente (ou pseudo-variável em caso de %TIME% e substitui str1 por str2. Se nada se segue após o sinal de igual então str1 é simplesmente excluída.

No seu caso específico eu acho que você iria querer o seguinte:

rem cut off fractional seconds
set t=%time:~0,8%
rem replace colons with dashes
set t=%t::=-%
set FileName=Build-%date%-%t%

A-força bruta maneira mais no caso de você não sei se dois pontos são usados ??(mas na ordem do tempo seria o mesmo):

set FileName=Build-%date%-%time:~0,2%-%time:~3,2%-%time:~6,2%

Todas as coisas anteriores, no entanto, assumir que você usar o formato de data padrão ISO 8601, i. e. 2009-10-29. Eu diria que este simplesmente como normal, mas algumas pessoas usam outros formatos que deve ter cuidado. Mas desde que você não perguntar sobre a data eu estava supondo que você não tem um problema lá.

Outras dicas

No seguimento @ Joey e respostas @Kees' para torná-los instantaneamente utilizável.

Na linha de comando:

FOR /f %a IN ('WMIC OS GET LocalDateTime ^| FIND "."') DO SET DTS=%a
SET DateTime=%DTS:~0,4%-%DTS:~4,2%-%DTS:~6,2%_%DTS:~8,2%-%DTS:~10,2%-%DTS:~12,2%
echo %DateTime%

Em um arquivo BAT:

@echo off
REM See http://stackoverflow.com/q/1642677/1143274
FOR /f %%a IN ('WMIC OS GET LocalDateTime ^| FIND "."') DO SET DTS=%%a
SET DateTime=%DTS:~0,4%-%DTS:~4,2%-%DTS:~6,2%_%DTS:~8,2%-%DTS:~10,2%-%DTS:~12,2%
echo %DateTime%

Exemplo de saída:

2014-10-21_16-28-52

Eu uso isso para criar um nome de arquivo exclusivo para a execução do arquivo de lote.

REM ****Set up Logging ****
For /f "tokens=2-4 delims=/ " %%a in ('date /t') do (set mydate=%%c-%%a-%%b)
For /f "tokens=1-2 delims=/:" %%a in ("%TIME%") do (set mytime=%%a%%b)
set mytime=%mytime: =0%

set Logname="PCCU_%mydate%_%mytime%.log"
Echo.  >>%Logname% 2>>&1
Echo.=================== >>%Logname% 2>>&1

Eu tive que inclua a linha

set mytime=%mytime: =0%

porque eu tive o mesmo problema, onde um espaço em branco estava sendo introduzido antes de 10 AM, agora eu recebo 09 em vez de 9. Eu também reutilizar o% mydate% e% Mytime% variável para outros arquivos que eu criar com este script para que todos eles têm o mesmo carimbo de data e hora.

Esta rotina, na verdade, apenas uma linha, trabalha em cada conjunto de sistemas para qualquer formato de data ou hora.
Saída de linha 1 está no formato 20140725095527,710000 + 120

A data formato real / hora que você precisa é determinada na linha 2. Você pode formatá-lo como quiser.
Basta adicionar a variável DateTime resultante para seu nome de arquivo ie. Filename_% DateTime% .log

::=======================================================================
::== CREATE UNIQUE DateTime STRING IN FORMAT YYYYMMDD-HHMMSS
::=======================================================================
FOR /f %%a IN ('WMIC OS GET LocalDateTime ^| FIND "."') DO SET DTS=%%a

SET DateTime=%DTS:~0,8%-%DTS:~8,6% | REM OUTPUT = 20140725-095527

Eu fiz este, Will obra universal em qualquer ambiente onde formato da data pode ser diferente.

echo off
if not exist "C:\SWLOG\" mkdir C:\SWLOG
cd C:\SWLOG\
cmd /c "powershell get-date -format ^"{yyyyMMdd-HHmmss}^""> result.txt
REM echo %time% > result.txt
type result.txt > result1.txt
set /p filename=<result1.txt
echo %filename%
del C:\SWLOG\result.txt
del C:\SWLOG\result1.txt

Para tornar o código no exemplo anterior de trabalho, eu precisava para ajustar ligeiramente. Eu presumo que isso é porque o meu PC está usando um formato de data UK. Para voltar "2014/04/19" em mydate eu precisava:

For /f "tokens=1-3 delims=/ " %%a in ('date /t') do (set mydate=%%c-%%b-%%a)

Abaixo eu colei meu script total, incluído um exemplo de como usar o nome do arquivo

For /f "tokens=1-3 delims=/ " %%a in ('date /t') do (set mydate=%%c-%%b-%%a)
For /f "tokens=1-2 delims=/:" %%a in ("%TIME%") do (set mytime=%%a%%b)
set mytime=%mytime: =0%

set Logname="c:\temp\LogFiles\MyLogFile_%mydate%_%mytime%.log"
Robocopy  \\sourceserver\Music H:\MyBackups\Music /MIR /FFT /Z /XA:H /W:5 /np /fp /dcopy:T /unilog:%Logname% /tee 

Espero que isso ajude!

Se você pode garantia que a máquina tem uma versão específica do Python instalado nele e acessível em PATH do sistema, você pode usar esta solução:

FOR /F "tokens=* USEBACKQ" %%F IN (`python -c "import datetime; print 
datetime.datetime.now().replace(microsecond=0).isoformat().replace(':', '-')"`) DO (
SET TIMESTAMP=%%F
)
ECHO %TIMESTAMP%

Isto irá colocar o ISO-8601 representação (ish) data local atual em um %TIMESTAMP% variável e eco-lo para fora, assim:

2017-05-25T14:54:37

Eu coloquei replace(':', '-') após a isoformat() para que a cadeia resultante pode ser usado em um nome de arquivo ou diretório, já que : é um personagem proibido no sistema de arquivos do Windows.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top