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