Compter dans une boucle FOR à l’aide d’un script de lot Windows

Quelqu’un peut-il expliquer cela? Je suis capable de compter dans une boucle en utilisant l’invite de commande Windows, en utilisant 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 (elle affiche “1” pour chaque ligne du fichier). Il agit comme si la variable était hors de scope:

 SET /A COUNT=1 FOR /F "tokens=*" %%A IN (config.properties) DO ( SET /A COUNT+=1 ECHO %COUNT% ) 

Il ne fonctionne pas car l’ intégralité for boucle for (de la parenthèse de clôture à la fin, y compris les commandes entre celles-ci) est en cours d’évaluation avant d’ être exécutée.

En d’autres termes, %count% est remplacé par sa valeur 1 avant d’exécuter la boucle.

Ce dont vous avez besoin est quelque chose comme:

 setlocal enableextensions enabledelayedexpansion set /a count = 1 for /f "tokens=*" %%a in (config.properties) do ( set /a count += 1 echo !count! ) endlocal 

Expansion retardée en utilisant ! au lieu de % vous donnera le comportement attendu. Voir aussi ici .


Gardez également à l’esprit que setlocal/endlocal limite réellement l’étendue des choses modifiées à l’intérieur afin qu’elles ne s’échappent pas. Si vous voulez utiliser count après le endlocal , vous devez utiliser un “truc” rendu possible par le problème que vous rencontrez:

 endlocal && set count=%count% 

Disons que le count est devenu 7 dans la scope interne. Comme toute la commande est interprétée avant son exécution, elle devient effectivement:

 endlocal && set count=7 

Ensuite, quand il est exécuté , la scope interne est fermée et le count renvoyé à sa valeur d’origine. Cependant, étant donné que le count à sept se situe dans le périmètre externe, les informations dont vous avez besoin sont effectivement perdues.

Vous pouvez enchaîner plusieurs sous-commandes pour obtenir autant d’informations que nécessaire:

 endlocal && set count=%count% && set something_else=%something_else% 

pour a = 1 à 100 étape 1

Ligne de commande sous Windows. Veuillez utiliser %% a si vous exécutez dans un fichier batch.

  for /L %a in (1,1,100) Do echo %a