Recortar milisegundos del valor de tiempo en la línea de comando

3

Estoy escribiendo un script para RAR-comprimir mis archivos y nombrar el resultado con la marca de tiempo.

Yo uso el TIME Variable ambiental. yo también hago

set _time=%TIME::=.%` 

para usar solo los caracteres permitidos en el nombre de archivo.

¿Cómo me deshago de los milisegundos parte de la %TIME%, p.ej. 16:35:42.07

Ted
fuente

Respuestas:

4

Solo corta los caracteres que no necesitas después:

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

O obtén el resultado completo y deseado directamente así:

set _time=%TIME:~0,2%-%TIME:~3,2%-%TIME:~6,2%
Der Hochstapler
fuente
2

La forma más sencilla sería que el campo de milisegundos tenga siempre dos dígitos: %_TIME:~0,-3%
Se traduce para recortar los primeros 0 caracteres, luego mantener hasta (tamaño de cadena - 3) caracteres. Que se cortaría el .07 en tu ejemplo De hecho, esto siempre debería funcionar: Me di cuenta de que está usando la variable% time% incorporada (me enseña a leer), que siempre debería regresar con un valor de "ms" de dos dígitos.

Si sus milisegundos podrían ser una cantidad diferente de dígitos (por ejemplo, 0.1 en lugar de 0.10 ), se necesitaría algún tipo de comando de búsqueda de cadena. Y aquí está:

Ok, esto parece hackish ... pero es la línea de comando de Windows, así que hey. Esto recortará el punto y todo lo que sigue, así que funcionará sin importar cuántos dígitos de precisión tenga su valor ms (por ejemplo, 0.1 en lugar de 0.10 ).

SetLocal EnableDelayedExpansion

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

EndLocal && set _time=%_time%

Asegúrese de que solo haya un punto en su tiempo cuando se usa.

Tratando de explicar ahora. Por supuesto, puedes usarlo y ahorrarte el dolor de cabeza de tratar de entender.

  • SetLocal define un ámbito local. Cualquier cosa que haya cambiado entre ahora y EndLocal no durará más allá de EndLocal. No puede tener un SetLocal dentro de un SetLocal.
  • EnableDelayedExpansion permite el uso de! S, entre otras cosas. Me permite usar una variable dentro de una variable.
  • Agrego un _EndOfStringMarker así que si el valor ms (en su ejemplo 07 ) ocurre en cualquier otro lugar, por ejemplo El valor de los segundos, que no será reemplazado.
  • Me corte antes del punto, incluido el punto, dejándome con todo después del punto. La línea de comando no me permite hacerlo al revés.
  • Reemplazo todo después del punto en la cadena original con nada, dejándome con el tiempo que termina en un punto.
  • Reemplazo el punto con nada.
  • Termino el área local, para arreglar las cosas un poco. Para mantener el nuevo valor de tiempo fuera de este ámbito local, tengo que configurarlo en la misma línea. Es otra peculiaridad de la línea de comando.

Fuente para el recorte dodgy para terminar: http://ss64.com/nt/syntax-replace.html

Bob
fuente