我正在尝试从文件中读取文本行,并增加一个计数器,这样我最终可以在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%
)
Run Code Online (Sandbox Code Playgroud)
但是变量c没有递增; 它保持在1.
建议欢迎.
谢谢,迈克
Fra*_*ack 83
代码片段的问题在于扩展变量的方式.变量扩展通常在首次读取语句时完成.在您的情况下,FOR读取整个循环及其块,并将除循环变量之外的所有变量扩展为其当前值.
这意味着%c%您echo %%i, %c%可以立即进行扩展,因此实际上echo %%i, 1在每次循环迭代中都会使用.
所以你需要的是延迟变量扩展.在这里找到一些很好的解释.
应该延迟扩展的变量用!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
Run Code Online (Sandbox Code Playgroud)
我想补充一点,以防万一,您在循环中创建局部变量时,也需要使用bang(!)表示法对其进行扩展。如果我们要创建基于计数器的输出文件名,请在上面的/sf/answers/204378961/上扩展示例
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
Run Code Online (Sandbox Code Playgroud)
小智 5
或者您可以在不使用延迟的情况下执行此操作。
set /a "counter=0"
Run Code Online (Sandbox Code Playgroud)
-> 你的 for 循环在这里
do (
statement1
statement2
call :increaseby1
)
:increaseby1
set /a "counter+=1"
Run Code Online (Sandbox Code Playgroud)