web-dev-qa-db-fra.com

Comment incrémenter une variable DOS dans une boucle FOR / F?

J'essaie de lire les lignes de texte d'un fichier et d'incrémenter un compteur afin de pouvoir éventuellement simuler un tableau sous DOS.

Je voudrais pouvoir stocker les lignes de texte dans un tableau DOS pour un traitement ultérieur.

Ma tentative actuelle est:

set TEXT_T="myfile.txt"

set /a c=1

FOR /F "tokens=1 usebackq" %%i in (%TEXT_T%) do (
set /a c=c+1
echo %%i,  %c%
)

Mais la variable c n'est pas incrémentée; il reste à 1.

Suggestions bienvenues.

Merci, Mike

45
Mike

Le problème avec votre extrait de code est la façon dont les variables sont développées. L'expansion variable est généralement effectuée lors de la première lecture d'une instruction. Dans votre cas, toute la boucle FOR et son bloc sont lus et toutes les variables, à l'exception des variables de boucle, sont développées à leur valeur actuelle.

Ça signifie %c% dans votre echo %%i, %c% développé instantanément et est donc utilisé comme echo %%i, 1 dans chaque itération de boucle.

Vous avez donc besoin de l'expansion variable retardée. Trouvez une bonne explication à ce sujet ici .

Les variables qui doivent être étendues en retard sont référencées avec !VARIABLE! au lieu de %VARIABLE%. Mais vous devez activer cette fonction avec setlocal ENABLEDELAYEDEXPANSION et le réinitialiser avec un endlocal correspondant.

Votre code modifié ressemblerait à quelque chose comme ça:

set TEXT_T="myfile.txt"

set /a c=1

setlocal ENABLEDELAYEDEXPANSION

FOR /F "tokens=1 usebackq" %%i in (%TEXT_T%) do (
  set /a c=c+1

  echo %%i, !c!
)

endlocal
81
Frank Bollack

Je voudrais ajouter que si vous créez des variables locales dans la boucle, elles doivent également être développées en utilisant la notation bang (!). Extension de l'exemple à https://stackoverflow.com/a/2919699 ci-dessus, si nous voulons créer des noms de fichiers de sortie basés sur des compteurs

set TEXT_T="myfile.txt"

set /a c=1

setlocal ENABLEDELAYEDEXPANSION

FOR /F "tokens=1 usebackq" %%i in (%TEXT_T%) do (
    set /a c=c+1
    set OUTPUT_FILE_NAME=output_!c!.txt
    echo Output file is !OUTPUT_FILE_NAME!
    echo %%i, !c!
)

endlocal
5
curryage

Ou vous pouvez le faire sans utiliser le délai.

set /a "counter=0"

-> votre boucle ici

do (
   statement1
   statement2
   call :increaseby1
 )

:increaseby1
set /a "counter+=1"
3
Carlo Ponsones

Qu'en est-il de ce code simple, fonctionne pour moi et sur Windows 7

set cntr=1
:begin
echo %cntr%
set /a cntr=%cntr%+1
if %cntr% EQU 1000 goto end
goto begin

:end
0
Zonnevuur
set TEXT_T="myfile.txt"
set /a c=1

FOR /F "tokens=1 usebackq" %%i in (%TEXT_T%) do (
    set /a c+=1
    set OUTPUT_FILE_NAME=output_%c%.txt
    echo Output file is %OUTPUT_FILE_NAME%
    echo %%i, %c%
)
0
Shikhar Bhargava

Utilisation de Windows 7. Impossible d'obtenir le EnableDelayedExpansion pour faire son travail. J'ai deux fichiers de test appelés Test1.tst et Test2.tst. Je veux faire quelque chose avec seulement le premier. Les deux endroits où je le '!' n'est pas résolu à la valeur. Le dernier echo imprime zéro. Voici mon code:

set /a count1=0

setlocal EnableDelayedExpansion
for %%x in (*.tst) do (

  if !count1! GTR 0 goto :getout

  call :addit

  type %%x

  ren %%x *.xxx

)
@echo Almost done...
goto :alldone

:addit
set /a count1=%count1% + 1
@echo %count1%
goto :eof

:getout
@echo Getting out...
@echo !count!

:alldone
endlocal
0
user3461349