Quelqu'un peut-il expliquer cela? Je peux 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 portée:
SET /A COUNT=1
FOR /F "tokens=*" %%A IN (config.properties) DO (
SET /A COUNT+=1
ECHO %COUNT%
)
Cela ne fonctionne pas car la boucle entière for
(de for
à la dernière parenthèse fermante, incluant les commandes entre celles-ci) est en cours d'évaluation quand il est rencontré, avant qu'il commence à s'exécuter.
En d'autres termes, %count%
est remplacé par sa valeur 1
avant d'exécuter la boucle.
Vous avez besoin de 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 à l'aide de !
au lieu de %
vous donnera le comportement attendu. Voir aussi ici .
Gardez également à l'esprit que setlocal/endlocal
limite réellement la portée des choses modifiées à l'intérieur afin qu'elles ne fuient pas. Si vous voulez utiliser count
après le endlocal
, vous devez utiliser une "astuce" rendue possible par le très problème que vous rencontrez:
endlocal && set count=%count%
Disons que count
est devenu 7 dans la portée interne. Parce que l'intégralité de la commande est interprétée avant l'exécution, elle devient effectivement:
endlocal && set count=7
Ensuite, lorsqu'elle est exécutée , la portée interne est fermée, renvoyant count
à sa valeur d'origine. Mais, étant donné que le paramètre count
à sept se produit dans la portée externe, cela laisse effectivement fuir les informations dont vous avez besoin.
Vous pouvez enchaîner plusieurs sous-commandes pour divulguer 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
Voici un fichier batch qui génère toutes les adresses 10.x.x.x
@echo off
SET /A X=0
SET /A Y=0
SET /A Z=0
:loop
SET /A X+=1
echo 10.%X%.%Y%.%Z%
IF "%X%" == "256" (
GOTO end
) ELSE (
GOTO loop2
GOTO loop
)
:loop2
SET /A Y+=1
echo 10.%X%.%Y%.%Z%
IF "%Y%" == "256" (
SET /A Y=0
GOTO loop
) ELSE (
GOTO loop3
GOTO loop2
)
:loop3
SET /A Z+=1
echo 10.%X%.%Y%.%Z%
IF "%Z%" == "255" (
SET /A Z=0
GOTO loop2
) ELSE (
GOTO loop3
)
:end