我正在尝试从文件中读取文本行,并递增计数器,以便最终在DOS中模拟数组。
我希望能够将文本行存储在DOS数组中以便进一步处理。
我目前的尝试是:
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%
)
但是变量c没有递增;它保持在1。
建议欢迎。
谢谢,迈克
答案 0 :(得分:79)
代码段的问题在于扩展变量的方式。变量扩展通常在首次读取语句时完成。在您的情况下,将读取整个FOR
循环及其块,并且除循环变量之外的所有变量都将扩展为其当前值。
这意味着%c%
中的echo %%i, %c%
会立即展开,因此在每次循环迭代中实际用作echo %%i, 1
。
所以你需要的是延迟变量扩展。找一些关于它的好解释here。
应延迟展开的变量以!VARIABLE!
而不是%VARIABLE%
引用。但您需要使用setlocal ENABLEDELAYEDEXPANSION
激活此功能,并使用匹配的endlocal
重置该功能。
您修改过的代码看起来像这样:
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
答案 1 :(得分:4)
我想补充一点,如果你在循环中创建局部变量,它们也需要使用bang(!)表示法进行扩展。如果我们想要创建基于计数器的输出文件名
,请在https://stackoverflow.com/a/2919699上方扩展示例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
答案 2 :(得分:3)
或者您可以在不使用延迟的情况下执行此操作。
set /a "counter=0"
- >你的循环在这里
do (
statement1
statement2
call :increaseby1
)
:increaseby1
set /a "counter+=1"
答案 3 :(得分:0)
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%
)
答案 4 :(得分:0)
使用Windows 7.无法让EnableDelayedExpansion
执行此操作。我有两个名为Test1.tst
和Test2.tst
的测试文件。我想只用第一个做点什么。这两个地方我是'!'没有解决价值。最后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
答案 5 :(得分:0)
这个简单的代码怎么样,适合我和Windows 7
set cntr=1
:begin
echo %cntr%
set /a cntr=%cntr%+1
if %cntr% EQU 1000 goto end
goto begin
:end