How do I increment a DOS variable in a FOR /F loop?

后端 未结 5 1625
后悔当初
后悔当初 2020-12-13 00:02

I\'m trying to read text lines from a file, and increment a counter so I can eventually simulate an array in DOS.

I\'d like to be able to store the lines of text in

相关标签:
5条回答
  • 2020-12-13 00:19

    Or you can do this without using Delay.

    set /a "counter=0"
    

    -> your for loop here

    do (
       statement1
       statement2
       call :increaseby1
     )
    
    :increaseby1
    set /a "counter+=1"
    
    0 讨论(0)
  • 2020-12-13 00:19

    What about this simple code, works for me and on Windows 7

    set cntr=1
    :begin
    echo %cntr%
    set /a cntr=%cntr%+1
    if %cntr% EQU 1000 goto end
    goto begin
    
    :end
    
    0 讨论(0)
  • 2020-12-13 00:28
    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 讨论(0)
  • 2020-12-13 00:39

    The problem with your code snippet is the way variables are expanded. Variable expansion is usually done when a statement is first read. In your case the whole FOR loop and its block is read and all variables, except the loop variables are expanded to their current value.

    This means %c% in your echo %%i, %c% expanded instantly and so is actually used as echo %%i, 1 in each loop iteration.

    So what you need is the delayed variable expansion. Find some good explanation about it here.

    Variables that should be delay expanded are referenced with !VARIABLE! instead of %VARIABLE%. But you need to activate this feature with setlocal ENABLEDELAYEDEXPANSION and reset it with a matching endlocal.

    Your modified code would look something like that:

    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
    
    0 讨论(0)
  • 2020-12-13 00:39

    I would like to add that in case in you create local variables within the loop, they need to be expanded using the bang(!) notation as well. Extending the example at https://stackoverflow.com/a/2919699 above, if we want to create counter-based output filenames

    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
    
    0 讨论(0)
提交回复
热议问题