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

Ira
fuente
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

Jesse
fuente
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%
Neil Ratcliffe
fuente
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.

Joey
fuente
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.

Ben Newcomb
fuente
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.

alemán
fuente
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%
David
fuente
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
Pausado hasta nuevo aviso.
fuente
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%
Richard Wright
fuente
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

Muposat
fuente
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.

Chip Delozier
fuente
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.

bradzilla3k
fuente
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
Risoos
fuente
-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%"
Vitokhv
fuente
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