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

j'essaie de lire les lignes de texte d'un fichier, et incrémenter un compteur pour éventuellement simuler un tableau sous DOS.

j'aimerais pouvoir stocker les lignes de texte dans un tableau DOS pour un traitement ultérieur.

Ma tentative 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 ne s'incrémente pas; elle reste à 1.

Suggestions de bienvenue.

Merci, Mike

39
demandé sur Mike 2010-05-26 17:13:42

6 réponses

le problème avec votre code snippet est la façon dont les variables sont développées. L'expansion de Variable est habituellement faite quand un énoncé est lu pour la première fois. Dans votre cas, l'ensemble de l' FOR la boucle et son bloc sont lus et toutes les variables, sauf les variables de boucle sont étendues à leur valeur actuelle.

cela signifie %c% dans votre echo %%i, %c% élargi instantanément et donc est en fait utilisé comme echo %%i, 1 dans chaque itération de boucle.

donc ce dont vous avez besoin est l'expansion de la variable retardée. Trouver quelques bonnes explication à ce sujet ici.

les Variables qui devraient être élargies sont référencées avec !VARIABLE! au lieu de %VARIABLE%. Mais vous devez activer cette fonction avec setlocal ENABLEDELAYEDEXPANSION et de le remettre à une mise en correspondance endlocal.

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
73
répondu Frank Bollack 2010-05-27 08:53:51

je voudrais ajouter que dans le cas où vous créez des variables locales dans la boucle, elles doivent être étendues en utilisant le bang (!) notation également. 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 le compteur

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
3
répondu curryage 2017-05-23 11:46:52
set /a "counter=0"

-> ta boucle for ici

do (
   statement1
   statement2
   call :increaseby1
 )

:increaseby1
set /a "counter+=1"
2
répondu Carlo Ponsones 2014-02-07 13:19:53
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
répondu Shikhar Bhargava 2014-01-13 13:30:55

Utiliser Windows 7. Ne pouvez pas obtenir le EnableDelayedExpansion pour faire sa chose. J'ai deux fichiers de test appelé Test1.tst et Test2.tst. Je veux faire quelque chose avec seulement le premier. Les deux endroits, j'ai l' '!'n'est pas réglée à 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
répondu user3461349 2014-03-25 19:49:11

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
répondu Zonnevuur 2014-11-18 14:58:23