Precisa de zero inicial para script em lote usando a variável% time%

24

Eu me deparei com um bug no meu script DOS que usa dados de data e hora para a nomeação de arquivos. O problema foi que acabei com uma lacuna porque a variável de tempo não forneceu automaticamente zero à esquerda por hora < 10. Então, executando > echo% time% devolve: '9: 29: 17.88'.

Alguém sabe de uma maneira de preencher condicionalmente zeros à esquerda para corrigir isso?

Mais informações: Meu comando do nome do arquivo é:

set logfile=C:\Temp\robolog_%date:~-4%%date:~4,2%%date:~7,2%_%time:~0,2%%time:~3,2%%time:~6,2%.log

que acaba sendo: C: \ Temp \ robolog_20100602_ 93208.log (para as 9:23 da manhã).

Esta questão está relacionada com este .

Obrigado

    
por Ira 02.06.2010 / 18:36

12 respostas

59

Uma maneira muito simples é simplesmente substituir o espaço inicial por zero:
echo %TIME: =0%
saídas: 09:18:53,45

    
por 14.08.2011 / 10:25
13

Minha solução foi usar a seguinte ideia:

SET HOUR=%TIME:~0,2%
IF "%HOUR:~0,1%" == " " SET HOUR=0%HOUR:~1,1%
    
por 10.01.2011 / 01:02
5

Idéia semelhante a Resposta de Dennis . O problema é que a largura de %time% é sempre a mesma, por isso insere um espaço no começo em vez de retornar uma string mais curta.

Você pode se livrar disso com for :

for /f "delims= " %x in ("%time%") do set T=0%x

O resto é mais ou menos o mesmo, então.

    
por 07.06.2010 / 01:43
3

Usando a contribuição de Jesse, acabei de criar uma variável com a saída modificada. Então, faço referência a essa variável para construir a parte da hora.

set NantTime=%time: =0%
nant\bin\nant.exe -nologo+ -debug+ -verbose+ -D:project.config=debug /f:build\default.build -l:logs\architect-build-%DATE:~10,4%-%DATE:~4,2%-%DATE:~7,2%-%NantTime:~0,2%-%time:~3,2%-%time:~6,2%.log 
pause

Com a fonte original:

set hour=%time: =0%
set logfile=C:\Temp\robolog_%date:~-4%%date:~4,2%%date:~7,2%_%hour:~0,2%%time:~3,2%%time:~6,2%.log

Obrigado Jesse. Eu teria votado se tivesse os pontos de reputação.

    
por 18.04.2012 / 19:39
1

Para a solução mais compacta implementando tudo acima, acho que

FOR /F "TOKENS=1-4 DELIMS=/ " %%A IN ("%DATE%") DO FOR /F "TOKENS=1-3 DELIMS=:." %%E IN ("%TIME: =0%") DO SET logfile=C:\Temp\robolog_%%D%%C%%B_%%E%%F%%G.log

funcionaria aqui sem adicionar novas linhas ao script. É talvez menos elegante do que várias soluções de comando, embora ...

    
por 24.12.2011 / 01:51
1

O texto a seguir leva mais algumas linhas, mas é claro e compreensível. Ele salva stdout e stderr para separar arquivos, cada um com um timestamp. O registro de data e hora inclui ano, mês, dia, hora, minuto e segundo, nessa ordem. Os timestamps devem sempre ter o componente de data mais significativo primeiro (ano) e o menor componente (segundos) por último. Isso permite que as listagens de arquivos estejam em ordem de tempo. Sem mais delongas, aqui está a minha solução.

:prepare time stamp 
set year=%date:~10,4%
set month=%date:~4,2%
set day=%date:~7,2%
set hour=%time:~0,2%
:replace leading space with 0 for hours < 10
if "%hour:~0,1%" == " "  set hour=0%hour:~1,1%
set minute=%time:~3,2%
set second=%time:~6,2%
set timeStamp=%year%.%month%.%day%_%hour%.%minute%.%second%

:run the program 
ProgramName.pl 1> RunLogs\out.%timeStamp% ^
               2> RunLogs\err.%timeStamp%
    
por 08.08.2013 / 00:52
0

Isto ajusta um zero no começo do tempo e toma os dois últimos dígitos da hora (o minuto e as posições iniciais são trocadas por um). Então, 03:00 torna-se "03" e depois "03" e  a hora 15 passa a ser "015" e depois "15".

set T=0%time%
set T=%T:~1,2%%T:~4,2%%T:~7,2%
set D=%date:~-4%%date:~4,2%%date:~7,2%
set logfile=C:\Temp\robolog_%D%_%T%.log

Menos legível:

set T=0%time%
set logfile=C:\Temp\robolog_%date:~-4%%date:~4,2%%date:~7,2%_%T:~1,2%%T:~4,2%%T:~7,2%.log
    
por 02.06.2010 / 23:00
0

Uma linha de código fará o que você precisa:

    IF "%Time:~0,1%" == " " SET TimeStamp=0%Time:~1,7%

Por exemplo, eu uso% Date% e, em seguida, adiciono um zero inicial a uma variável que uso para determinar se preciso substituir o espaço à esquerda por zero para% Time%.

    ::Prepare TimeStamp variable by replacing leading space with 0 for Hours < 10
    SET TimeStamp=%Time:~0,8%
    IF "%Time:~0,1%" == " " SET TimeStamp=0%Time:~1,7%
    Echo Started on %Date$ at %TimeStamp%

    :: Insert what you are doing here...

    SET TimeStamp=%Time:~0,8%
    IF "%Time:~0,1%" == " " SET TimeStamp=0%Time:~1,7%
    ECHO Finished on %Date% at %TimeStamp%
    
por 09.08.2016 / 20:39
0

Isso cria um registro de data e hora classificável e a segunda linha garante que não haja espaços para hora de dígito único, etc., para torná-lo utilizável para scripts:

set datestamp=%date:~-4%.%date:~-10,-8%.%date:~-7,-5%_%time:~0,2%.%time:~3,2%.%time:~6,2%
set datestamp=%datestamp: =_%

Saída:

2018.02.26__9.47.34

    
por 26.02.2018 / 16:12
0

Obrigado pela ajuda de cima ... É isso que estou usando:

C:\Windows\System32>SET short=%date:~10,4%-%date:~4,2%-%date:~7,2%
C:\Windows\System32>ECHO -- Short Date: %short%
-- Short Date: 2018-06-27
C:\Windows\System32>SET long=%date:~10,4%-%date:~4,2%-%date:~7,2%_%time:~0,2%_%time:~3,2%_%time:~6,2%
C:\Windows\System32>ECHO -- Long Date: %long%
-- Long Date: 2018-06-27_10_51_43

Eu, então, tenho logs que são chamados em tarefas de Robocopy assim:

Existem muitos assim:

Robocopy C:\Users\ME\Favorites\ %usb%:\Local_PC\Favorites\ /MIR /TEE /FFT /DST /TIMFIX /W:5 /R:5 /NP /LOG+:%usb%:\Robocopy\LOG_%short%.txt

Termina o trabalho com isso:

REN %usb%:\Robocopy\LOG_%short%.txt COMPLETE_LOG_%long%.log

COMPLETE_LOG_2018-06-27_10_53_54.log é o arquivo produzido no final e é classificável pelo nome do arquivo.

    
por 27.06.2018 / 15:42
0

A resposta de Jesse resolveu meu problema de renomeação de arquivos, eliminando o espaço no campo da hora. É assim que eu configuro minhas variáveis:

for /f "tokens=1,2,3,4 delims=/ " %%a in ("%date%") do set wday=%%a&set month=%%b&set day=%%c&set year=%%d
for /f "tokens=1,2 delims=:" %%a in ("%time: =0%") do set hour=%%a&set minute=%%b

Funciona como um campeão; por algum motivo, a data não precisou do mesmo tratamento, mas imagino que isso se deva às configurações regionais.

    
por 15.03.2019 / 14:29
-2
set sFolderName=%time: =0%
xcopy "%UserProfile%\Pictures\*.jpg" Y:\"%DATE%-%sFolderName:~0,2%h%time:~3,2%m%time:~6,2%s-%random%" /I /C /Y

15.06.2015-03h43m34s-5357

5357-%random%"
    
por 14.06.2015 / 07:08