Hoe verhoog ik een DOS-variabele in een FOR /F-lus?

Ik probeer tekstregels uit een bestand te lezen en een teller te verhogen zodat ik uiteindelijk een array in DOS kan simuleren.

Ik wil de regels tekst in een DOS-array kunnen opslaan voor verdere verwerking.

Mijn huidige poging is:

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

Maar de variabele c neemt niet toe; het blijft op 1.

Suggesties welkom.

Bedankt, Mike


Antwoord 1, autoriteit 100%

Het probleem met uw codefragment is de manier waarop variabelen worden uitgebreid. Variabele uitbreiding wordt meestal gedaan wanneer een verklaring voor het eerst wordt gelezen. In jouw geval wordt de hele FORlus en het blok gelezen en alle variabelen, behalve de lusvariabelen, worden uitgebreid tot hun huidige waarde.

Dit betekent dat %c%in uw echo %%i, %c%onmiddellijk wordt uitgebreid en dus feitelijk wordt gebruikt als echo %%i, 1in elke lus-iteratie.

Dus wat je nodig hebt is de vertraagde variabele expansie. Vind er hiereen goede uitleg over.

Variabelen die uitgesteld moeten worden, worden aangeduid met !VARIABLE!in plaats van %VARIABLE%. Maar je moet deze functie activeren met setlocal ENABLEDELAYEDEXPANSIONen resetten met een overeenkomende endlocal.

Uw gewijzigde code ziet er ongeveer zo uit:

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

Antwoord 2, autoriteit 6%

Ik zou willen toevoegen dat als je lokale variabelen binnen de lus maakt, ze ook moeten worden uitgebreid met de notatie bang(!). Uitbreiding van het voorbeeld op https://stackoverflow.com/a/2919699hierboven, als we op tellers gebaseerde uitvoerbestandsnamen willen maken

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

Antwoord 3, autoriteit 5%

Of je kunt dit doen zonder vertraging te gebruiken.

set /a "counter=0"

-> je for-lus hier

do (
   statement1
   statement2
   call :increaseby1
 )
:increaseby1
set /a "counter+=1"

Antwoord 4

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

Antwoord 5

Hoe zit het met deze eenvoudige code, werkt voor mij en op Windows 7

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

Other episodes