====== Espera 30 segundos (guion CMD de archivo por lotes de Windows) ======
Este es un archivo de proceso por lotes para windows que espera 30 segundos y después continúa. Puede añadirlo como una sección dentro de un archivo por lotes donde desee esperar unos segundo, o puede copiarlo como un archivo en su ruta de ejecución (PATH) y llamarlo con ''CALL'' cuando lo necesite.
===== Explicación del funcionamiento =====
Este archivo obtiene los segundos de la variable de entorno %TIME%. La configuración regional (locale) podría afectar el valor devuelto. En mi entorno es_ES (español de España), ''echo "%time%"'' produce algo como:
''" 8:25:08,37"''
Así que nos interesa conseguir las posiciones 5 y 6 de la variable %TIME%:
SET endTime= %TIME:~-5,2%
A continuación, necesitamos eliminar los ceros a la izquierda, pues ''SET /A'' espera que las cifras con cero a la izquierda designen valores en base 8 (octales). Puesto que 08 y 09 no son valores en base 8 válidos, necesitamos eliminar ese cero a la izquierda. Lo hacemos añadiendo un ESPACIO antes de la primera cifra (observe el espacio antes de ''%TIME%'' en el comando anterior) y eliminando la secuencia ESPACIO CERO.
SET endTime=%endTime: 0= %
Ahora podemos calcular el valor. Si vamos a esperar 30 segundos, necesitamos añadir 30 a los segundos, dividir el resultado entre 60 y quedarnos con el resto. ''SET /A'' entiende % como operador de resto, lo que es problemático, pues % también se usa para marcar las variables de entorno, los parámetros y las variables de bucle FOR. Por tanto:
- Debemos duplicar el operador % (%%) si estamos dentro de un archivo de proceso por lotes. Usaremos un % único si estamos escribiendo en la consola (o llamamos a un archivo con ''TYPE file | CMD'').
- Además, debemos rodear el signo % con espacios, para evitar que sea interpretado como un marcador de variable de entorno o de bucle.
La instrucción resultante empleando ''SET /A'' para asignar el valor aritmético de una expresión a la variable de entorno es:
SET /A endTime=( %endTime% + 30 ) %% 60
Si deseamos comprobar el tiempo dentro de una única condición ''IF'' (sin volver a hacer toda la magia para eliminar ceros a la izquierda), debemos añadir de nuevo ese cero a la izquierda. Tras algo de ensayo y error, me decidí finalmente por hacerlo mediante un bucle FOR. Es menos elegante, pero más eficaz que usar SET para reemplazar un espacio por un cero.
La siguiente instrucción prueba si endTime está entre 0 y 9 y lo reemplaza con 00, 01, etc.
for /L %%a in (0;1;9) do if "%endTime%"=="%%a" set endTime=0%%a
Finalmente, solo necesitamos comparar ''%endTime%'' con las posiciones 5 y 6 de la variable de entorno ''%TIME%'':
if %time:~-5,2%.==%endTime%. goto :end
===== Archivo de proceso por lotes =====
He aquí el archivo de proceso por lotes.
@echo off
echo Esperando 30 segundos...
rem Lo siguiente es necesario porque
rem para SET, los números que empiezan
rem por 0 son octales.
rem 1- Obtén el segundo y añade espacio
rem antes.
set endTime= %time:~-5,2%
rem 2- Elimina cero tras espacio
set endTime=%endTime: 0= %
rem 3- Opera aritméticamente
set /A endTime=( %endTime% + 30 ) %% 60
echo %endTime%
rem 4- Recupera el cero
for /L %%a in (0;1;9) do if "%endTime%"=="%%a" set endTime=0%%a
rem 5- Espera hasta que el valor coincida con
rem el segundo actual.
:repeat
if %time:~-5,2%.==%endTime%. goto :fin
goto :repeat