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
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
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
set /a "counter=0"
-> ta boucle for ici
do (
statement1
statement2
call :increaseby1
)
:increaseby1
set /a "counter+=1"
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%
)
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
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