Windows批处理:for循环中的延迟扩展
我想修改一些特定的文本文件行,我编写了一个批处理文件,如下所示:Windows批处理:for循环中的延迟扩展,windows,batch-file,Windows,Batch File,我想修改一些特定的文本文件行,我编写了一个批处理文件,如下所示: @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%
@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代码>扩展通常不会延迟。这很奇怪,因为!瓦尔代码>扩展通常延迟
顺便说一句,setlocalenabledelayedexpansion
和endlocal
命令被放入for
循环中,否则特殊字符代码>将被放弃。我想你看到的问题是,n
永远不会增加
但这不是延迟扩展的问题,而是循环中setlocal/endlocal
块的影响。
正如@panda-34所提到的,您应该使用set/a
的扩展语法,并将语句移到setlocal/endlocal
块之外
@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
如果你能解释一下你想做什么以及到底什么不起作用,你获得帮助的机会就会大大提高。对于不起作用的部分,您应该解释预期结果并描述您看到的内容。我没有尝试分析您的代码,但您不应该使用set/a n+=1
而不是set/a n=!n+1
@panda-34-我更喜欢你建议的语法,但两者都应该起作用。但是延迟变量只能在setlocal/endlocal
块中起作用,并且在那里变量n
不能真正增加,问题正如你所说的,但是你的代码不起作用。@user1446072-正如我在前面的问题评论中所暗示的:如果我们不知道你的代码应该做什么,那么任何人都很难“修复”你的代码。jeb发现了一个重要的问题(+1),这是一个很好的发现,但是代码的预期行为仍然是一个谜。经过一些修改,问题已经解决了。关键是将语句set/a
移到setlocal/endlocal
块之外。谢谢大家!@德本纳姆:很抱歉,我没有把问题说清楚。我是windows批处理和这个论坛的新手,而且,我的英语不是很好。。。无论如何,谢谢大家!