En la línea de comandos basada en Windows NT (principalmente para XP o superior), ¿hay alguna forma de verificar si un interruptor proporcionado es solo un número? Dependiendo del número, quiero que recorra el código x número de veces
10
set /a NO_LINES=%~1
.; 2if %NO_LINES% NEQ %~1 goto ABORT
.. Cuando los dos son iguales: la variable o parámetro es numérico .Respuestas:
Editado para arreglar la expresión regular según el comentario de debham . Resulta que agregar un espacio antes de la tubería después del eco agrega un espacio a la cadena canalizada, que fue lo que rompió la coincidencia de inicio / final de línea anteriormente. La expresión regular podría mejorarse aún más descartando espacios en blanco al principio y al final.
Ahí está el
findstr
comando. Puede buscar archivos con expresiones regulares, al igual quegrep
en Linux. También puede buscar entradas canalizadas.Explicación
El parámetro utilizado se establece en la
param
variable. Sin embargo, no hay nada que lo detenga utilizando el parámetro directamente (%1
para el primer parámetro ).findstr
se usa para buscar la entrada canalizada con la/r
bandera para expresiones regulares.El patrón:
^
significa comienzo de línea.[0-9]
significa un dígito. El*
significa el anterior repetido cero o más veces. Entonces[0-9][0-9]*
significa un dígito, más cero o más dígitos. En otras palabras, al menos un dígito. Los+
no parece ser apoyado por una o más vecesfindstr
. Tenga en cuenta que[1-9]
se usa para el primer dígito para no permitir los ceros a la izquierda; vea los comentarios.$
significa fin de línea.Ahora, un bucle for en lote por x número de veces ... si x no es un número válido, el bucle en realidad no se ejecuta en absoluto, simplemente se omite para la siguiente línea. ¡Entonces no hay necesidad de verificar si la entrada es un número válido!
El ciclo se realiza utilizando
for /l
, donde los(x,y,z)
medios comienzan enx
, incrementany
hasta quez
se alcanza. Y se establece%%a
en el número / iteración actual.Nota: esto realmente falla si hay un cero inicial, lo que hace que el procesador de comandos lo trate como un número octal. Vea la respuesta de dbenham para una mejor solución.
fuente
"this 1 fails"
The FINDSTR debe hacer una coincidencia exacta. No debería hacer una coincidencia de palabras.09
o010
podría causar problemas debido a la notación octal. Vea mi respuesta para expresiones regulares que no permite la notación octal.Lo siguiente funciona muy bien para mí.
SET /a param=%1+0
siempre devuelve0
si%1
está vacío o no es numérico. De lo contrario, proporciona el número dado.fuente
Esto detectará si el primer parámetro es un número natural válido (entero no negativo).
Si desea permitir cotizaciones alrededor del número, entonces
Nota: los ceros iniciales no se permiten porque el lote los trata como octales, por lo que un valor como
09
no es válido y010
tiene un valor de 8.fuente
Inspirado por la excelente respuesta de Bob con las siguientes adiciones
El problema con lo siguiente es que siempre devuelve 'Número válido' porque 'si errorlevel 0' siempre es verdadero debido al hecho de que es una comparación '> = 0', no una comparación '== 0'.
mis $ .02
fuente
Puede validar cualquier variable si su número:
fuente
fuente
No sé por qué, pero en mi sistema el
findstr
comando no funcionó. El nivel de error no se modificaba en la coincidencia o no coincidencia.Sin embargo, se me ocurrió otro método
fuente
Aquí hay un juego que usa esta función.
fuente