Comptage dans une boucle FOR à l'aide de Windows script Batch
Quelqu'un peut-il expliquer cela? Je suis en mesure de compter dans une boucle à l'aide de l'invite de commande Windows, à l'aide de cette méthode:
SET /A XCOUNT=0
:loop
SET /A XCOUNT+=1
echo %XCOUNT%
IF "%XCOUNT%" == "4" (
GOTO end
) ELSE (
GOTO loop
)
:end
Mais cette méthode ne fonctionne pas (il affiche "1" pour chaque ligne dans le fichier). Elle agit comme la variable est hors de portée:
SET /A COUNT=1
FOR /F "tokens=*" %%A IN (config.properties) DO (
SET /A COUNT+=1
ECHO %COUNT%
)
Vous devez vous connecter pour publier un commentaire.
Il ne fonctionne pas parce que le ensemble
for
boucle (à partir de lafor
à la clôture définitive de la parenthèse, y compris les commandes entre ceux-ci) est en cours d'évaluation lorsqu'il est rencontré, avant il commence à exécuter.En d'autres termes,
%count%
est remplacée par sa valeur1
avant l'exécution de la boucle.Ce que vous avez besoin est quelque chose comme:
Expansion retardée à l'aide de
!
au lieu de%
vous donnera le comportement attendu. Voir aussi ici.Également garder à l'esprit que
setlocal/endlocal
fait de limiter la portée de choses ont changé à l'intérieur de sorte qu'ils ne coule pas. Si vous souhaitez utilisercount
après laendlocal
, vous devez utiliser un "truc" rendue possible par le problème que vous rencontrez:Disons
count
est devenu 7 dans l'intérieur de la portée. Car la totalité de la commande est interprété avant l'exécution, elle devient:Puis, quand il est exécuté, à l'intérieur de la portée est fermé, le retour
count
à sa valeur initiale. Mais, depuis la création decount
à sept il se passe à l'extérieur de la portée, c'est effectivement une fuite de l'information dont vous avez besoin.Vous pouvez enchaîner plusieurs sous-commandes de fuite autant d'informations que vous avez besoin de:
SETLOCAL ENABLEDELAYEDEXPANSION
moins leENABLEEXTENSIONS
?!count!
était! Merci pour l'explication!
vs%
!pour a = 1 à 100 à l'étape 1
Ligne de commande dans Windows . Veuillez utiliser %%un si en cours d'exécution dans le fichier de commandes.
for /L %a in (1,1,100) Do echo %a
pour les pseudo pour a = 1 à 100 etape 1 est un mauvais exemple. Une meilleure seraitfor /L %a in (1,5,100) Do echo %a
pour les pseudo pour a = 1 à 100 à l'étape 5 parce qu'il implique clairement la syntaxefor /L %a in (start,step,end)
Ici est un fichier batch qui génère tous les 10.x.x.x adresses