如何增加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.tst
和Test2.tst
testing文件。 我只想做第一件事。 两个地方我'!' 没有解决的价值。 最后一个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