Cortando milissegundos do valor de tempo na linha de comando

3

Estou escrevendo um script para compactar RAR meus arquivos e nomeio o resultado com o registro de data e hora.

Eu uso a variável de ambiente TIME . Eu também faço

set _time=%TIME::=.%' 

para usar apenas caracteres permitidos no nome do arquivo.

Como faço para me livrar da parte de milissegundos do %TIME% , por ex. 16:35:42.07

    
por Ted 04.03.2012 / 15:36

3 respostas

6

Apenas corte os caracteres que você não precisa depois:

 set _time=%_time:~0,-3%

Ou obtenha o resultado completo e desejado diretamente assim:

set _time=%TIME:~0,2%-%TIME:~3,2%-%TIME:~6,2%
    
por 04.03.2012 / 15:47
2

O caminho fácil seria se o campo de milissegundos fosse sempre dois dígitos: %_TIME:~0,-3%
Traduz para cortar os primeiros 0 caracteres e depois manter os caracteres (tamanho da string - 3). Qual iria cortar o .07 no seu exemplo. Na verdade, isso deve sempre funcionar: eu acabei de perceber que você está usando a variável% time% (me ensina a ler), que deve sempre retornar com um valor 'ms' de dois dígitos.

Se seus milissegundos puderem ter um número diferente de dígitos (por exemplo, 0.1 em vez de 0.10 ), será necessário algum tipo de comando de pesquisa de string. E aqui está:

Ok, isso parece hackish .. mas é a linha de comando do Windows, então ei. Isso reduzirá o ponto e tudo depois dele, por isso funcionará independentemente de quantos dígitos de precisão seu valor ms for (por exemplo, 0.1 em vez de 0.10 ).

SetLocal EnableDelayedExpansion

set _time=%time%_EndOfStringMarker
set __DotToEnd=%_time:*.=%
set _time=!_time:%__DotToEnd%=!
set _time=%_time:.=%

EndLocal && set _time=%_time%

Verifique se há apenas um ponto no seu tempo quando isso é usado.

Tentando explicar agora. Claro, você pode usá-lo e poupar a dor de cabeça de tentar entender.

  • SetLocal define um escopo local. Qualquer coisa trocada entre agora e o EndLocal não durará além do EndLocal. Você não pode ter um SetLocal dentro de um SetLocal.
  • EnableDelayedExpansion permite o uso de! s, entre outras coisas. Isso me permite usar uma variável dentro de uma variável.
  • Eu adiciono um _EndOfStringMarker por isso, se o valor de ms (no seu exemplo 07 ) ocorre em outro lugar, por exemplo o valor de segundos, que não será substituído.
  • Eu retiro de antes do ponto, incluindo o ponto, deixando-me com tudo depois do ponto. A linha de comando não me deixa fazer o contrário.
  • Eu substituo tudo depois do ponto na string original com nada, deixando-me com o tempo terminando em um ponto.
  • eu substituo o ponto por nada.
  • Eu termino a área local, para arrumar as coisas um pouco. Para manter o novo valor de tempo fora deste escopo local, tenho que defini-lo para si mesmo na mesma linha. É mais um truque da linha de comando.

Fonte para o desajeitado apara final: link

    
por 04.03.2012 / 15:45
1

Você pode usar a sintaxe da variável:

@echo off
set hrs=%time:~0,2%
set mns=%time:~3,2%
set scs=%time:~6,2%
set mls=%time:~9,2%
set nmt=%time:~0,8%

Use% hrs% para as horas

Use% mns% para os minutos

Use% scs% para os segundos

Use% mls% para os milissegundos

Use% nmt% pelo tempo sem os milissegundos

    
por 17.02.2019 / 14:21