Apagada docs

Aprendiendo a programar el pasado

Herramientas de usuario

Herramientas del sitio


es:bat:espera_30_segundos

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:

  1. 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).
  2. 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.

wait30seconds.cmd
@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
Este sitio web utiliza cookies. Al utilizar el sitio web, usted acepta almacenar cookies en su computadora. También reconoce que ha leído y entendido nuestra Política de privacidad. Si no está de acuerdo abandone el sitio web.Más información
es/bat/espera_30_segundos.txt · Última modificación: 2022/11/16 03:12 por nepenthes