Necesita un cero a la izquierda para el script por lotes usando% time% variable


26

Encontré un error en mi script de DOS que usa datos de fecha y hora para nombrar archivos. El problema fue que terminé con una brecha porque la variable de tiempo no proporcionó automáticamente el cero inicial para la hora <10. Por lo tanto, la ejecución> echo% time% devuelve: '9: 29: 17.88'.

¿Alguien sabe de una manera de rellenar condicionalmente los ceros a la izquierda para solucionar esto?

Más información: Mi nombre de archivo set command es:

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

que termina siendo: C: \ Temp \ robolog_20100602_ 93208.log (para las 9:23 de la mañana).

Esta pregunta está relacionada con esta .

Gracias


Es posible obtener un valor de hora acolchado ... FOR / F "TOKENS = 1 DELIMS =:" %% A IN ('TIME / T') DO SET HH = %% A y luego reemplaza% time: ~ 0,2% con% HH% esperaba una solución más compacta, pero esto funcionará.
— Ira

Una solución "más compacta" sería algo en otro idioma (powershell? Python? Perl? WSH?).
— Grawity

Cambié para marcar la respuesta de Jesse como la solución que uso. Funciona tanto con los tiempos previos al mediodía para rellenar con 0 inicial como también con el tiempo militar posterior al mediodía.
— Ira

Respuestas:


60

Una forma muy simple es simplemente reemplazar el espacio inicial con cero:
echo %TIME: =0%
salidas:
09:18:53,45


1
¡funciona! esta es la solución más simple que creo ...
— aerobrain

¿Esto también se puede hacer con varios personajes? Es decir, todos ',', '' y ':'. Actualmente creo variables intermedias pero, por supuesto, esto funciona solo debido a la poca cantidad de reemplazos. Por más sería engorroso.
— Devolus

1
Estoy usando esto en un segundo "paso" para modificar las Horas: set HH=%time:~-11,2% set MM=%time:~-8,2% set SS=%time:~-5,2% set ISOTIME=%HH: =0%-%MM%-%SS% echo %ISOTIME%También vea ss64.com/nt/syntax-replace.html
— maneje el

+1 Esta es la respuesta más corta / mejor. Cómo lo usé: set timestring=%TIME: =0%temprano en la sub llamada, luego solo trabaje con él timestring(o cualquier variable que use).
— bshea

14

Mi solución fue usar la siguiente idea:

SET HOUR=%TIME:~0,2%
IF "%HOUR:~0,1%" == " " SET HOUR=0%HOUR:~1,1%

Me gusta. Simple e intuitivo.
— Ken

¡Funciona en ventanas modernas, pero da error de sintaxis en el servidor 2003!
— Dr. BDO Adams

Funciona perfectamente en 2008+, la solución más elegante. Gracias.
— bjoster

1
but gives syntax error on server 2003- ¿Por qué te importa eso en 2016?
— Marcin Orlowski

Perfecto en el símbolo del sistema de Windows 10
— Mike Upjohn

5

Idea similar a la respuesta de Dennis . El problema es que el ancho de %time%siempre es el mismo, por lo que inserta un espacio al principio en lugar de devolver una cadena más corta.

Puede deshacerse de eso con for:

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

El resto es más o menos lo mismo, entonces.


2
Esta solución funciona para> 10 pero ahora crea '010' para 10: ...
— Devolus

3
La respuesta de Jesse es la correcta ...
— Simon Sobisch

Esta es una respuesta muy mala, se descompone en cuanto hay dos dígitos en la hora. No puedo creer que el OP lo haya seleccionado.
— thebunnyrules

3

Usando la contribución de Jesse, acabo de crear una variable con el resultado modificado. Luego hago referencia a esa variable para construir la porción de 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

Con la fuente 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

Gracias Jesse Hubiera votado si tuviera los puntos de reputación.


1

Para la solución más compacta que implementa todo lo anterior, creo que

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

funcionaría aquí sin agregar nuevas líneas al script. Sin embargo, es quizás menos elegante que las soluciones de comandos múltiples.


1

Lo siguiente toma algunas líneas más pero es claro y entendible. Guarda stdout y stderr para separar archivos, cada uno con una marca de tiempo. La marca de tiempo incluye año, mes, día, hora, minuto y segundo, en ese orden. Las marcas de tiempo siempre deben tener el componente de fecha más significativo primero (año) y el último componente (segundos) al final. Eso permite que los listados de archivos estén en orden de tiempo. Sin más preámbulos, aquí está mi solución.

: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%

0

Esto agrega un cero al comienzo de la hora y toma los dos últimos dígitos de la hora (las posiciones de inicio de minuto y segundo se desplazan por una). Entonces 3 AM se convierte en "03" luego "03" y la hora 15 se convierte en "015" luego "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 legible:

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

1
No estoy seguro de que esto funcione. Si ejecuto 'set T = 0% time%' y son las 9:38 AM, echo% T% devuelve: '0 9: 38: 54.21', luego tomar% T: ~ 1,2% obtiene el espacio, sin adelantar 0.
— Ira

0

Una línea de código hará lo que necesita:

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

Por ejemplo, uso% Date% y luego agrego un cero inicial a una variable que uso para determinar si necesito reemplazar el espacio inicial con un cero 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%

0

Esto crea una marca de tiempo ordenable y la segunda línea se asegura de que no haya espacios para una hora de un solo dígito, etc., para que pueda utilizarse para los scripts:

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

Salida:

2018.02.26__9.47.34


0

Gracias a la ayuda de arriba ... Esto es lo que estoy 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

Luego tengo registros que se llaman en trabajos de Robocopy como este:

Hay muchos como este:

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 el trabajo con esto:

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

COMPLETE_LOG_2018-06-27_10_53_54.log es el archivo producido al final y se puede ordenar por nombre de archivo.


0

La respuesta de Jesse resolvió mi problema de cambio de nombre de archivo al eliminar el espacio en el campo de la hora. Así es como configuro mis variables:

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

Trabaja como un campeón; por alguna razón, la fecha no necesitaba el mismo tratamiento, pero imagino que eso se debe a la configuración regional.


0
    @echo off



    call :PAD aaa,2,0,grw
    echo [[aaa=%aaa%]]
    pause




rem #### Function PAD ####
    goto :PADEND
    :PAD <var>,<length>,<padchar>,<string>
        set padtot=%~2
        set padchar=%~3
        set padString=%~4
        :StartPADLOOP
            call :len lenpadString,%padString%
            if ["%lenpadString%"] GEQ ["%padtot%"] goto :EndPADLOOP
            set padString=%padchar%%padString%
            goto :StartPADLOOP
        :EndPADLOOP
        set %~1=%padString%
    GOTO :EOF
    :PADEND


rem #### Function LEN ####
    goto :LENEND
    :LEN <var>,<string>
        set LENtempvar=%~2
        rem echo {{S:%LENtempvar%}}
        set LENCOUNT=0    
        :startLENLOOP
            if ["%LENtempvar%"] EQU [""] goto :endLENLOOP
            rem echo {{A:%LENtempvar%}}
            set LENtempvar=%LENtempvar:~0,-1%
            rem echo {{B:%LENtempvar%}}
            set /a LENCOUNT=LENCOUNT+1
        goto :startLENLOOP
        :endLENLOOP
        set %~1=%LENCOUNT%
    GOTO :EOF
    :LENEND

-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%"

55
Aunque se aprecia el código, siempre debe tener una explicación que lo acompañe. Esto no tiene que ser largo, pero se espera.
— Peter dice que reinstalar a Monica el
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.