web-dev-qa-db-fra.com

Comptage dans une boucle FOR à l'aide du script Windows Batch

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%
)
29
djangofan

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%
57
paxdiablo

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 
17
sujith

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
0
Steve Hull