我想修改文本文件中特定的几行数字,我写了一个批处理文件如下:
@echo off
set n=0
set n1=10
set n2=40
cd.>output.txt
for /f "delims=" %%i in ('findstr /n .* test.txt') do (
set "var=%%i"
setlocal enabledelayedexpansion
set /a n=!n!+1
echo.!n!
set var=!var:*:=!
rem if !n!=%n1% ...
rem if !n!=%n2% ...
(echo.!var!)>>output.txt
endlocal
)
start output.txt
但是,这并没有按预期工作。
经过一些测试,我认为 !n!
扩展通常不会延迟。这很奇怪,因为 !var!
扩展通常会延迟。
顺便说一句,setlocalenabledelayedexpansion
和endlocal
命令被放入for
循环中,因为否则特殊字符!
将被放弃。
最佳答案
我想你看到的问题是n
永远不会增加。
但这不是延迟扩展的问题,而是循环内 setlocal/endlocal
block 的影响。
正如 @panda-34 提到的,您应该使用 set/a
的扩展语法并将语句移到 setlocal/endlocal
block 之外。
@echo off
set n=0
set n1=10
set n2=40
(
for /f "delims=" %%i in ('findstr /n .* test.txt') do (
set "var=%%i"
set /a n+=1
setlocal enabledelayedexpansion
echo !n!
set var=!var:*:=!
rem if !n!=%n1% ...
rem if !n!=%n2% ...
(echo(!var!)
endlocal
)
) >output.txt
start output.txt
关于Windows 批处理 : delayed expansion in a for loop,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10960467/