如何增加FOR / F循环中的DOSvariables?

我试图从文件中读取文本行,并增加一个计数器,所以我最终可以在DOS中模拟一个数组。

我想能够将文本行存储在DOS数组中进行进一步处理。

我目前的尝试是:

set TEXT_T="myfile.txt" set /ac=1 FOR /F "tokens=1 usebackq" %%i in (%TEXT_T%) do ( set /ac=c+1 echo %%i, %c% ) 

但variablesc不是递增的; 它停留在1。

build议欢迎。

谢谢,迈克

你的代码片段的问题是variables被展开的方式。 variables扩展通常在首次读取语句时完成。 在你的情况下,整个FOR循环和它的块被读取,除了循环variables之外的所有variables都被扩展为它们的当前值。

这意味着你的echo %%i, %c%立即被扩展,所以在每次循环迭代中实际上被用作echo %%i, 1

所以你需要的是延迟variables扩展。 在这里find一些很好的解释。

应该延迟扩展的!VARIABLE!引用!VARIABLE! 而不是%VARIABLE% 。 但是你需要用setlocal ENABLEDELAYEDEXPANSION来激活这个特性,并用一个匹配的endlocal重置它。

你修改后的代码看起来像这样:

 set TEXT_T="myfile.txt" set /ac=1 setlocal ENABLEDELAYEDEXPANSION FOR /F "tokens=1 usebackq" %%i in (%TEXT_T%) do ( set /ac=c+1 echo %%i, !c! ) endlocal 

我想补充一点,如果你在循环中创build局部variables,它们也需要使用bang(!)符号来扩展。 如果我们要创build基于计数器的输出文件名, 请在上面的https://stackoverflow.com/a/2919699扩展示例;

 set TEXT_T="myfile.txt" set /ac=1 setlocal ENABLEDELAYEDEXPANSION FOR /F "tokens=1 usebackq" %%i in (%TEXT_T%) do ( set /ac=c+1 set OUTPUT_FILE_NAME=output_!c!.txt echo Output file is !OUTPUT_FILE_NAME! echo %%i, !c! ) endlocal 

或者你可以做到这一点,而不使用延迟。

 set /a "counter=0" 

– >你的循环在这里

 do ( statement1 statement2 call :increaseby1 ) :increaseby1 set /a "counter+=1" 
 set TEXT_T="myfile.txt" set /ac=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% ) 

使用Windows 7.不能让EnableDelayedExpansion做它的事情。 我有两个名为Test1.tstTest2.tsttesting文件。 我只想做第一件事。 两个地方我'!' 没有解决的价值。 最后一个echo打印为零。 这是我的代码:

 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 

这个简单的代码怎么样,适用于我和Windows 7

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