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
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
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
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"
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
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%
)
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