Dans la ligne de commande basée sur Windows NT (principalement pour XP ou supérieur), existe-t-il un moyen de vérifier si un commutateur fourni est un nombre uniquement? Selon le nombre, je veux qu'il boucle le code x nombre de fois
10
set /a NO_LINES=%~1
.; 2if %NO_LINES% NEQ %~1 goto ABORT
.. Lorsque les deux sont égaux - La variable ou le paramètre est numérique .Réponses:
Modifié pour corriger l'expression régulière selon le commentaire de Debham . Il s'avère que l'ajout d'un espace avant le tuyau après l'écho ajoute un espace à la chaîne canalisée, ce qui a rompu la correspondance de début / fin de ligne précédemment. Le regex pourrait être encore amélioré en supprimant les espaces blancs au début et à la fin.
Voilà la
findstr
commande. Il peut rechercher des fichiers avec des expressions régulières, un peu commegrep
sous Linux. Il peut également rechercher une entrée canalisée.Explication
Le paramètre utilisé est défini dans la
param
variable. Cependant, rien ne vous empêche d'utiliser directement le paramètre (%1
pour le premier paramètre).findstr
est utilisé pour rechercher l'entrée canalisée avec le/r
drapeau pour regex.Le motif:
^
signifie début de ligne.[0-9]
signifie un chiffre. Le*
signifie la précédente répétée zéro ou plusieurs fois. Signifie donc[0-9][0-9]*
un chiffre, plus zéro ou plusieurs chiffres. En d'autres termes, au moins un chiffre. La+
ou les fois ne semblent pas être prises en charge parfindstr
. Notez qu'il[1-9]
est utilisé pour le premier chiffre pour interdire les zéros non significatifs - voir les commentaires.$
signifie fin de ligne.Maintenant, une boucle for en lot pour x nombre de fois ... si x n'est pas un nombre valide, la boucle ne s'exécute pas du tout - elle est simplement ignorée pour la ligne suivante. Il n'est donc pas nécessaire de vérifier si l'entrée est un nombre valide!
La boucle se fait en utilisant
for /l
, où les(x,y,z)
moyens commencent àx
, incrémentery
jusqu'à ce quez
soit atteint. Et il définit%%a
le nombre / itération actuel.Remarque: cela échoue en fait s'il y a un zéro en tête, ce qui oblige le processeur de commandes à le traiter comme un nombre octal. Voir la réponse de dbenham pour une meilleure solution.
la source
"this 1 fails"
FINDSTR devrait faire une correspondance exacte. Il ne doit pas faire de correspondance de mots.09
ou010
pourrait causer des problèmes en raison de la notation octale. Voir ma réponse pour regex qui interdit la notation octale.Ce qui suit fonctionne très bien pour moi.
SET /a param=%1+0
renvoie toujours0
si%1
est vide ou non numérique. Sinon, il fournit le numéro donné.la source
Cela détectera si le premier paramètre est un nombre naturel valide (entier non négatif).
Si vous souhaitez autoriser des guillemets autour du nombre, alors
Remarque - les zéros non significatifs sont interdits parce que le lot les traite comme octaux, donc une valeur comme
09
n'est pas valide et010
a une valeur de 8.la source
Inspiré par l' excellente réponse de Bob avec les ajouts suivants
Le problème avec ce qui suit est qu'il retourne toujours «Numéro valide» car «si le niveau d'erreur 0» est toujours vrai car il s'agit d'une comparaison «> = 0», et non d'une comparaison «== 0».
mon 0,02 $
la source
Vous pouvez valider n'importe quelle variable si son nombre:
la source
la source
Je ne sais pas pourquoi mais sur mon système, la
findstr
commande n'a pas fonctionné. Le niveau d'erreur n'était pas modifié lors d'une correspondance ou d'aucune correspondance.J'ai trouvé une autre méthode
la source
Voici un jeu qui utilise cette fonction.
la source