Uma maneira muito simples é simplesmente substituir o espaço inicial por zero:
echo %TIME: =0%
saídas: 09:18:53,45
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
Minha solução foi usar a seguinte ideia:
SET HOUR=%TIME:~0,2%
IF "%HOUR:~0,1%" == " " SET HOUR=0%HOUR:~1,1%
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.
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.
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 ...
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%
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
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%
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
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.
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.
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%"